4. Docker容器管理:创建、启动、停止、删除

容器管理是Docker日常用的最多的操作。说白了,就是让镜像“活”起来,变成能跑环境的东西。我刚接触Docker那会儿,经常把容器和镜像搞混,后来理解了生命周期才真正上手。这章我们就把容器从生到死的每个环节理清楚。

4.1 容器的核心状态

一个容器不是只有“运行”和“停止”两种状态。我用一张图帮你快速掌握全貌。

Docker容器生命周期 镜像 (Image) 已创建 (Created) 运行中 (Running) 已停止 (Exited) 已删除 (Removed) docker create docker start docker stop docker rm docker restart 💡 注意:docker run = docker create + docker start + 自动附加 使用 --rm 可在容器停止后自动删除,避免残留。

4.2 创建容器

创建容器最直接的方式就是 docker run。它把创建和启动合在了一起。但如果你只想先创建、不急着跑,可以用 docker create。

典型用法:创建一个交互式的Ubuntu容器,命名为 dev-ubuntu。

docker create -it --name dev-ubuntu ubuntu:22.04

这个命令返回一串容器ID,然后容器就处于 Created 状态了。你想想看,这就像买了个虚拟机镜像,但还没开机。

选项作用
-i保持 STDIN 打开,让容器能接受输入
-t分配伪终端,配合 -i 形成交互式 shell
--name给容器起个名字,方便后续管理
-d后台运行(一般 run 时用)
--rm容器退出后自动删除,临时测试神器

个人习惯:我做质谱组学环境测试时,常用 -it --rm 一把跑:docker run -it --rm ubuntu:22.04 bash。用完就删,绝不留垃圾。但要是你打算长期开发,别加 --rm,否则数据丢了别找我。

4.3 启动与停止容器

容器已创建但没运行?用 docker start 唤醒它。

docker start -ai dev-ubuntu

-a 附加到终端并输出日志,-i 保持交互。如果你只想在后台启动,不加任何选项就行。

停止容器有两种方式:

  1. docker stop 容器名/ID —— 优雅停止,给进程10秒时间收拾东西(可调 -t 参数)
  2. docker kill 容器名/ID —— 直接断电,不废话

我曾经犯过一个错:某个MaxQuant容器跑了两天,我直接用 docker kill 把计算进程干了,结果中间结果全丢了。后来我才知道,应该先 docker exec 进去保存状态,再 docker stop。

千万注意:docker stop 发的是 SIGTERM,容器内进程可以捕获并做清理。如果你的容器里跑的是特征学习任务,强烈建议在启动脚本里加上 trap 信号处理,否则突然断电源容易出脏数据。

4.4 删除容器

容器停止后,硬盘上的可写层还在。用 docker rm 彻底删掉。

docker rm dev-ubuntu

如果容器还在运行,你得先 docker stop,或者加 -f 强制删除:

docker rm -f dev-ubuntu

嗯,这里要注意:-f 相当于先 docker kill 再 docker rm,危险程度加倍。

批量删除技巧:

  • 删除所有已停止的容器:docker container prune
  • 删除所有容器(包括运行中的,加 -f):docker rm -f $(docker ps -aq)
  • 只删除名字带 test 的容器:docker rm $(docker ps -a --filter "name=test" -q)
命令说明
docker ps列出运行中的容器
docker ps -a列出所有容器(包括已停止)
docker logs 容器名查看容器输出日志(对调试MaxQuant非常有用)
docker container prune一键清理所有已停止的容器

日常管理心法:我习惯在测试阶段给容器加 --rm,这样停止即删除,省得 docker ps -a 列表越来越长。但如果是跑生产级的MaxQuant分析,我会保留容器到结果导出完毕,再用 docker rm 手动清除。

4.5 组合拳:docker run 一步到位

实际工作中,我们很少分步走。大多数场景直接 docker run 搞定。

docker run -d \
  --name maxquant-pipeline \
  -v /data/input:/input \
  -v /data/output:/output \
  maxquant-custom:v1.2

-d 让容器后台运行,-v 挂载数据卷。这样容器就在后台默默干活,你可以随时用 docker logs 偷看进展。

对了,还有个实用场景:如果你需要交互式调试,先 docker run -it --rm ubuntu bash,在里面安装依赖、跑通流程,再把命令写成 Dockerfile。这个流程我在多个项目中反复用,效率很高。

4.6 避坑指南

  • 容器名冲突:如果你先创建了一个 my-container 没删,再创建同名的会报错。要么先 docker rm,要么换名字,要么加 --restart 参数别乱起。
  • 容器自动重启:有些容器启动后立刻退出,可能是命令写错了。可以用 docker run -it --entrypoint bash 进去手动执行命令,排查问题。
  • 资源残留:我见过同事服务器上堆了上百个“Exited”状态的容器,硬盘爆满。养成习惯,每周跑一次 docker system prune -a 清理孤儿资源(注意 -a 会删未使用的镜像)。