第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分析流程:

  1. 拉取镜像(如果本地没有)
  2. 准备数据目录(确保挂载点正确)
  3. 运行容器(挂载数据、指定参数)
  4. 监控日志(用logs -f实时看进度)
  5. 分析完成(容器自动退出,结果写在宿主机)

一条命令搞定:

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常用命令之间的关系。看懂了它,你就掌握了容器操作的全貌。

Docker常用命令知识图谱 Docker常用命令 镜像管理 容器生命周期 调试与日志 docker pull docker images docker run docker stop/start/rm docker logs docker exec 核心逻辑:镜像 → 容器 → 运行 → 调试 → 结果提取 所有操作都围绕这条主线展开

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写错,刚开始跑就报错,看日志能秒定位。