容器生命周期管理
容器就像一次性的微服务沙盒。你把它创建出来,启动它,用完了就停掉、删掉。这一套流程我做了上百次,每次都能踩到不同的坑。
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 |
--cpus | CPU核数(浮点数) | --cpus=1.5 |
--cpu-shares | CPU权重(相对) | --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 知识结构图 – 容器生命周期全貌
下面这张图把上面讲的内容串起来:容器从创建到销毁的完整流转,以及我们常用的管理操作。
4.6 小结
- 容器的生命线:
create → start → stop → rm,每一步都有对应的命令和参数。 - 进入容器首选
exec -it,别轻易用attach除非你知道自己在干嘛。 - 日志排查用
--tail和--since提高效率。 - 资源限制是生产环境的必修课,别让一个容器拖垮整台宿主机。
这些命令看起来很基础,但组合起来再加点参数,就能应对 90% 的日常管理场景。我每次部署新服务,都会先把这些命令走一遍,确认容器能正常启停、能看日志、不会超限。养成习惯,以后少踩坑。