第3章:Docker常用命令——镜像拉取、容器运行与日常调试
学Docker,说白了就是学会跟几个核心命令打交道。我刚接触那会儿,看着那一大堆命令也头疼。后来发现,真正每天用的就七八个。掌握了它们,你就能把MaxQuant跑起来,出了问题也能自己查。
这一章,我带你过一遍最常用的操作:怎么拉镜像、怎么跑容器、怎么看日志、怎么进容器里头看看。嗯,咱们一步步来。
本章核心:掌握镜像拉取、容器运行、日志查看和容器交互这四条主线,就能覆盖90%的日常操作。
3.1 镜像管理:从拉取到查看
镜像就像是软件的安装包。你要跑MaxQuant,首先得把它的镜像拿到本地来。
3.1.1 docker pull:拉取镜像
命令很简单:
docker pull biocontainers/maxquant:latest
docker pull maxquant/maxquant:2.5.1.0
需要注意几点:
- 标签(tag)很重要。 latest不一定是最新版,我建议指定具体版本号,比如2.5.1.0。这样能保证可重复性。
- 网络问题。 我在项目里遇到过,公司内网拉镜像特别慢。可以配置镜像加速器,或者走代理。
- 验证。 拉完后,用
docker images检查一下。
我个人习惯,每次拉完镜像先用docker inspect看一下它的元数据。里面藏着入口点(ENTRYPOINT)、环境变量等信息,能帮你理解这个镜像怎么用。
3.1.2 docker images:查看本地镜像列表
docker images
输出类似这样:
REPOSITORY TAG IMAGE ID CREATED SIZE
biocontainers/maxquant latest abc123def456 2 weeks ago 1.2GB
maxquant/maxquant 2.5.1.0 def456abc123 3 weeks ago 890MB
看列就知道,REPOSITORY是镜像仓库名,TAG是版本标签,IMAGE ID是唯一标识,SIZE是大小。MaxQuant镜像一般1GB左右,不算小。
避坑指南:
- 镜像会占磁盘空间。我建议定期清理没用的镜像:
docker image prune - 别用root用户跑容器,这是安全红线。
3.2 容器生命周期:运行、启动、停止、删除
镜像拉下来了,下一步就是把它变成运行的容器。
3.2.1 docker run:创建并启动容器
这是最核心的命令。一个典型例子:
docker run --rm -v /data:/data -v /results:/results \
biocontainers/maxquant:latest \
MaxQuantCmd /data/rawfile.raw /data/mqpar.xml
参数解释:
--rm:容器退出后自动删除。我强烈建议加上,不然每次跑完都残留一堆停止的容器。-v /data:/data:挂载卷。把宿主机的/data目录挂到容器的/data。这是数据交互的关键。-it:交互模式。如果你要手动输入命令,这个参数必须加。-d:后台运行。不想看输出日志的时候用。--name:给容器取个名字,方便后续操作。
曾经我犯过的一个低级错误:没用-v挂载数据卷,结果所有结果都写在容器里。容器一删,什么都没了。记住,容器是临时的,数据必须持久化到宿主机。
3.2.2 docker ps:查看运行中的容器
docker ps # 只看运行的
docker ps -a # 看所有(包括停止的)
输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 biocontainers/maxquant:latest "MaxQuantCmd /data/..." 10 minutes ago Up 10 minutes maxquant_run
CONTAINER ID是容器ID的前12位,足够唯一识别了。STATUS的Up表示正在运行,Exited表示已停止。
3.2.3 docker stop / start / rm:停止、重新启动、删除
docker stop a1b2c3d4e5f6 # 停止容器
docker start a1b2c3d4e5f6 # 启动已停止的容器
docker rm a1b2c3d4e5f6 # 删除容器(必须已停止)
批量操作技巧:
docker stop $(docker ps -q) # 停止所有运行中的容器
docker rm $(docker ps -aq) # 删除所有已停止的容器
嗯,这两个命令省了我不少事。
3.3 日志与调试:看输出、查错误
容器跑起来了,但跑得怎么样?有没有报错?这就要靠日志了。
3.3.1 docker logs:查看容器日志
docker logs a1b2c3d4e5f6 # 查看全部日志
docker logs -f a1b2c3d4e5f6 # -f 实时跟踪输出(类似tail -f)
docker logs --tail 50 a1b2c3d4e5f6 # 只看最后50行
避坑指南:
- 别用
docker attach。它会把你卡在容器进程里,一不小心按了Ctrl+C就把容器停了。用docker logs -f更安全。 - 我遇到过一次,容器启动了但没输出日志。查了半天,原来是程序把日志写到了文件,没输出到stdout。Docker只捕获stdout和stderr,文件日志要用
docker exec进去看。
3.3.2 docker exec:进入运行中的容器
这是调试利器。可以理解为“ssh进容器”。
docker exec -it a1b2c3d4e5f6 /bin/bash
进去了之后,你就可以查看文件、检查进程、测试命令了。
常见场景:
- 查看MaxQuant的中间结果文件:
ls -la /results/ - 检查环境变量:
env | grep MAXQUANT - 调试脚本:手动执行一条命令看看会不会报错。
我曾经遇到一个难题:容器里没有bash怎么办?很多轻量级镜像只有sh。那就用docker exec -it a1b2c3d4e5f6 /bin/sh。有的更极端,连shell都没有。这时候可以试试docker exec -it a1b2c3d4e5f6 /bin/busybox sh。
3.4 常用组合:一条命令搞定整个流程
理解了基础命令,我们可以把它们组合起来。举个例子,一个完整的MaxQuant分析流程:
- 拉取镜像(如果本地没有)
- 准备数据目录(确保挂载点正确)
- 运行容器(挂载数据、指定参数)
- 监控日志(用
logs -f实时看进度) - 分析完成(容器自动退出,结果写在宿主机)
一条命令搞定:
docker run --rm \
-v /project/raw:/data \
-v /project/results:/results \
biocontainers/maxquant:2.5.1.0 \
MaxQuantCmd /data/sample.raw /data/mqpar.xml
3.5 本章知识图谱
下面这张图展示了Docker常用命令之间的关系。看懂了它,你就掌握了容器操作的全貌。
3.6 实战演练:一个完整的MaxQuant跑流程
最后,我们看一个真实的例子。假设你把Raw文件放在/home/user/maxquant_data/raw,参数文件在/home/user/maxquant_data,你想把结果输出到/home/user/maxquant_results。
第一步:拉取镜像
docker pull biocontainers/maxquant:2.5.1.0
第二步:运行容器
docker run --rm \
-v /home/user/maxquant_data/raw:/data/raw \
-v /home/user/maxquant_data:/data/config \
-v /home/user/maxquant_results:/data/results \
biocontainers/maxquant:2.5.1.0 \
MaxQuantCmd /data/raw/sample.raw /data/config/mqpar.xml
第三步:监控进度
docker logs -f maxquant_run
第四步:检查结果
ls /home/user/maxquant_results/
就这么简单。你不用写脚本,不用装依赖。Docker全都帮你搞定了。
我建议你每次跑完,先用docker logs检查日志里的ERROR和WARNING。很多问题早发现早解决。比如MaxQuant对输入参数特别敏感,一旦xml写错,刚开始跑就报错,看日志能秒定位。