一、Docker容器简介¶
容器是镜像的运行实例。单个镜像可以启动一个或多个容器。同时容器会共享其所在主机的操作系统/内核。
二、Docker容器详解¶
2.1 容器VS虚拟机¶
2.1.1 相同点¶
1、容器和虚拟机都依赖虚拟机才能运行;
2.1.2 不同点¶
1、Hypervisor是硬件虚拟化,将硬件物理资源划分为虚拟资源;容器是操作系统虚拟化,将系统资源划分为虚拟资源; 2、虚拟机模型是将底层硬件资源划分到虚拟机,操作系统本身是有其额外开销的,占用一定的资源;容器模型具有在宿主机操作系统运行的单个内核,只有一份OS消耗; 3、启动时间不同。容器不是完整的操作系统,启动要比虚拟机块;虚拟机是完整的操作系统,启动相对容器要慢;
2.2 容器生命周期¶
下面以实例介绍说明容器具有持久性。 1、执行docker container run --name percy -it ubuntu:latest /bin/bash命令新建名为percy的容器并启动。其中-it参数是用来告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器终端,并运行Bash Shell作为其应用。
root@zq-virtual-machine:~# docker container run --name percy -it ubuntu:latest /bin/bash
2、在/tmp目录上新建名为newfile文件,并添加"DevOps FTW"内容到该文件。
root@f18ac2b1266e:/# cd /tmp
root@f18ac2b1266e:/tmp# ll
total 8
drwxrwxrwt 2 root root 4096 Aug 15 11:53 ./
drwxr-xr-x 17 root root 4096 Oct 4 10:00 ../
root@f18ac2b1266e:/tmp# echo "DevOps FTW" > newfile
root@f18ac2b1266e:/tmp# ll
total 12
drwxrwxrwt 2 root root 4096 Oct 4 10:02 ./
drwxr-xr-x 17 root root 4096 Oct 4 10:00 ../
-rw-r--r-- 1 root root 11 Oct 4 10:02 newfile
root@f18ac2b1266e:/tmp# cat newfile
DevOps FTW
3、按Ctrl+PQ键退出容器。 4、执行docker container stop percy命令停止容器,并查看容器状态。观察到没有在用容器。
root@zq-virtual-machine:~# docker container stop percy
percy
root@zq-virtual-machine:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5、执行docker container ls -a命令查看全部容器状态(包括不在用的)。
root@zq-virtual-machine:~# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f18ac2b1266e ubuntu:latest "/bin/bash" 2 minutes ago Exited (137) 15 seconds ago percy
6、执行docker container start percy命令启动容器,并查看之前创建的文件内容。这里观察到,文件内容依然存在,说明容器具有持久性。
root@zq-virtual-machine:~# docker container start percy
percy
root@zq-virtual-machine:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f18ac2b1266e ubuntu:latest "/bin/bash" 3 minutes ago Up 19 seconds percy
root@zq-virtual-machine:~# docker container exec -it percy bash
root@f18ac2b1266e:/# cat /tmp/newfile
DevOps FTW
2.3 利用重启策略进行容器的自我修复¶
重启策略应用于每个容器,可以作为参数被强制传入docker container run命令中。容器支持的重启策略包括always、unless-stopped和on-failed。
always策略:一种简单的方式,除非容器被明确禁止,否则该策略会一直尝试重启处于停止状态的容器。 unless-stopped策略:指定了--restart unless-stopped策略后,处于Stopped(Exited)状态的容器不会在Docker daemon重启的时候被重启。 on-failed策略:会在退出容器并且返回值不是0的时候,重启容器。即使容器处于stopped状态,在docker daemon重启的时候,容器也会被重启。
三、Docker容器相关操作¶
3.1 启动容器¶
1、执行docker container run -it ubuntu:latest /bin/bash命令启动容器。其中-it参数是用来告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器终端,并运行Bash Shell作为其应用。
root@zq-virtual-machine:~# docker container run -it ubuntu:latest /bin/bash
root@19aa9b16e05f:/#
2、执行ps -elf命令查看当前正在运行的全部进程。
root@19aa9b16e05f:/# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 1156 do_wai 01:21 pts/0 00:00:00 /bin/bash
0 R root 9 1 0 80 0 - 1765 - 01:24 pts/0 00:00:00 ps -elf
说明:命令输出中展示的ps-elf进程存在一定的误导,因为这个程序在ps命令退出后就结束了。
3、针对以上进程进行说明如下
| 进程 | 代表进程 | 进程说明 | |---|---| | PID 1 | /bin/bash | 该进程通过docker container run命令来通知容器运行的 | | PID 9 | ps -elf | 查看当前运行中进程所使用的命令/程序 |
3.2 退出容器¶
1、按Ctrl+PQ键退出容器。
root@19aa9b16e05f:/# root@zq-virtual-machine:~#
root@zq-virtual-machine:~#
3.3 连接到运行中的容器¶
1、执行docker container ls命令查看Docker主机上运行中容器名称。这里观察到容器名称为suspicious_black和elated_kare。
root@zq-virtual-machine:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a80744307532 ubuntu:latest "/bin/bash" 2 minutes ago Up 2 minutes suspicious_black
19aa9b16e05f ubuntu:latest "/bin/bash" 20 minutes ago Up 20 minutes elated_kare
2、执行docker container exec -it suspicious_black bash命令将Shell连接到一个运行中的容器终端。这里以suspicious_black为例。观察到,连接成功。
root@zq-virtual-machine:~# docker container exec -it suspicious_black bash
root@a80744307532:/#
3、按Ctrl+PQ键退出容器。
root@a80744307532:/# read escape sequence
root@zq-virtual-machine:~#
3.4 停止并杀死容器¶
1、执行docker container stop suspicious_black命令停止容器。
root@zq-virtual-machine:~# docker container stop suspicious_black
suspicious_black
2、执行docker container rm suspicious_black命令杀死容器。
root@zq-virtual-machine:~# docker container rm suspicious_black
suspicious_black
3、执行docker container ls -a命令查看Docker所有容器(包括停止状态的)。其中-a参数的作用是让Docker列出所有的,包括不在运行状态的。
root@zq-virtual-machine:~# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.5 直接杀死容器¶
1、执行docker container rm percy -f命令直接杀死容器。
root@zq-virtual-machine:~# docker container rm percy -f
percy
2、执行docker container rm $(docker container ls -aq) -f命令直接杀死全部容器(包括不在用的)。其中-a参数代表全部,-q参数代表仅显示容器 ID。
root@zq-virtual-machine:~# docker container rm $(docker container ls -aq) -f
98cf414f8e0d
3.6 不同重启策略实现容器自我修复¶
3.6.1 always策略¶
1、执行docker container run --name neversaydie -it --restart always alpine sh命令创建名为neversaydie的容器,其中-it参数是用来告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器终端。--restart always指定重启策略为always策略。
root@zq-virtual-machine:~# docker container run --name neversaydie -it --restart always alpine sh
2、等待几秒后输入exit命令。
/ #
/ # exit
3、执行docker container ls命令查看容器信息,观察到,容器创建时间为23秒前,但却在9s前启动,这是因为在容器输入退出命令后,容器被杀死后docker又重启了该容器。
root@zq-virtual-machine:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06bb3d0eccb4 alpine "sh" 23 seconds ago Up 9 seconds neversaydie
3.6.2 unless-stopped策略¶
1、执行命令分别创建两个名为always和unless-stopped的新容器。
root@zq-virtual-machine:~# docker container run -d --name always --restart unless-stopped alpine sleep 1d
root@zq-virtual-machine:~# docker container run -d --name unless-stopped --restart unless-stopped alpine sleep 1d
root@zq-virtual-machine:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e6dbeb1a598 alpine "sleep 1d" 10 seconds ago Up 9 seconds unless-stopped
ec0cca8a3bd7 alpine "sleep 1d" About a minute ago Up About a minute always
2、执行docker container stop always unless-stopped always命令停止两个容器。
root@zq-virtual-machine:~# docker container stop always unless-stopped
always
unless-stopped
3、执行systemctl restart docker命令重启docker。
root@zq-virtual-machine:~# systemctl restart docker
4、Docker重启成功后,执行docker container ls -a命令检查两个容器状态。观察到启动时指定--restart unless-stopped没有重启。
root@zq-virtual-machine:~# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e6dbeb1a598 alpine "sleep 1d" 2 minutes ago Exited (137) 50 seconds ago unless-stopped
ec0cca8a3bd7 alpine "sleep 1d" 3 minutes ago Up 5 seconds always
3.7 显示容器配置细节和运行信息¶
1、执行docker container inspect命令显示容器配置细节和运行信息。
root@zq-virtual-machine:~# docker container inspect