3. Docker 常用命令与镜像管理归纳总结

Docker 的命令,说实话,刚接触的时候会觉得有点多。但你别怕。

我个人的习惯是 —— 先搞清楚两类核心对象:镜像和容器。镜像就是个「模板」,容器就是「实例」。你下载一个镜像,然后跑起来,就成了容器。就这么简单。

这一章咱们把这些命令梳理清楚。我不打算给你列长长的命令手册,而是按使用场景来拆解。你在宏基因组分析流程里,基本就干这几件事:拉镜像、看镜像、删镜像、跑容器、进容器、管理数据。

3.1 命令通用结构与帮助

每条 Docker 命令,基本都长这样:

docker [对象] [操作] [参数]

举个例子,想看所有镜像:

docker image ls

想看所有运行中的容器:

docker container ps

要是忘了某个命令怎么用,别硬记。

docker --help
docker image --help
docker run --help

我在项目里经常靠 --help 救场。你想想看,一百多个参数,谁能全背下来?

小提示:每次装完 Docker,我第一件事就是跑一遍 docker version 和 docker info,确认服务正常。

3.2 镜像管理 —— 你的「软件仓库」

镜像在 Docker 里是只读的。你不能直接改它,只能基于它创建容器,或者在它的基础上「另存为」一个新镜像。

3.2.1 搜索与拉取镜像

先从 Docker Hub 上搜镜像:

docker search ubuntu

找到想要的之后,拉下来:

docker pull ubuntu:22.04

ubuntu:22.04 里的 :22.04 是标签。不写标签,默认拉 latest。

避坑指南:我曾经在项目里没指定 tag,直接 docker pull ubuntu,结果拉下来一个 24.04 版本,和我写死的脚本路径对不上。容器一跑就报错。所以,养成好习惯 —— 永远写上版本号。

3.2.2 查看与删除镜像

列出本地所有镜像:

docker image ls

输出会显示仓库名、标签、镜像 ID、创建时间和大小。我经常用这个来检查磁盘占用。

删除镜像:

docker image rm ubuntu:22.04

也可以按镜像 ID 删:

docker image rm d13c942271ac
注意:如果某个镜像已经被容器使用(即使容器已停止),你得先删容器,才能删镜像。否则会提示冲突。

3.2.3 镜像标签与重命名

用 docker tag 给你的镜像起个别名:

docker tag ubuntu:22.04 my-meta-image:v1.0

这不会复制数据,只是多了一个引用。我在做流程版本控制时,习惯把用到的镜像全部 tag 成项目名+日期,方便回溯。

3.3 容器生命周期管理 —— 让镜像「活」起来

容器,说白了就是镜像的一个运行实例。你可以启动、停止、重启、删除它。

3.3.1 创建与启动容器

最常用的命令:

docker run -it --rm ubuntu:22.04 bash

这几个参数你得搞清楚:

  • -i:交互模式,保持 STDIN 打开。
  • -t:分配一个伪终端。
  • --rm:容器退出后自动删除。这招在跑一次性分析任务时非常实用。
  • bash:容器启动后执行的命令。

如果是后台跑任务:

docker run -d --name meta-analysis meta-image:v1.0

-d 表示后台运行,--name 给容器起个名字,方便后面管理。

3.3.2 查看容器

docker ps           # 只看运行中的
docker ps -a        # 看所有容器(包括已停止的)

我每次跑完一个分析流程,都会先 docker ps -a 看一眼状态,确认容器正常退出(Exit 0)。

3.3.3 停止、启动与删除容器

docker stop meta-analysis
docker start meta-analysis
docker restart meta-analysis

删除容器时注意:

docker rm meta-analysis
docker rm $(docker ps -aq)   # 删除所有已停止的容器
重要:运行中的容器不能直接 docker rm,得先 docker stop 再删,或者加 -f 强制删除。

3.3.4 进入正在运行的容器

容器跑起来了,怎么进去?用 docker exec。

docker exec -it meta-analysis bash

我曾经调试一个 bug,需要实时跟踪日志,就是用 docker exec 进去,然后 tail -f 盯着输出。

3.4 数据卷与网络管理

为什么要单独拎出来讲?

因为宏基因组分析的数据量通常很大。十几 G 的 FASTQ,几百 M 的参考数据库。如果你把数据放在容器里,容器一删,数据就没了 —— 这谁受得了?

3.4.1 挂载数据卷

本地目录挂载到容器里:

docker run -v /local/input:/data/input -v /local/output:/data/output meta-image:v1.0

-v 参数左边是宿主机路径,右边是容器内路径。我用这个方案来解「数据怎么传入/传出容器」的问题。

3.4.2 容器间通信

多容器协作时,用 --link 或自定义网络:

docker network create meta-net
docker run --net meta-net --name db-server postgres:15
docker run --net meta-net --name app-server my-app:v1.0

同一个网络里的容器,可以直接用容器名互相访问。这一步在编排多工具流程时特别有用。

3.5 镜像构建与导出导入

你的流程写好了,想分享给别人?或者部署到服务器?

3.5.1 Dockerfile 构建

docker build -t my-meta-pipeline:v1.0 .

其中 -t 指定镜像名和标签,. 表示 Dockerfile 所在的目录。

这个我后面会专门有一章细讲。这里先有个概念就行。

3.5.2 导出与导入镜像

没网的环境怎么办?把镜像导出成 tar 文件:

docker save -o meta-pipeline.tar my-meta-pipeline:v1.0

到目标机器上再导入:

docker load -i meta-pipeline.tar

我有一回在客户的离线服务器上部署,就是用这种方式。几十兆的 tar 文件,U 盘一拷,搞定。

3.6 常用场景归纳

我把最常用的场景和对应的命令整理成一个表格,你直接对着用:

场景 关键命令 说明
下载镜像 docker pull <镜像名>:<标签> 标签必填,避免拉错版本
查看本地镜像 docker image ls 配合 --digests 可看哈希
删除无用镜像 docker image prune -a 小心:会删所有未被容器使用的镜像
启动交互容器 docker run -it --rm ... bash 用完即删,不留垃圾容器
后台运行任务 docker run -d --name <名> <镜像> 看日志用 docker logs
挂载数据 -v /宿主机:/容器 路径用绝对路径,避免歧义
进入运行中容器 docker exec -it <容器名> bash 排查问题专用
导出镜像 docker save -o file.tar <镜像> 离线部署常用

3.7 知识结构总览

你看,Docker 命令其实就围绕这几个核心对象展开。下面这张图可以帮你快速建立全局感:

Docker常用命令与镜像管理知识体系 镜像管理 pull / search / ls / rm / tag 容器生命周期 run / exec / ps / stop / rm 数据与网络 -v 挂载 / docker network 镜像构建与导出 build / save / load / tag 核心流程:镜像 → 容器 → 数据卷/网络 → 构建/导出 所有操作都围绕这四大块展开,掌握它们,Docker 就入门了。
一句话总结:Docker 学起来其实不难。你只要记住「镜像 pull 下来,run 成容器,-v 挂数据,exec 进去调试」,大部分场景都能覆盖。剩下的,遇到什么问题再查什么就好。

别指望一上来就记住所有参数。我也是一边敲 --help 一边写流程的。你真正用上几次,这些命令自然就刻在脑子里了。