- CKA/CKAD应试教程:从Docker到Kubernetes完全攻略
- 段超飞编著
- 2224字
- 2025-03-17 18:51:29
1.5 容器的管理
【必知必会】创建及删除容器,了解容器的生命周期。
容器就是镜像在物理机上运行的一个实例,可以把容器理解为一个气球,气球里运行了一个进程,这个进程透过气球吸收物理机的内存和CPU资源。
查看当前有多少个正在运行的容器。

这个命令显示的仅仅是正在运行的容器,如果要查看所有的(正在运行的和没有运行的)容器,则使用docker ps -a命令,这里需要加上-a选项表示所有的。
在nerdctl里查看容器,如果要查看所有的容器,则使用nerdctl ps -a命令。

1.5.1 创建容器
运行一个最简单的容器。

以上命令在vms101上同样可以执行,只需把Docker命令换成nerdctl即可。
可以看到,已经创建出了一个容器,容器的ID为bfa8fa89f288,容器名是随机产生的名称,为confident_curie,所使用的镜像是hub.c.163.com/library/centos,容器里运行的进程为/bin/bash(也就是镜像里CMD指定的)。
docker ps看不到,docker ps -a能看到,且状态为Exited,说明容器是关闭状态。容器运行的一瞬间就关闭了,为什么?下面来了解一下容器的生命周期问题。
1.5.2 容器的生命周期
我们把容器理解为人的肉体,里面运行的进程理解为人的灵魂。如果人的灵魂宕机了,则肉体也就宕掉了,只有灵魂正常运行,肉体才能正常运行,如图1-14所示。

图1-14 容器和进程之间的关系
同理,只有容器里的进程正常运行,容器才能正常运行,容器里的进程挂掉了,则容器也就挂掉了。因为没有终端的存在,/bin/bash就像执行ls命令一样一下就执行完了,所以容器的生命周期也就结束了。
如果把这个bash附着到一个终端上,这个终端一直存在,则bash就一直存在,那么是不是容器就能一直存活了呢?
删除容器的语法如下。

如果删除正在运行的容器,可以使用-f选项。

删除刚才的容器。

重新创建容器,加上-i -t选项,可以写作-it或-i -t。
(1)-t:模拟一个终端。
(2)-i:可以让用户进行交互,否则用户看到一个提示符之后就卡住不动了。
第1步 创建一个容器。

创建出容器之后会自动进入容器里,可以通过exit退出容器。

但是,一旦通过exit退出容器,容器就不再运行了。
第2步 删除此容器。

上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。
如果希望创建好容器之后不自动进入容器里,可以加上-d选项。
第3步 再次创建一个容器。

因为加了-d选项,所以创建好容器之后并没有自动进入容器里。
注意
在nerdctl里-d和-i不能同时使用,否则会报错,写成如下形式即可。
上面的命令里,容器的ID是4aa86357a3df,进入容器里。

可以看到,只要退出来,容器就会自动关闭。
第4步 删除此容器。

在运行容器时加上--restart=always选项,可以解决退出容器自动关闭的问题。
第5步 创建容器,增加--restart=always选项。

进入容器里并退出。

可以看到,容器依然是存活的。
第6步 删除此容器。

因为容器是活跃的,所以无法直接删除,需要加上-f选项。

每次删除容器时都使用容器ID的方式比较麻烦,在创建容器时可以使用--name指定容器名。
第7步 创建容器,使用--name指定容器的名称。

这样容器的名称为c1,以后管理起来比较方便,比如切换到容器,然后退出。

第8步 删除此容器。

1.5.3 创建临时容器
如果要临时创建一个测试容器,又怕用完忘记删除它,可以加上--rm选项。
创建临时容器。

在创建容器时加了--rm选项,退出容器之后,容器会被自动删除。

可以看到,此容器被自动删除了,注意--rm和--restart=always不可以同时使用。
上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。
1.5.4 指定容器里运行的命令
前面在创建容器时,容器里运行的进程是由镜像里的CMD定义好的,关于如何构建镜像,后面有专门章节详细讲解。如果想自定义容器里运行的进程,可以在创建容器的命令最后面指定,比如:


这里就是以sh方式运行,而不是以bash方式运行的。
在容器里运行sleep 10。

容器里运行的命令是sleep 10,10秒之后命令结束,则容器也会关闭,此时容器的生命周期也就是10秒。
注意
此时容器里运行的是sleep 10,不是bash或sh,所以如果执行docker attach c1命令会卡住,因为想要看到提示符,必须保证bash或sh运行才行,而此时在容器里根本没有bash或sh运行。
上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。
1.5.5 创建容器时使用变量
在使用一些镜像创建容器时需要传递变量,比如在使用MySQL镜像、WordPress镜像创建容器时,都需要通过变量来指定一些必备的信息。使用-e选项来指定变量,可以多次使用-e选项来指定多个变量。
创建一个容器c1,里面传递两个变量。

在创建容器时,通过-e选项指定了两个变量aa和bb,进入容器里可以看到有这两个变量。
上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。
1.5.6 把容器的端口映射到物理机上
外部主机(本机之外的其他主机)是不能和容器进行通信的,如果希望外部主机能访问到容器的内容,就需要使用-p选项把容器的端口映射到物理机上,以后访问物理机对应的端口就可以访问到容器了,如图1-15所示。

图1-15 把容器的端口映射到物理机上
语法如下。
(1)-p N:物理机随机生成一个端口映射到容器的端口N上。
(2)-p M:N:把容器的端口N映射到物理机指定的端口M上。
第1步 创建一个容器,把容器的端口80映射到物理机的一个随机端口上。

这里把容器web的端口80映射到物理机的随机端口上,这个端口号可以通过如下命令来查询。
第2步 查询容器映射到物理机的端口。

或者通过如下命令来查看。

可以看到,映射到物理机的端口32770上了,访问物理机的端口32770,即可访问到web容器,如图1-16所示。

图1-16 访问物理机的端口32770
第3步 删除此容器。

如果想映射到物理机指定的端口上,请使用如下命令。
第4步 把容器的端口映射到物理机指定的端口上。

此处把容器的端口80映射到物理机的端口88上(可以自行指定端口,比如80),那么访问物理机的端口88即可访问到web容器的端口80,如图1-17所示。

图1-17 访问物理机的端口88
第5步 删除此容器。

上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。