3. Docker 常用命令与镜像管理归纳总结
Docker 的命令,说实话,刚接触的时候会觉得有点多。但你别怕。
我个人的习惯是 —— 先搞清楚两类核心对象:镜像和容器。镜像就是个「模板」,容器就是「实例」。你下载一个镜像,然后跑起来,就成了容器。就这么简单。
这一章咱们把这些命令梳理清楚。我不打算给你列长长的命令手册,而是按使用场景来拆解。你在宏基因组分析流程里,基本就干这几件事:拉镜像、看镜像、删镜像、跑容器、进容器、管理数据。
3.1 命令通用结构与帮助
每条 Docker 命令,基本都长这样:
docker [对象] [操作] [参数]
举个例子,想看所有镜像:
docker image ls
想看所有运行中的容器:
docker container ps
要是忘了某个命令怎么用,别硬记。
docker --help
docker image --help
docker run --help
我在项目里经常靠 --help 救场。你想想看,一百多个参数,谁能全背下来?
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。
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 命令其实就围绕这几个核心对象展开。下面这张图可以帮你快速建立全局感:
别指望一上来就记住所有参数。我也是一边敲 --help 一边写流程的。你真正用上几次,这些命令自然就刻在脑子里了。