跳转至

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 就是在墙上开了一扇窗户,让你能把外面的文件递进去、把结果递出来。

宿主机                     容器
/home/pweaz/data/    ←→    /input/       (通过 -v 连通)
/home/pweaz/results/ ←→    /output/      (通过 -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

Got permission denied while trying to connect to the Docker daemon socket

原因:当前用户不在 docker 组中,没有权限操作 Docker。

# 解决方案:把用户加入 docker 组
sudo usermod -aG docker $USER  # 加入 docker 组
newgrp docker                   # 刷新组(或重新登录终端)

报错 2:No space left on device

Error: write /var/lib/docker/...: no space left on device

原因:Docker 镜像和容器占满了磁盘空间。

# 解决方案:清理不用的镜像和容器
docker system prune -a          # 删除所有未使用的镜像、容器、网络
docker volume prune             # 删除未使用的卷
docker system df                # 查看 Docker 占用的磁盘空间

报错 3:网络超时(国内用户常见)

Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout

原因:国内访问 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:构建时某个包找不到

PackagesNotFoundError: The following packages are not available: fastp=999.0

原因:指定的版本号不存在,或 channel 没写对。

# 解决方案:检查可用版本
# 访问 https://anaconda.org/bioconda/fastp 查看所有版本
# 或者不指定版本号,让 conda/mamba 自动选择最新版:
RUN micromamba install -y -n base -c bioconda -c conda-forge fastp

报错 5:容器内找不到挂载的文件

bash: /data/sample.fq.gz: No such file or directory

原因-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 常用镜像速查

工具最新版本拉取命令
fastp1.3.3docker pull quay.io/biocontainers/fastp:1.3.3--h5f740d0_0
bowtie22.5.5docker pull quay.io/biocontainers/bowtie2:2.5.5--he96a11b_0
kraken22.17.1docker pull quay.io/biocontainers/kraken2:2.17.1--h4ac6f70_0
samtools1.21docker pull quay.io/biocontainers/samtools:1.21--h50ea8bc_0
FastQC0.12.1docker pull quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0
MultiQC1.25docker pull quay.io/biocontainers/multiqc:1.25--pyhdfd78af_0

版本说明:以上版本号为截至 2026 年 5 月的最新版本。-- 后面的哈希值(如 h5f740d0_0)是 BioConda 的构建编号,实际使用时请到 Quay.io 确认最新 tag。


下一篇565_Docker与Nextflow整合_容器化流程 —— 学习如何将 Docker 容器与 Nextflow 工作流引擎结合,实现完全可复现的宏基因组分析流程。