如果想要充分使用好容器,那么掌握容器的生命周期管理是必须的,这其中包括创建、启动、停止和删除容器等操作。

在本文中,我们将深入探讨与容器管理相关的主要命令,帮助你更好地管理容器。

一. 创建容器

创建新的容器可以使用docker run 命令,该命令会创建一个容器并启动运行。

如:

$ docker run nginx:1.21

docker run 命令带有非常多的参数项,在实际应用中,我们可以根据需要使用对应的参数进行启动。

1. 更改镜像的默认启动命令

在命令最后加上需要执行的命令,此时新命令将覆盖原有镜像中的启动命令。

$ docker run centos echo 'Hello World'
Hello World

注:如果镜像是用ENTRYPOINT指令启动的话,那么新的命令只会做为参数加到原有命令后面。

2. 后台运行容器

通常而言,我们会将提供服务的容器在后台以守护进程的方式运行,这样可以避免当我们退出当前终端时,容器运行终止。通过添加 -d 参数即可实现。

如下:

$ docker run  -d nginx:1.21

3. 命名容器

在启动容器时,Docker 会为容器分配一个随机的名称,为了方便辨识,我们可以用--name 选项指定容器的名称。

$ docker run  -d --name web nginx:1.21

注:名称必须在宿主机中唯一,否则会出现报错提示。

4. 开放网络端口

如果需要通过网络访问容器服务,那么可通过添加 -p 参数将容器端口与本机绑定。

如下:

$ docker run  -d  -p 80:80 nginx:1.21

注:第一个80代表本机端口,第二个指定容器端口。

在将端口绑定后,此时在浏览器中通过主机IP直接访问80端口,即可访问nginx容器。

假如本机有多张网卡,但只需要在其中一张网卡上映射端口的话,可以在端口前指定网卡IP地址。

如:

$ docker run  -d  -p 192.168.10.20:80:80 nginx:1.21

你甚至还可以指定协议

$ docker run  -d  -p 192.168.10.20:80:80/tcp nginx:1.21

5. 目录挂载

在容器被删除后,容器里面保存的数据也会跟着一起被清理。如果想将数据持久化,可以使用 -v 的参数。该命令会将容器中的目录挂载到本机存储卷中。

如下:

$ docker run  -d  -p 80:80 -v /data/nginx:/data/nginx nginx:1.21

注:前面的/data/nginx为本机目录,后面为容器目录。

二. 查看容器

1. 查看容器状态

执行docker ps docker container ls 命令,可以查看当前正在运行中的容器。

$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS     NAMES
dca4193d0509   nginx:1.21   "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   80/tcp    cool_mendeleev

注:CONTAINER ID为容器的短ID号;IMAGE为该容器使用的镜像;COMMAND显示容器执行的命令;CREATED为创建时间;STATUS为容器状态;PORTS显示映射的端口号;NAMES为容器名称。

如果要查看所有容器,则需要加上 -a 选项,此时会显示包括已退出的容器在内的完整列表。

$ docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS                       PORTS     NAMES
b2cdebf18464   nginx:1.21   "/docker-entrypoint.…"   9 minutes ago    Exited (127) 9 minutes ago             boring_leakey
dca4193d0509   nginx:1.21   "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes                80/tcp    cool_mendeleev

2. 查看容器详情

使用docker container inspect 命令,可以查看指定容器的详细信息。

命令支持使用容器名称或ID号指定,结果将以Json格式返回,包括容器id、创建时间、镜像、配置等信息。

如下:

$ docker container inspect b2cdebf1846
[
    {
        "Id": "b2cdebf184644afbf9c2d3cddba1dc632eb7bf990766c4a548585512b04b88ca",
        "Created": "2022-04-22T11:58:59.155528401Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
......

3. 查看容器进程 

要查看容器内进程情况,可以使用docker top 命令,输出包括PID、启动命令等基本信息。

$ docker container top cool_mendeleev
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7494                7475                0                   07:58               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 7545                7494                0                   07:58               ?                   00:00:00            nginx: worker process
101                 7546                7494                0                   07:58               ?                   00:00:00            nginx: worker process

4. 查看容器资源情况 

docker stats 可用于查看容器的资源使用情况,如CPU、内存、网络等信息。

$  docker stats cool_mendeleev
CONTAINER ID   NAME             CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O     PIDS
dca4193d0509   cool_mendeleev   0.00%     20.06MiB / 1.777GiB   1.10%     9.7MB / 148kB   0B / 8.61MB   3

三. 进入容器

有时你可能需要进入正在运行的容器以执行特定命令或调试问题。使用docker exec 命令,你可以在运行的容器中启动一个新的进程。

格式如下:

docker exec [参数选项] <container_name> <bash>

示例:

$ docker exec -it cool_mendeleev bash
root@dca4193d0509:/#

Docker的exec命令用于在运行的容器中执行命令,比较重要的参数有:

  • -d, --detach:在容器中后台执行命令;
  • --privileged=true|false:是否给执行命令以高权限,默认值为false;
  •  -i, --interactive=true|false:打开标准输入接受用户输入命令,默认值为false;
  • -t, --tty=true|false:分配伪终端,默认值为false;

四. 启动/停止容器

Docker支持启动/停止/重启几个操作,对应的命令选项分别为docker start/stop/restart + <container_name>

$ docker start cool_mendeleev  #启动
$ docker stop cool_mendeleev   #退出
$ docker restart cool_mendeleev #重启
$ docker pause cool_mendeleev   #暂停

在使用stop命令停止容器时,该命令并不是直接关掉容器,而是先向它发送SIGTERM 信号,要求程序正常退出。在等待超时后(默认为10秒),会再发送SIGKILL信号来终止容器。

如果希望立即杀死容器进程,则可以使用docker kill <container_name> 命令操作。

五. 删除容器

在容器不需要使用时,我们可以用stop 命令将其停止,这样不会占用机器的CPU和内存资源。但在容器停止后,依然会占用宿主机的存储空间,如果确定后续不再使用,我们可以用docker  rm  将其删除。

如下:

$ docker rm cool_mendeleev

rm命令可同时删除多个容器,删除前请先确认容器已经停上,否则会有报错提示。使用 -f 参数可以强行删除运行中的容器,但不建议这样操作。

docker container prune 命令也可以用于清理容器,它的好处是不需要指定容器。在运行命令后会清理所有已经停止的容器,并在执行完成后汇报回收空间大小。

$ docker container prune 
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
9477c87afadf810f24a46d356b8eb3995756f8adcc3f1ac4ad6f15812e9302a2
77f5a301bf079419cafd81e7c5be5f69a7ccf6e8158d98747752f03d357f955c

Total reclaimed space: 2.186kB

六. 结语

容器生命周期管理在容器化环境中至关重要,无论是在本地开发环境还是在生产部署中,这些命令都是不可或缺的。这些实践将有助于使容器生命周期管理更加高效和可维护。

相信在不断的学习和实践中,你将更好地掌握这些关键命令,并成为容器方面的专家。