Docker 生信实战:从 Dockerfile 到镜像¶
适用人群:生物信息学方向学生/工程师,需要容器化生信分析流程 前置知识:Linux 基本命令、了解宏基因组分析流程 预计阅读 + 实操时间:3-4 小时
一、Docker 核心概念白话复习¶
1.1 镜像 vs 容器¶
| 概念 | 英文 | 白话类比 | 一句话解释 |
|---|---|---|---|
| 镜像 (Image) | Docker Image | 安装光盘 / 蛋糕模具 | 一个打包好的"软件包",包含操作系统 + 工具 + 配置,但还没运行 |
| 容器 (Container) | Docker Container | 正在运行的电脑 / 用模具做出的蛋糕 | 从镜像启动的一个隔离运行环境,可以读写、运行程序 |
白话理解:镜像就像你下载的一个 .iso 系统安装盘——它本身是"死的",不能操作。容器是用这张光盘装好的一台电脑——它是"活的",可以跑程序。一张光盘可以装很多台电脑,一个镜像也可以启动很多个容器。
1.2 Dockerfile —— 装机清单¶
Dockerfile 就像一张装机清单:
1. 先拿一台 Ubuntu 电脑(FROM ubuntu:22.04)
2. 安装 fastp 软件(RUN apt-get install fastp)
3. 把我的脚本复制进去(COPY pipeline.sh /opt/)
4. 设置工作目录(WORKDIR /opt/)
5. 告诉别人怎么启动(ENTRYPOINT ["bash", "pipeline.sh"])
Docker 拿到这张清单后,一步步执行,最终生成一个镜像。
1.3 Docker Hub / BioContainers —— 应用商店¶
| 仓库 | 白话类比 | 说明 |
|---|---|---|
| Docker Hub | 苹果 App Store | 最大的公共镜像仓库,啥都有 |
| Quay.io | 另一个应用商店 | Red Hat 维护,BioContainers 的主仓库 |
| BioContainers | 生信专用 App Store | 提供 9000+ 生信工具的容器,自动从 BioConda 构建 |
BioContainers 的好处:你不用自己写 Dockerfile,常用的 fastp、bowtie2、kraken2 等工具都有现成容器,直接拉取就能用。
二、Docker 安装(Linux / WSL2)¶
2.1 查看当前版本信息¶
截至 2026 年 5 月,Docker 最新版本: - Docker Engine:29.4.2 - Docker Compose:v5.1.3 - Docker Desktop(Windows/Mac):最新稳定版
2.2 Linux / WSL2 安装步骤¶
# ===== 第 1 步:卸载旧版本(如果有的话)=====
sudo apt-get remove docker docker-engine docker.io containerd runc # 删除旧版 Docker
# ===== 第 2 步:安装依赖 =====
sudo apt-get update # 更新软件源
sudo apt-get install -y \
ca-certificates \ # SSL 证书
curl \ # 下载工具
gnupg \ # GPG 签名验证
lsb-release # 获取系统版本信息
# ===== 第 3 步:添加 Docker 官方 GPG 密钥 =====
sudo mkdir -p /etc/apt/keyrings # 创建密钥目录
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 下载并保存密钥
# ===== 第 4 步:添加 Docker 软件源 =====
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 写入 apt 源
# ===== 第 5 步:安装 Docker Engine =====
sudo apt-get update # 刷新软件源(加入了 Docker 源)
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin # 安装 Docker 全家桶
# ===== 第 6 步:让当前用户无需 sudo 使用 Docker =====
sudo usermod -aG docker $USER # 把当前用户加入 docker 组
newgrp docker # 刷新组权限(或者重新登录)
# ===== 第 7 步:验证安装 =====
docker --version # 查看 Docker 版本,应显示 Docker version 29.x.x
docker compose version # 查看 Compose 版本,应显示 v5.x.x
docker run hello-world # 运行测试容器,看到 "Hello from Docker!" 就成功了
2.3 WSL2 用户注意事项¶
# 方法一(推荐):安装 Docker Desktop for Windows,勾选 WSL2 后端
# 下载地址:https://www.docker.com/products/docker-desktop/
# 安装后在 Settings → Resources → WSL Integration 中启用你的 WSL 发行版
# 方法二:在 WSL2 中直接安装 Docker Engine(按上面的步骤)
# 需要手动启动 Docker 守护进程:
sudo service docker start # 每次打开 WSL 后启动 Docker
三、基础操作实战¶
3.1 拉取生信镜像¶
# 从 Docker Hub 拉取 FastQC 容器
docker pull biocontainers/fastqc:v0.11.9_cv8 # 拉取指定版本的 FastQC 镜像
# 从 Quay.io 拉取(BioContainers 的主仓库,版本更全)
docker pull quay.io/biocontainers/fastp:1.3.3--h5f740d0_0 # 拉取最新 fastp
# 查看已下载的镜像
docker images # 列出所有本地镜像
3.2 运行容器¶
# 最简单的运行方式:查看 fastp 版本
docker run --rm quay.io/biocontainers/fastp:1.3.3--h5f740d0_0 fastp --version
# --rm:容器运行完自动删除(不留垃圾)
# 最后的 fastp --version:在容器里执行的命令
# 交互式运行:进入容器内部操作
docker run -it --rm quay.io/biocontainers/fastp:1.3.3--h5f740d0_0 bash
# -it:交互模式 + 分配终端(i=interactive, t=tty)
# bash:启动一个 bash shell
# 进去后可以随便执行命令,exit 退出
3.3 挂载数据目录(-v 参数详解)¶
这是最重要的操作!容器内部和宿主机是隔离的,你需要用 -v 把数据"映射"进去。
# 语法:-v 宿主机路径:容器内路径
docker run --rm \
-v /home/pweaz/data:/input \ # 宿主机的 data 目录 → 容器里的 /input
-v /home/pweaz/results:/output \ # 宿主机的 results 目录 → 容器里的 /output
quay.io/biocontainers/fastp:1.3.3--h5f740d0_0 \
fastp \
-i /input/sample_R1.fq.gz \ # 容器内的输入路径
-o /output/clean_R1.fq.gz \ # 容器内的输出路径
-I /input/sample_R2.fq.gz \ # 双端测序的 R2
-O /output/clean_R2.fq.gz # R2 的输出
白话理解 -v 挂载:想象容器是一个密封的房间,-v 就是在墙上开了一扇窗户,让你能把外面的文件递进去、把结果递出来。
注意事项: - 宿主机路径必须用绝对路径(以 / 开头) - 容器内路径可以随便取名,常用 /input、/output、/data - 加 :ro 可以设为只读:-v /data:/input:ro
3.4 docker exec 进入正在运行的容器¶
# 第 1 步:后台启动一个容器
docker run -d --name my_fastp \
-v /home/pweaz/data:/data \
quay.io/biocontainers/fastp:1.3.3--h5f740d0_0 \
sleep infinity # 让容器一直运行,不退出
# -d:后台运行(detach)
# --name my_fastp:给容器起个名字
# 第 2 步:进入容器调试
docker exec -it my_fastp bash # 进入名为 my_fastp 的容器
# 进去后可以检查文件、手动跑命令
# 第 3 步:用完后停止并删除
docker stop my_fastp # 停止容器
docker rm my_fastp # 删除容器
四、Dockerfile 实战——构建宏基因组分析镜像¶
4.1 选择基础镜像¶
| 基础镜像 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
mambaorg/micromamba:1.5-jammy | 极快的包安装速度,体积小 | 社区较新 | 推荐,适合 BioConda 工具 |
continuumio/miniconda3:latest | 用户多,文档全 | 安装速度慢,镜像偏大 | 需要稳定性时使用 |
ubuntu:22.04 | 最基础,完全控制 | 需要手动编译安装 | 工具不在 BioConda 中时 |
4.2 基础版 Dockerfile¶
创建文件 Dockerfile:
# ===== 基础镜像:使用 micromamba,安装速度快 =====
FROM mambaorg/micromamba:1.5-jammy
# ===== 镜像元信息 =====
LABEL maintainer="pengwenqiang" # 维护者
LABEL description="宏基因组分析镜像: fastp+bowtie2+kraken2+samtools" # 描述
# ===== 使用 root 用户安装软件 =====
USER root
# ===== 用 micromamba 安装生信工具 =====
# 一次性安装所有工具,减少镜像层数
RUN micromamba install -y -n base -c bioconda -c conda-forge \
fastp=1.3.3 \ # 质控工具(最新版)
bowtie2=2.5.5 \ # 比对工具(去宿主)
kraken2=2.17.1 \ # 物种分类工具
samtools=1.21 \ # SAM/BAM 处理工具
&& micromamba clean --all --yes # 清理缓存,减小镜像体积
# ===== 设置工作目录 =====
WORKDIR /workspace # 容器启动后默认在这个目录
# ===== 设置环境变量 =====
ENV PATH="/opt/conda/bin:$PATH" # 确保 conda 工具在 PATH 中
# ===== 创建数据目录 =====
RUN mkdir -p /data /output /db # 创建挂载点目录
# /data → 挂载输入数据
# /output → 挂载输出结果
# /db → 挂载数据库(如 Kraken2 数据库)
# ===== 默认启动命令 =====
CMD ["bash"] # 默认启动 bash,可以交互操作
4.3 进阶版——多阶段构建(Multi-stage Build)¶
多阶段构建可以显著减小镜像体积:编译阶段用大镜像,运行阶段只保留必要文件。
# ========== 第一阶段:构建阶段 ==========
FROM mambaorg/micromamba:1.5-jammy AS builder
# AS builder:给这个阶段起名叫 builder
USER root
# 安装所有工具
RUN micromamba install -y -n base -c bioconda -c conda-forge \
fastp=1.3.3 \
bowtie2=2.5.5 \
kraken2=2.17.1 \
samtools=1.21 \
&& micromamba clean --all --yes
# ========== 第二阶段:运行阶段(只保留需要的文件)==========
FROM debian:bookworm-slim AS runtime
# 用一个极小的 Debian 镜像作为最终基础
# 从构建阶段复制 conda 环境
COPY --from=builder /opt/conda /opt/conda
# --from=builder:从第一阶段的镜像中复制文件
# 设置环境变量
ENV PATH="/opt/conda/bin:$PATH"
# 安装运行时依赖(某些工具需要的系统库)
RUN apt-get update && apt-get install -y --no-install-recommends \
libgomp1 \ # OpenMP 并行库(bowtie2 需要)
procps \ # ps 等进程管理工具
&& rm -rf /var/lib/apt/lists/* # 清理 apt 缓存
WORKDIR /workspace
RUN mkdir -p /data /output /db
CMD ["bash"]
4.4 COPY 和 ENTRYPOINT 使用¶
如果你有自己的分析脚本,可以把它打包进镜像:
# ===== 复制本地脚本到镜像 =====
COPY scripts/run_pipeline.sh /opt/pipeline/run_pipeline.sh # 复制脚本
COPY config/params.yaml /opt/pipeline/params.yaml # 复制配置文件
# ===== 给脚本加执行权限 =====
RUN chmod +x /opt/pipeline/run_pipeline.sh # 确保脚本可执行
# ===== 设置入口点 =====
ENTRYPOINT ["/opt/pipeline/run_pipeline.sh"] # 容器启动时自动执行这个脚本
# ENTRYPOINT vs CMD 的区别:
# ENTRYPOINT:固定的启动命令,docker run 时追加的参数会传给它
# CMD:默认命令,docker run 时可以完全覆盖
五、构建与测试¶
5.1 构建镜像¶
# 进入 Dockerfile 所在目录
cd /home/pweaz/metagenome_docker # 你的项目目录
# 构建镜像
docker build -t metagenome-pipeline:v1.0 .
# -t metagenome-pipeline:v1.0:给镜像起名字和标签
# .:表示 Dockerfile 在当前目录
# 构建过程需要几分钟,耐心等待
# 查看构建好的镜像
docker images # 找到 metagenome-pipeline 这一行
# REPOSITORY TAG IMAGE ID CREATED SIZE
# metagenome-pipeline v1.0 abc123def456 2 minutes ago 1.2GB
5.2 测试镜像¶
# 测试 1:检查工具版本
docker run --rm metagenome-pipeline:v1.0 fastp --version # 应输出 fastp 1.3.3
docker run --rm metagenome-pipeline:v1.0 bowtie2 --version # 应输出 bowtie2-2.5.5
docker run --rm metagenome-pipeline:v1.0 kraken2 --version # 应输出 Kraken version 2.17.1
docker run --rm metagenome-pipeline:v1.0 samtools --version # 应输出 samtools 1.21
# 测试 2:挂载数据目录运行 fastp
docker run --rm \
-v $(pwd)/test_data:/data \ # 挂载测试数据
-v $(pwd)/test_output:/output \ # 挂载输出目录
metagenome-pipeline:v1.0 \
fastp -i /data/test_R1.fq.gz -o /output/clean_R1.fq.gz # 运行质控
# 测试 3:交互式进入镜像检查
docker run -it --rm metagenome-pipeline:v1.0 bash
# 进入后执行:
# which fastp → 应显示 /opt/conda/bin/fastp
# which bowtie2 → 应显示 /opt/conda/bin/bowtie2
# ls /data /output → 应该存在这些目录
# exit → 退出
5.3 查看镜像详情¶
# 查看镜像的构建历史(每一层做了什么)
docker history metagenome-pipeline:v1.0
# 可以看到每个 RUN/COPY 指令创建的层和大小
# 查看镜像详细信息
docker inspect metagenome-pipeline:v1.0
# 会输出 JSON 格式的完整信息(环境变量、挂载点等)
六、推送到 Docker Hub(可选)¶
# 第 1 步:登录 Docker Hub
docker login # 输入你的 Docker Hub 用户名和密码
# 第 2 步:给镜像打标签(必须包含你的用户名)
docker tag metagenome-pipeline:v1.0 your_username/metagenome-pipeline:v1.0
# 把 your_username 替换成你的 Docker Hub 用户名
# 第 3 步:推送到 Docker Hub
docker push your_username/metagenome-pipeline:v1.0
# 推送完成后,别人就可以 docker pull your_username/metagenome-pipeline:v1.0
# 第 4 步:验证(在另一台机器上拉取)
docker pull your_username/metagenome-pipeline:v1.0 # 拉取你推送的镜像
七、BioContainers 介绍——现成的生信工具容器¶
BioContainers 是生信领域最大的容器集合,提供 9000+ 生信工具的容器镜像。
7.1 使用方式¶
# 方式一:从 Quay.io 拉取(推荐,版本最全)
docker pull quay.io/biocontainers/fastp:1.3.3--h5f740d0_0 # fastp
docker pull quay.io/biocontainers/bowtie2:2.5.5--he96a11b_0 # bowtie2
docker pull quay.io/biocontainers/kraken2:2.17.1--h4ac6f70_0 # kraken2
# 方式二:从 Docker Hub 拉取(版本可能较旧)
docker pull biocontainers/fastqc:v0.11.9_cv8 # FastQC
# 方式三:搜索可用工具
# 访问 https://biocontainers.pro/ 在线搜索
# 或者使用命令行搜索:
docker search biocontainers # 搜索 Docker Hub 上的 BioContainers
7.2 BioContainers 与 BioConda 的关系¶
BioConda(软件包仓库)
│
│ 自动构建
▼
BioContainers(容器镜像)
│
├── Docker 镜像 → 推送到 Quay.io / Docker Hub
└── Singularity 镜像 → 推送到 Galaxy Project Depot
白话理解:BioConda 有一个工具的"食谱"(recipe),BioContainers 自动把这个食谱做成一道"菜"(容器),你直接端走就能吃。
八、常见报错与解决方案¶
报错 1:permission denied¶
原因:当前用户不在 docker 组中,没有权限操作 Docker。
报错 2:No space left on device¶
原因:Docker 镜像和容器占满了磁盘空间。
# 解决方案:清理不用的镜像和容器
docker system prune -a # 删除所有未使用的镜像、容器、网络
docker volume prune # 删除未使用的卷
docker system df # 查看 Docker 占用的磁盘空间
报错 3:网络超时(国内用户常见)¶
原因:国内访问 Docker Hub 网络不稳定。
# 解决方案一:配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
EOF
sudo systemctl daemon-reload # 重载配置
sudo systemctl restart docker # 重启 Docker
# 解决方案二:使用代理(如果你有 v2rayN 等代理工具)
# 设置 Docker 代理
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/proxy.conf << 'EOF'
[Service]
Environment="HTTP_PROXY=socks5://127.0.0.1:10808"
Environment="HTTPS_PROXY=socks5://127.0.0.1:10808"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
报错 4:构建时某个包找不到¶
原因:指定的版本号不存在,或 channel 没写对。
# 解决方案:检查可用版本
# 访问 https://anaconda.org/bioconda/fastp 查看所有版本
# 或者不指定版本号,让 conda/mamba 自动选择最新版:
RUN micromamba install -y -n base -c bioconda -c conda-forge fastp
报错 5:容器内找不到挂载的文件¶
原因:-v 挂载的路径写错了,或者宿主机路径不存在。
# 排查步骤
ls /home/pweaz/data/ # 先确认宿主机路径存在
docker run -it --rm \
-v /home/pweaz/data:/data \
metagenome-pipeline:v1.0 \
ls /data # 进容器确认文件是否映射进来了
# 注意:宿主机路径必须是绝对路径!不能用 ~/data
九、速查表¶
Docker 命令速查¶
| 操作 | 命令 | 说明 |
|---|---|---|
| 拉取镜像 | docker pull 镜像名:标签 | 从仓库下载镜像 |
| 查看镜像 | docker images | 列出本地所有镜像 |
| 删除镜像 | docker rmi 镜像ID | 删除指定镜像 |
| 运行容器 | docker run --rm 镜像名 命令 | 运行并自动清理 |
| 交互运行 | docker run -it --rm 镜像名 bash | 进入容器终端 |
| 挂载目录 | docker run -v 宿主机:容器 镜像名 | 映射数据目录 |
| 后台运行 | docker run -d --name 名字 镜像名 | 后台启动容器 |
| 进入容器 | docker exec -it 容器名 bash | 进入运行中的容器 |
| 查看容器 | docker ps / docker ps -a | 运行中 / 所有容器 |
| 停止容器 | docker stop 容器名 | 停止容器 |
| 删除容器 | docker rm 容器名 | 删除已停止的容器 |
| 构建镜像 | docker build -t 名字:标签 . | 从 Dockerfile 构建 |
| 查看日志 | docker logs 容器名 | 查看容器输出日志 |
| 清理系统 | docker system prune -a | 删除所有未使用资源 |
| 查看占用 | docker system df | 查看磁盘占用 |
Dockerfile 指令速查¶
| 指令 | 作用 | 示例 |
|---|---|---|
FROM | 基础镜像 | FROM mambaorg/micromamba:1.5-jammy |
RUN | 执行命令 | RUN micromamba install -y fastp |
COPY | 复制文件 | COPY script.sh /opt/ |
WORKDIR | 设置工作目录 | WORKDIR /workspace |
ENV | 设置环境变量 | ENV PATH="/opt/conda/bin:$PATH" |
CMD | 默认命令(可覆盖) | CMD ["bash"] |
ENTRYPOINT | 入口命令(固定) | ENTRYPOINT ["python", "app.py"] |
LABEL | 添加元信息 | LABEL maintainer="name" |
EXPOSE | 声明端口 | EXPOSE 8080 |
USER | 切换用户 | USER root |
BioContainers 常用镜像速查¶
| 工具 | 最新版本 | 拉取命令 |
|---|---|---|
| fastp | 1.3.3 | docker pull quay.io/biocontainers/fastp:1.3.3--h5f740d0_0 |
| bowtie2 | 2.5.5 | docker pull quay.io/biocontainers/bowtie2:2.5.5--he96a11b_0 |
| kraken2 | 2.17.1 | docker pull quay.io/biocontainers/kraken2:2.17.1--h4ac6f70_0 |
| samtools | 1.21 | docker pull quay.io/biocontainers/samtools:1.21--h50ea8bc_0 |
| FastQC | 0.12.1 | docker pull quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0 |
| MultiQC | 1.25 | docker pull quay.io/biocontainers/multiqc:1.25--pyhdfd78af_0 |
版本说明:以上版本号为截至 2026 年 5 月的最新版本。
--后面的哈希值(如h5f740d0_0)是 BioConda 的构建编号,实际使用时请到 Quay.io 确认最新 tag。
下一篇:565_Docker与Nextflow整合_容器化流程 —— 学习如何将 Docker 容器与 Nextflow 工作流引擎结合,实现完全可复现的宏基因组分析流程。