容器生命周期管理

容器就像一次性的微服务沙盒。你把它创建出来,启动它,用完了就停掉、删掉。这一套流程我做了上百次,每次都能踩到不同的坑。

4.1 容器的起与止 – create、start、stop、rm

先讲最基础的几个命令。很多人习惯直接用 docker run 一步到位,但我个人更喜欢分两步走:

docker create --name my-app -p 8080:80 nginx:alpine
docker ps -a   # 确认容器已存在但状态为 Created
docker start my-app

为什么多此一举?因为 create 只分配资源、挂载文件系统,不启动进程。你可以检查挂载卷、网络配置是否正确,确认无误后再启动。我在项目里遇到过几次因挂载目录不存在导致容器 crash 的情况,用 create 提前检查就能避免。

命令作用常用参数
docker create创建容器但不启动--name, -p, -v
docker start启动已创建的容器-a 附加标准输出
docker stop停止运行中的容器-t 停止等待秒数
docker rm删除容器-f 强制删除运行中的

停掉容器的标准姿势是这样的:

docker stop -t 30 my-app   # 给进程30秒优雅退出
docker rm my-app

注意 stop 默认等待10秒发送 SIGTERM,超时后发送 SIGKILL。如果你确定要立即干掉,可以用 docker kill。而 rm -f 会直接跳过优雅停机,我仅在测试环境这样干。

小心这个坑: 我曾跑一个批处理容器,以为停掉后数据就没了,结果 docker rm 后卷还在。如果你用匿名卷,容器删除后卷不会被自动清理,记得加上 -v 选项:docker rm -v my-app。

4.2 进入容器 – exec 与 attach

容器运行起来了,你怎么进去看看?两个命令:docker exec 和 docker attach。99% 的场景用 exec:

docker exec -it my-app /bin/bash
# 或者 /bin/sh

-i 保持标准输入打开,-t 分配伪终端。两者组合才是交互式 shell。

而 attach 则是绑定到容器的主进程。说白了,你 docker attach 后看到的是容器主进程的标准输出,如果你按 Ctrl+C 退出了,容器主进程也会收到 SIGINT。我之前调试一个 web 应用时用了 attach,结果一退出整个容器就停了,浪费半小时排查。

经验法则: 调试用 exec,查看前台日志用 attach,但记住退出方式。

4.3 日志查看 – docker logs

容器出问题了,第一反应就是看日志。命令很简单:

docker logs my-app                 # 打印所有日志
docker logs --tail 100 my-app      # 只看最后100行
docker logs -f my-app              # 持续跟踪输出,像 tail -f
docker logs --since 2025-01-01 my-app  # 只看指定时间之后

有一次客户的容器启动闪退,我连日志都没看到,后来用了 docker logs --tail 50 my-app 才发现是环境变量没传。你想想看,如果容器秒退,不加 --tail 默认打印全部,反而信息太多。

小技巧: 搭配 docker logs --since 5m 只看最近5分钟,排查线上问题时特别管用。

4.4 资源限制 – CPU、内存、磁盘

一个没有限制的容器就像脱缰的野马。我在早期项目里吃过亏:一个开发容器的内存泄漏直接拖垮了整台宿主机,所有服务都挂了。从那以后,我强制所有生产容器必须加资源限制。

参数作用示例
--memory内存硬限制(容器可用最大值)--memory=512m
--memory-swap内存+交换分区总和限制--memory-swap=1g
--cpusCPU核数(浮点数)--cpus=1.5
--cpu-sharesCPU权重(相对)--cpu-shares=512
--pids-limit最大进程数--pids-limit=100

启动时加上限制:

docker run -d --name my-api --memory=256m --cpus=0.5 my-image:latest

--memory-swap 如果没指定,默认等于 --memory*2。但有些系统上 swap 可能被禁用,这时候 --memory-swap=-1 表示不限制。嗯,这里要注意:--memory 是硬限制,超出会 OOM kill。

核心原则: 生产容器必须设置 --memory 和 --cpus,否则一个容器的故障可能全局雪崩。

4.5 知识结构图 – 容器生命周期全貌

下面这张图把上面讲的内容串起来:容器从创建到销毁的完整流转,以及我们常用的管理操作。

容器生命周期与常用操作 create start running stop rm(删除) exec/attach logs 资源限制 (–memory, –cpus) 箭头方向:容器生命周期流转 虚线表示资源限制在 start 或 run 时生效

4.6 小结

  • 容器的生命线:create → start → stop → rm,每一步都有对应的命令和参数。
  • 进入容器首选 exec -it,别轻易用 attach 除非你知道自己在干嘛。
  • 日志排查用 --tail 和 --since 提高效率。
  • 资源限制是生产环境的必修课,别让一个容器拖垮整台宿主机。

这些命令看起来很基础,但组合起来再加点参数,就能应对 90% 的日常管理场景。我每次部署新服务,都会先把这些命令走一遍,确认容器能正常启停、能看日志、不会超限。养成习惯,以后少踩坑。