docker(一)

什么是容器

容器就是在隔离的环境里面执行的命令产生的一个进程, 如果进程停止, 容器就会销毁。

容器运行的隔离环境有系统文件,ip地址, 主机名等。


容器和虚拟化的区别


kvm虚拟化

需要硬件的支持, 需要模拟硬件(CPU, 网卡, 内存等), 可以运行不同的操作系统, 启动时间分钟级(走开机启动流程)


linux开机启动流程

  • bios开机自检
  • 根据bios设置的启动项(光盘,本地硬盘)来启动设备
  • 读取启动设备的引导分区(mbr), 根据引导分区的配置路径启动内核
  • 加载内核
  • 启动第一个进程 (centos6: /sbin/init, centos7: /usr/lib/systemd/systemd)

容器虚拟化

不需要硬件的支持, 不需要模拟硬件, 共用宿主机的内核, 启动时间秒级(直接就跳到开机启动流程的加载内核开始-启动第一个进程)


容器相对于kvm的优势

  • 容器启动速度快
  • 性能高
  • 资源消耗少

容器的弱点

  • 只能使用linux的系统

使用chroot监狱限制ssh用户访问制定目录和使用制定命令

https://linux.cn/article-8313-1.html


docker容器

docker是通过内核虚拟化技术(namespace和cgroups)

namespace: 提供隔离环境(独立的系统文件, ip地址, 主机名)

cgroups: 限制进程资源的使用(多少内存, 多少CPU, 硬盘的读写)


docker的主要目标是构建,传输, 处处运行

所以 docker又叫是一种软件的打包技术


  • 构建

    做一个docker镜像

  • 运输

    docker pull

  • 运行

    启动一个容器

每一个容器都有自己的系统文件 rootfs


docker安装

https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/


  • 更换成阿里云的基础yum仓库

https://developer.aliyun.com/mirror

$  mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
$  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

  • 下载docker源
$  wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

  • 把软件仓库地址替换为 TUNA
$  sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

  • 安装
$  yum makecache fast
$  yum install docker-ce

  • 启动服务
$  systemctl start docker
$  systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to 

docker组件

docker主要组件有: 镜像, 容器, 仓库

镜像是一个模板, 容器就是基于模板做的链接克隆, 仓库中存储镜像

容器----镜像----仓库


docker安装nginx

  • 配置docker镜像加速
$  vim /etc/docker/daemon.json
 {
  "registry-mirrors": ["https://registry.docker-cn.com"]

}
$  systemctl restart docker

  • 安装nginx
$  docker run -d -p 80:80 nginx

  • 启动nginx
$  docker run -d -p 80:80 nginx
c1c07622a1956eb52a6c59b4756baf928def2c84afb44f19ab810ab3f1d9adfe

docker的镜像管理


search  搜索镜像
pull	下载镜像
list	查看镜像列表
save	导出镜像
load	导入镜像
rmi		删除镜像
inspect	查看镜像属性

搜索镜像

docker search <镜像名>

$ docker search zabbix

获得镜像

docker pull (push)

