第4章:Docker核心命令实战——pull、run、ps、stop、rm、exec、logs

Docker的命令行工具,说白了就是你的“容器遥控器”。刚开始学的时候,我总觉得这些命令又多又杂,背不住。后来我用MetaPhlAn跑过一次完整的流程,才算真正摸透了它们的关系。

嗯,这一章我们就把最核心的七个命令过一遍。每个命令我都结合生物信息学的使用场景来讲,不会只上枯燥的选项列表。你跟着我敲一遍,很快就能上手。

本章目标:掌握 Docker 容器全生命周期的管理操作——从拉取镜像、运行容器,到查看状态、停止删除,再到进入容器和查看日志。能独立完成 MetaPhlAn 容器的基本运维。

4.1 docker pull——先把镜像拉下来

docker pull 就是把别人做好的镜像从仓库(默认是 Docker Hub)下载到本地。我在项目中遇到过好几次,因为网络不好,pull 到一半断了,结果镜像层文件损坏。后来我养成了一个习惯:先跑 docker pull 看能不能成功,不行就换国内镜像源。

基本用法:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

拉取 MetaPhlAn 的官方镜像:

docker pull biobakery/metaphlan:latest

如果需要指定版本(比如 4.0.6):

docker pull biobakery/metaphlan:4.0.6
我的小技巧:拉取前先用 docker search biobakery/metaphlan 查看有哪些 tag 可用。或者直接去 Docker Hub 网页上搜,更直观。

4.2 docker run——创建并启动容器

docker run 是使用频率最高的命令。从镜像创建容器,然后启动。如果镜像本地没有,它会自动先 pull。

我刚开始用的时候,经常忘记加 --rm 参数,导致用完的容器堆积了一堆,占硬盘空间。后来我养成了习惯:对一次性任务,一定加 --rm。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

一个典型的 MetaPhlAn 运行命令:

docker run --rm -v /data:/data biobakery/metaphlan:latest metaphlan /data/sample.fastq --input_type fastq --bowtie2db /data/db_v30 --nproc 4 -o /data/profile.txt

常用的选项:

选项 说明
--rm 容器退出后自动删除,避免残留
-v / --volume 挂载宿主机目录到容器内
--name 为容器指定名称,方便后面引用
-it 交互模式 + 分配伪终端,常用于进入容器
-d 后台运行(detach 模式)
--nproc MetaPhlAn 专用参数,指定 CPU 核心数
注意:--rm 和 -d 不要同时用。如果后台运行并加了 --rm,容器退出后会自动删除,你连查日志的机会都没有。我曾经因为这个丢过一次运行结果,血的教训。

4.3 docker ps——查看正在运行的容器

想知道现在有哪些容器活着?用 docker ps。默认只显示运行中的容器,加 -a 能看到所有容器(包括已停止的)。

docker ps [OPTIONS]

常用的:

# 只看运行中的
docker ps

# 看所有容器
docker ps -a

# 只看最后创建的 5 个
docker ps -a -n 5

# 只显示容器 ID
docker ps -q

我个人习惯用 docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}" 自定义显示列,一眼就能看出哪些是“僵尸容器”。

4.4 docker stop——优雅地停止容器

docker stop 给容器发送 SIGTERM 信号,让它自己清理后再退出。如果超时(默认10秒)还没停,会强制 SIGKILL。我建议不要用 docker kill 替代,除非容器真卡死了。

docker stop [容器ID或名称]

例子:

docker stop my_metaphlan_container

停止多个:

docker stop container1 container2 container3
一个小技巧:批量停止所有运行中的容器:docker stop $(docker ps -q)。但慎用,生产环境别这么干。

4.5 docker rm——删除容器

docker rm 删除已停止的容器。如果想强制删除正在运行的,加 -f(相当于先 stop 再 rm)。

docker rm [容器ID或名称]

例子:

# 删除一个
docker rm old_container

# 强制删除运行中的
docker rm -f running_container

# 清理所有已停止的容器
docker container prune

我建议大家每隔一段时间跑一次 docker container prune,它能清理掉所有已停止的容器,释放磁盘空间。不会误删正在运行的。

4.6 docker exec——进入正在运行的容器

容器已经跑起来了,你想进去看一眼:文件结构对不对?数据库有没有挂载成功?这时候用 docker exec。

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

最常见的用法:

docker exec -it my_container bash

如果容器里没有 bash,可以试试 sh:

docker exec -it my_container sh

在 MetaPhlAn 场景里,我经常用 exec 进容器检查数据库路径:

docker exec -it metaphlan_container ls /data/db_v30/
注意:-it 要一起用,-i 保持 STDIN 打开,-t 分配伪终端。少一个你可能看不到命令提示符,或者输入不进去。

4.7 docker logs——看容器的输出

MetaPhlAn 跑了一个小时,想知道进度?或者跑完后想看程序输出的结果?docker logs 就派上用场了。

docker logs [OPTIONS] CONTAINER

常用参数:

  • -f(--follow):实时跟踪日志输出,类似 tail -f
  • --tail N:只显示最后 N 行
  • -t(--timestamps):显示时间戳

例子:

# 查看全部日志
docker logs long_running_container

# 实时跟踪最新输出
docker logs -f metaphlan_job

# 只看最后 50 行
docker logs --tail 50 metaphlan_job

我曾遇到过一次容器启动后马上退出,什么输出都没有。后来我发现是 docker logs 默认只显示标准输出(stdout),而程序输出写到了 stderr。这时加个参数就好了:

docker logs --tail 50 metaphlan_job 2>&1

命令之间的关系

我把这几个命令串成一个完整的生命周期图。你看一遍就明白了:

Docker容器生命周期的核心命令 docker pull 从仓库拉取镜像 docker run 创建并启动容器 docker ps 查看容器状态 docker exec 进入运行中的容器 docker stop 优雅停止容器 docker logs 查看容器输出 docker rm 删除已停止的容器 使用建议 • 一次性任务加 --rm • 后台运行用 -d • 进入容器用 -it bash • 清理无用容器用 prune

从图中可以看到,docker pull 是前置准备,docker run 是核心入口,运行后可以用 docker ps 查看状态,用 docker exec 进入调试,用 docker logs 查看输出,最终用 docker stop 结束、docker rm 清理。每一步都有它的用处。

一句话总结:掌握了这七个命令,你就能像玩积木一样管理 Docker 容器。MetaPhlAn 的部署流程说到底就是这些命令的组合运用。