一、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