Docker 容器生命周期管理命令详解

本文以典型场景串联 Docker 容器生命周期管理命令,涵盖创建、启动、停止、重启、删除等操作,提供判断过程、操作步骤与常见误区,帮助你高效管理容器。

Docker 容器生命周期管理命令详解
封面图:ZuCDN · ZuCDN 原创

Docker 容器生命周期管理是日常运维的核心技能。无论你是刚接触容器的新手,还是正在排查生产环境问题的工程师,都会频繁使用 Docker 容器 的创建、启动、停止、重启和删除命令。本文将以典型场景串联步骤,帮你建立清晰的判断过程,避免踩坑。

场景一:创建并启动一个容器

最常见的需求是运行一个 Nginx 服务。你可能会直接执行 docker run nginx,但会发现命令阻塞在前台,且容器一旦退出就消失。正确做法是使用 -d 后台运行,并指定端口映射:

docker run -d --name web -p 8080:80 nginx

这里 --name 为容器命名,-p 将宿主机 8080 端口映射到容器 80 端口。若镜像不存在,Docker 会自动拉取。注意:docker run 是创建并启动的复合命令,而 docker create 仅创建容器,不启动。

场景二:查看容器状态

容器启动后,你需要确认它是否正常运行。使用 docker ps 查看运行中的容器,docker ps -a 查看所有容器(包括已停止的)。输出中的 STATUS 列显示 Up 或 Exited,以及运行时长。

docker ps -a

若容器状态异常,如反复重启,可结合 docker logs 查看日志,定位问题。

场景三:停止与启动容器

当需要维护或释放资源时,停止容器使用 docker stop <容器ID或名称>。该命令会发送 SIGTERM 信号,等待优雅退出,默认超时 10 秒。若容器未响应,可强制停止:

docker stop web
# 或强制
docker kill web

启动已存在的容器使用 docker start web。注意:docker restart 会先停止再启动,常用于应用配置变更后重启。

场景四:容器进入与退出

调试时你需要进入容器内部。使用 docker exec -it web /bin/bash 进入容器的交互式 shell。若容器内没有 bash,可尝试 sh。退出时输入 exit 或按 Ctrl+D,容器会继续运行,因为 exec 不会停止容器。

另一种方式是 docker attach,它会连接到容器的主进程,但退出时会停止容器(除非加 --sig-proxy=false)。因此日常调试推荐 exec

场景五:删除容器

删除不再使用的容器前,必须先停止它(或使用 docker rm -f 强制删除)。删除命令:

docker rm web

若容器正在运行,会报错。批量删除已停止的容器:

docker rm $(docker ps -aq)

注意:删除容器会丢失其文件系统更改,但数据卷(Volume)中的数据会保留。若需清理所有未使用的资源,可使用 docker system prune,但需谨慎,它会删除所有停止的容器、未使用的网络和悬空镜像。

场景六:容器生命周期中的资源限制与清理

在生产环境,你还需要限制容器资源。创建容器时可用 --memory--cpus 参数:

docker run -d --name app --memory=512m --cpus=1.0 myapp

容器停止后并不会自动删除,长期积累会占用磁盘。可通过 docker container prune 清理所有已停止的容器。若需在容器退出后自动删除,可在运行时添加 --rm 标志,但注意 --rm 不能与 -d 同时用于需要持久化的场景(如日志采集)。

常见误区与注意事项

  • 误区一: 认为 docker stop 会立即终止进程,实际它等待优雅退出,必要时使用 docker kill
  • 误区二: 混淆 docker attachdocker exec,导致退出容器时意外停止容器。
  • 误区三: 频繁使用 docker run 而不清理旧容器,造成资源浪费。
  • 注意事项: 容器是临时性的,重要数据应通过数据卷持久化,可参考 Docker 数据卷与挂载

生命周期管理与容器编排的衔接

在单机环境下,Docker 命令足以管理容器生命周期。但在集群环境中,你需要容器编排平台,如 Kubernetes。Kubernetes 提供了 Pod 生命周期管理,包括重启策略和探针,这些抽象概念与 Docker 命令有对应关系,但更复杂。了解 Docker 生命周期是理解 Kubernetes 的基础。

参考资料

延伸阅读