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 attach和docker exec,导致退出容器时意外停止容器。 - 误区三: 频繁使用
docker run而不清理旧容器,造成资源浪费。 - 注意事项: 容器是临时性的,重要数据应通过数据卷持久化,可参考 Docker 数据卷与挂载。
生命周期管理与容器编排的衔接
在单机环境下,Docker 命令足以管理容器生命周期。但在集群环境中,你需要容器编排平台,如 Kubernetes。Kubernetes 提供了 Pod 生命周期管理,包括重启策略和探针,这些抽象概念与 Docker 命令有对应关系,但更复杂。了解 Docker 生命周期是理解 Kubernetes 的基础。
参考资料
延伸阅读