镜像加速器: 阿里云加速器, daocloud加速器, 中科大加速器, docker中国官方加速器(https://registry.docker-cn.com

  • 获取默认仓库镜像
$ docker pull centos:6.8

$ docker login daocloud.io
$ docker pull daocloud.io/library/tomcat:8.0.45-jre7

查看镜像

$ docker image ls
$ docker images

删除镜像

$ docker image rm centos:6.8
$ docker rmi alpine:latest

导出镜像

$ docker save nginx:latest > docker_nginx.tar.gz

导入镜像

$ docker image load -i docker_nginx.tar.gz

docker容器管理

run		创建并启动一个容器
stop	停止容器
kill	杀死容器
ps		查看容器列表
start	启动容器
rm		删除容器
exec	进入容器
inspect	查看容器属性

创建并运行一个容器

$ docker run -d -p 80:80 nginx

参数解释

run  创建并运行一个容器
-d  放在后台
-p  端口映射
nginx   docker镜像的名字

创建并运行一个容器并分配一个可交互式的终端

$ docker run -it --name centos6 centos:6.9 /bin/bash

参数解释

-it  分配交互式终端
--name  指定容器的名字
/bin/bash  覆盖容器的初始命令

容器的启动和停止

  • 查看正在运行的容器
$ docker ps

  • 查看所有容器
$ docker ps -a

  • 停止容器
$ docker stop zen_poincare

  • 杀死容器
$ docker kill zen_poincare

  • 启动容器
$ docker start zen_poincare

删除容器

$ docker rm romantic_hertz
$ docker rm 56be582f3d06

批量删除容器

$ docker ps -a -q
e65225739c98
806e34c28fd1
47e837a4d0c5
cf41a5216d0f
69a6bcef55f2
2dc5e5fcacb7
c1c07622a195
b3d165f8fabb
49dc5c719043

$ docker rm `docker ps -a -q`

进入容器

  • docker attach <容器id>
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3e1ed93fe4fd        centos:6.9          "/bin/bash"         10 seconds ago      Up 10 seconds                           pedantic_banzai
$ docker attach 3e1ed93fe4fd
[root@3e1ed93fe4fd /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 11:51 pts/0    00:00:00 /bin/bash
root         13      1  0 11:52 pts/0    00:00:00 ps -ef

ctrl+p, 松手, ctrl+q, 暂时退出容器, 容器不会停止, 只是退出当前终端, 如果使用ctrl+d退出容器, 则容器就会停止


  • docker exec -it <容器id> <初始命令>
$ docker exec -it 3e1ed93fe4fd /bin/bash
$ ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 11:51 pts/0    00:00:00 /bin/bash
root         15      0  0 11:58 pts/1    00:00:00 /bin/bash
root         26     15  0 11:58 pts/1    00:00:00 ps -ef

这个方法使用ctrl+d退出容器, 则容器不会停止


注意

docker容器内的第一个进程必须一致处于前台运行的状态(必须夯住), 否则这个容器, 就会处于退出状态


错误例子

$ docker run -d centos:6.9 /bin/bash
$ docker run centos:6.9 /bin/bash
$ docker run -it centos:6.9 sleep 20
$ docker run -it centos:6.9 pwd

查看容器是否运行

docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
21bc7b582e7f        centos:6.9          "/bin/bash"         12 seconds ago      Exited (0) 12 seconds ago                       sharp_allen
bcb9e2683fce        centos:6.9          "/bin/bash"         30 seconds ago      Exited (0) 30 seconds ago                       festive_maxwell
b26595453064        centos:6.9          "sleep 20"          14 minutes ago      Exited (0) 14 minutes ago                       intelligent_swirles
36af735df051        centos:6.9          "pwd"               14 minutes ago      Exited (0) 14 minutes ago                       suspicious_robinson

docker的数据卷管理

上传自己的代码到容器的nginx的目录

$ mkdir -p /opt/nginx/
$ cat >> /opt/nginx/index.html<<EOF
> test
> EOF

$ docker rm -f `docker ps -a -q`

  • docker run -d -p 80:80 -v src(宿主机目录):dst(容器的目录) nginx:latest
$ docker run -d -p 80:80 -v /opt/nginx:/usr/share/nginx/html nginx:latest

如果要修改网络内容, 在宿主机上改就行了


  • docker run -d -p 81:80 --volumes-from <容器名> nginx:latest
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
572504d4ca37        nginx:latest        "nginx -g 'daemon of…"   11 minutes ago      Up 11 minutes       0.0.0.0:80->80/tcp   blissful_mendeleev

$ docker run -d -p 81:80 --volumes-from blissful_mendeleev nginx:latest
60e457b7c1d7d06b060211454bbe67d7e619e6ef69b46248b3cae3e20b7a3a1e

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
60e457b7c1d7        nginx:latest        "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        0.0.0.0:81->80/tcp   quirky_curie
572504d4ca37        nginx:latest        "nginx -g 'daemon of…"   15 minutes ago      Up 15 minutes       0.0.0.0:80->80/tcp   blissful_mendeleev


基于nginx启动一个容器, 监听80和81, 访问80, 出现nginx默认的欢迎首页, 访问81, 出现test

  • 宿主机上准备配置文件
$ cat >> /opt/nginx/index.html<<EOF
> test
> EOF

$ cat >> /opt/nginx.conf<<EOF
> server {
>     listen       81;
>     server_name  localhost;
> 
>     location / {
>         root   /opt/nginx;
>         index  index.html index.htm;
>     }
>     }
> EOF

  • 删除镜像并创建新镜像
$ docker rm -f `docker ps -a -q`

  • 启动新容器
$ docker run -d -p 80:80 -p 81:81 -v /opt/nginx.conf:/etc/nginx/conf.d/nginx.conf -v /opt/nginx:/opt/nginx nginx:latest


posted @ 2019-11-26 20:25  cjw1219  阅读(413)  评论(0编辑  收藏  举报