4. Docker容器管理:创建、启动、停止、删除
容器管理是Docker日常用的最多的操作。说白了,就是让镜像“活”起来,变成能跑环境的东西。我刚接触Docker那会儿,经常把容器和镜像搞混,后来理解了生命周期才真正上手。这章我们就把容器从生到死的每个环节理清楚。
4.1 容器的核心状态
一个容器不是只有“运行”和“停止”两种状态。我用一张图帮你快速掌握全貌。
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 保持交互。如果你只想在后台启动,不加任何选项就行。
停止容器有两种方式:
docker stop 容器名/ID—— 优雅停止,给进程10秒时间收拾东西(可调-t参数)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会删未使用的镜像)。