跳转至

17. Docker 与 Conda 环境管理 — 生信工程师必备技能

一句话说明: Conda 管理软件包和 Python/R 环境,Docker 把整个操作系统级别的运行环境打包成"集装箱",两者配合让你的分析流程在任何电脑上都能一模一样地跑通。


一、核心概念(白话版)

1.1 为什么需要环境管理

白话比方: 你装过这种情况吗——同事说"我电脑上能跑",结果你一跑就报错?

根本原因: 不同软件需要不同版本的依赖库(dependency,依赖=运行必需的其他软件),版本冲突了就崩了。

生信的典型痛点: - MetaPhlAn 4 要 Python 3.8+,但 HUMAnN 2 还要 Python 3.6 - samtools 旧版和新版命令参数不一样 - 论文里用的工具版本,三年后官网已经更新了,你复现不了

环境管理就是: 给每个项目/每个工具创建一个"隔离的小房间",互不干扰。

1.2 Conda 是什么

项目 说明
是什么 一个跨平台的包管理器 + 环境管理器
能装什么 Python/R 包、C 语言库、生信工具(如 samtools、bwa)等几乎所有东西
核心能力 自动处理依赖关系——你装 A,它自动帮你装 A 依赖的 B、C、D
白话比方 像手机上的"应用商店",但还能帮你管理不同手机(环境)

1.3 Docker 是什么

项目 说明
是什么 一个容器化平台(容器 = 轻量级虚拟机)
能做什么 把软件 + 配置 + 系统库全部打包,任何机器上都能运行
核心能力 完全隔离、一次构建到处运行
白话比方 就像国际物流的"集装箱"——不管里面装什么,码头的吊车都能吊走,不用关心内容

1.4 Conda vs Docker:区别和联系

┌─────────────────────────────────────────────────────┐
│  你的电脑(宿主机 Host)                              │
│                                                     │
│  ┌───────────── Docker 容器 ──────────────┐         │
│  │  ┌─── Conda 环境 A ───┐  ┌─ 环境 B ─┐ │         │
│  │  │ Python 3.8         │  │ R 4.2    │ │         │
│  │  │ MetaPhlAn 4        │  │ DESeq2   │ │         │
│  │  └────────────────────┘  └──────────┘ │         │
│  │  Ubuntu 22.04(容器操作系统)           │         │
│  └────────────────────────────────────────┘         │
│                                                     │
│  ┌─── Conda 环境 C(宿主机直接用)───┐              │
│  │ Python 3.10 + scikit-learn        │              │
│  └───────────────────────────────────┘              │
└─────────────────────────────────────────────────────┘

一句话总结: Conda 管软件包版本,Docker 管整个运行系统。Docker 里面也可以用 Conda。


二、Conda 详解

2.1 安装选择:Miniconda vs Anaconda vs Mamba

工具 大小 特点 适合谁
Miniconda ~80MB 最小安装,只有 conda + Python,需要什么装什么 推荐生信用
Anaconda ~3GB 预装 250+ 科学计算包 数据科学入门者,不推荐服务器
Mamba ~80MB Conda 的加速替代品,解析依赖快 10-100 倍 强烈推荐,尤其装大型生信工具
Micromamba ~10MB 纯 C++ 实现的 Mamba,无需 Python 极简需求/Docker 内使用
# === 安装 Miniconda(推荐方式)===
# 下载安装脚本
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

# 运行安装(-b 表示静默安装,不用一直按回车)
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3

# 初始化 conda(让 conda 命令生效)
~/miniconda3/bin/conda init bash

# 重新加载终端配置
source ~/.bashrc

# === 安装 Mamba(推荐加速器)===
# 在 base 环境里装 mamba
conda install -n base -c conda-forge mamba

# 之后把所有 conda install 替换成 mamba install 即可,速度飞起

2.2 创建、激活、删除环境

# --- 创建环境 ---
# 创建一个名叫 metagenomics 的环境,指定 Python 3.9
conda create -n metagenomics python=3.9
# 白话:建一个叫 metagenomics 的隔离房间,里面装 Python 3.9

# 创建时直接装多个包(推荐!一次性装好,减少依赖冲突)
conda create -n qc_env python=3.9 fastqc multiqc trimmomatic
# 白话:一次性把工具都装好,比一个一个装冲突少

# --- 激活环境 ---
conda activate metagenomics
# 白话:进入 metagenomics 这个房间,之后所有操作都在这个环境里

# --- 退出环境 ---
conda deactivate
# 白话:从当前房间出来,回到默认的 base 环境

# --- 查看所有环境 ---
conda env list
# 白话:列出你电脑上所有的"房间"

# --- 删除环境 ---
conda remove -n metagenomics --all
# 白话:把 metagenomics 这个房间彻底拆掉

# --- 克隆环境(复制一份一模一样的)---
conda create --name new_env --clone old_env
# 白话:把 old_env 房间里的所有东西完整复制到 new_env

2.3 安装包

# 从默认 channel 安装
conda install numpy pandas

# 从指定 channel 安装(生信工具必须指定 bioconda)
conda install -c bioconda -c conda-forge metaphlan
# 白话:从 bioconda 商店下载 MetaPhlAn

# 用 mamba 加速安装(强烈推荐)
mamba install -c bioconda -c conda-forge humann

# 指定版本安装
conda install samtools=1.17

# 用 pip 安装(conda 里没有的包才用 pip)
pip install some-python-package
# 注意:先用 conda 装完所有能装的,最后才用 pip!

# 查看当前环境安装了什么
conda list

# 搜索包是否存在
conda search bwa
mamba search -c bioconda kraken2

2.4 Channels(频道/软件源)

白话比方: Channel 就像不同的"应用商店"。苹果商店、安卓商店卖的 app 不一样。

Channel 名称 说明 包含内容
defaults Anaconda 官方默认频道 基础科学计算包(numpy, pandas...)
conda-forge 社区维护的最大频道 几乎所有开源软件,更新快
bioconda 生信专用频道 9000+ 生信工具(bwa, samtools, kraken2...)
# 配置 channel 优先级(写入 ~/.condarc 文件)
conda config --add channels defaults
conda config --add channels bioconda
conda config --add channels conda-forge
# 优先级从下到上:conda-forge > bioconda > defaults

# 设置严格的 channel 优先级(推荐,避免混乱)
conda config --set channel_priority strict
# 白话:如果 conda-forge 有这个包,就绝不从 defaults 装

# 查看当前 channel 配置
conda config --show channels

重要规则: 生信工具安装时,channels 的顺序必须是:

conda-forge(最高优先级)
bioconda
defaults(最低优先级)

2.5 environment.yml 导出与导入

# --- 导出当前环境(包含所有精确版本号)---
conda env export > environment.yml
# 白话:把当前房间的"装修清单"导出来,精确到每个螺丝钉的型号

# --- 导出跨平台版本(推荐分享用)---
conda env export --from-history > environment.yml
# 白话:只导出你手动装的包,不含自动依赖,跨平台兼容性好

# --- 从 yml 文件创建环境(别人给你的清单)---
conda env create -f environment.yml
# 白话:照着别人的"装修清单"复制一个一模一样的房间

# --- 更新已有环境 ---
conda env update -f environment.yml --prune
# --prune:删掉 yml 里没有但环境里有的包

environment.yml 示例(你的 T2D 项目可以用):

# environment.yml - T2D 宏基因组分析环境
name: t2d_metagenomics
channels:
  - conda-forge
  - bioconda
  - defaults
dependencies:
  - python=3.9
  - metaphlan=4.0
  - humann=3.7
  - kraken2=2.1.3
  - bowtie2=2.5
  - samtools=1.17
  - seqkit
  - multiqc
  - pandas
  - matplotlib
  - pip:
    - scikit-learn==1.3.0

2.6 常见问题排查

问题 原因 解决方法
Solving environment 卡住几十分钟 依赖解析太慢 用 mamba 替代 conda
PackagesNotFoundError Channel 没配对 加上 -c bioconda -c conda-forge
CondaHTTPError 网络问题(国内常见) 换清华/中科大镜像源
装了包但 command not found 没激活环境 conda activate 环境名
conda 和 pip 冲突 pip 装的包覆盖了 conda 的 优先用 conda,pip 放最后
环境突然坏了 混合用 conda 和 pip 后又 conda install 重建环境(从 yml 恢复)
# 换国内镜像源(解决下载慢问题)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda

# 清理缓存(磁盘空间不够时)
conda clean --all
# 白话:清理下载缓存和没用的包,腾出硬盘空间

三、Docker 详解

3.1 Docker 原理白话

传统方式: 你装软件时需要在自己电脑上装各种依赖库,版本对不上就崩。

Docker 方式: 开发者把软件 + 所有依赖 + 操作系统配置打包成一个"镜像"(image),你下载这个镜像,一条命令就能跑起来,不用装任何东西。

传统安装:
你的电脑 → 装 Python → 装 gcc → 装 zlib → 装 samtools → 可能还是报错😭

Docker 方式:
你的电脑 → docker pull samtools镜像 → docker run → 直接能用🎉

核心原理(面试能说的): - Docker 利用 Linux 内核的 namespace(命名空间,实现进程隔离)和 cgroup(控制组,限制资源使用)技术 - 容器共享宿主机内核,不需要模拟整个操作系统,所以比虚拟机快很多 - 镜像是分层的(layered),多个容器可以共享底层,节省磁盘

3.2 镜像 vs 容器

概念 英文 白话比方 特点
镜像 Image Image 软件的"安装光盘" 只读的模板,不会变
容器 Container Container 用光盘装好的"运行中的电脑" 可读写,运行中的实例
仓库 Registry Registry "光盘商店"(如 Docker Hub) 存放和分享镜像的地方
关系:镜像 --运行--> 容器(一个镜像可以启动多个容器)
比方:Class(类)--实例化--> Object(对象)

3.3 Dockerfile 基础

Dockerfile 是镜像的"构建说明书"——告诉 Docker 怎么一步一步搭建环境。

# === 示例:构建一个宏基因组分析环境的 Docker 镜像 ===

# FROM:基础镜像,从哪个"底子"开始建(相当于选择操作系统)
FROM continuumio/miniconda3:latest

# LABEL:镜像的标签信息(作者、描述等)
LABEL maintainer="pengwenqiang" description="T2D metagenomics analysis"

# RUN:在镜像里执行命令(装软件用的)
# 配置 bioconda channels
RUN conda config --add channels defaults && \
    conda config --add channels bioconda && \
    conda config --add channels conda-forge && \
    conda config --set channel_priority strict

# 安装 mamba 加速器(基础镜像没有自带 mamba)
RUN conda install -n base -c conda-forge mamba -y

# 安装生信工具
RUN mamba install -y \
    metaphlan=4.0 \
    humann=3.7 \
    samtools=1.17 \
    seqkit \
    && conda clean --all -y

# WORKDIR:设置工作目录(相当于 cd 到这个目录)
WORKDIR /data

# COPY:把本地文件复制到镜像里
COPY scripts/ /app/scripts/

# ENV:设置环境变量
ENV PATH="/opt/conda/bin:$PATH"

# CMD:容器启动时默认执行的命令
CMD ["bash"]

Dockerfile 常用指令速查:

指令 作用 白话
FROM 指定基础镜像 选一个"毛坯房"开始装修
RUN 执行命令(装软件) 装修过程中的每一步操作
COPY 复制本地文件到镜像 把你的东西搬进去
WORKDIR 设置工作目录 指定"在哪个房间干活"
ENV 设置环境变量 贴个便签提醒自己
CMD 容器启动默认命令 开门后自动做什么
ENTRYPOINT 容器入口命令(不可覆盖) 这个房间的核心功能
EXPOSE 声明端口 告诉别人从哪个门进来

3.4 BioContainers — 生信预制镜像

BioContainers 是生信社区维护的容器仓库,几乎每个 bioconda 包都有对应的 Docker 镜像。

# 直接拉取生信工具的官方镜像(不用自己构建!)
docker pull biocontainers/samtools:v1.17_cv1
docker pull biocontainers/fastqc:v0.12.1_cv1

# 也可以用 quay.io(BioContainers 的官方仓库)
docker pull quay.io/biocontainers/metaphlan:4.0.6--pyhca03a8a_0

# 使用:直接运行容器里的工具
# 注意:用 -o 指定输出文件,而不是用 > 重定向(重定向会在宿主机执行,可能路径不对)
docker run --rm -v $(pwd):/data biocontainers/samtools:v1.17_cv1 \
    samtools view -bS -o /data/sample.bam /data/sample.sam

BioContainers 的优势: - 不用自己写 Dockerfile,直接用 - 版本固定,可复现 - 和 bioconda 一一对应:bioconda 有的包,BioContainers 就有镜像

3.5 Docker 常用命令

# === 镜像操作 ===

# 从 Docker Hub 下载镜像
docker pull ubuntu:22.04
# 白话:从"光盘商店"下载 Ubuntu 22.04 的"安装光盘"

# 查看本地所有镜像
docker images
# 白话:看看你本地有哪些"安装光盘"

# 从 Dockerfile 构建镜像
docker build -t my_bioinfo:v1 .
# -t:给镜像起名字   .:Dockerfile 在当前目录
# 白话:按照说明书(Dockerfile)做一张新的"安装光盘"

# 删除镜像
docker rmi my_bioinfo:v1

# === 容器操作 ===

# 运行容器(交互模式)
docker run -it ubuntu:22.04 bash
# -i:交互模式  -t:分配终端  bash:进入命令行
# 白话:用这张光盘启动一台新电脑,然后进入它的命令行

# 运行容器(挂载本地目录)★ 生信最常用 ★
docker run -it --rm -v /home/pweaz/data:/data my_bioinfo:v1 bash
# --rm:退出后自动删除容器(不留垃圾)
# -v 本地路径:容器路径:把本地目录"映射"进容器
# 白话:启动容器的同时,让容器能读写你电脑上的文件

# 后台运行容器
docker run -d --name my_analysis my_bioinfo:v1 sleep infinity
# -d:后台运行  --name:给容器起名字

# 进入正在运行的容器
docker exec -it my_analysis bash
# 白话:进入一个已经在后台跑的容器

# 查看正在运行的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a

# 停止 / 删除容器
docker stop my_analysis
docker rm my_analysis

# 一键清理:删除所有停止的容器 + 悬空镜像
docker system prune
# 白话:大扫除,清理所有没用的垃圾

四、Conda vs Docker 对比表

对比维度 Conda Docker
隔离级别 软件包/库级别 操作系统级别
共享内核 是(和宿主机相同) 是(比虚拟机轻)
安装难度 简单,一行命令 需要 root 权限或加入 docker 组
启动速度 即时(activate 秒切) 秒级(比虚拟机快)
镜像大小 无镜像概念,环境占 100MB-2GB 通常 200MB-2GB
可复现性 environment.yml(跨平台有时不兼容) Dockerfile(完全可复现)
适用场景 日常开发、快速试验 部署、发布、流程固化
学习曲线 中等
网络需求 安装时需要,使用时不需要 拉取镜像需要,运行时不需要
系统依赖 依赖宿主机系统库 自带所有系统库
HPC 集群 直接用 通常用 Singularity 替代
生信生态 bioconda(9000+ 包) BioContainers(对应 bioconda)

总结选择建议: - 日常分析开发 → Conda - 论文发表、保证可复现 → Docker / Singularity - 分享给别人用 → Docker(不用担心环境问题) - HPC 集群上跑 → Conda 或 Singularity(集群通常没 Docker 权限)


五、生信项目环境管理最佳实践

5.1 项目结构规范

t2d_project/
├── environment.yml          # Conda 环境定义文件(记录所有依赖)
├── Dockerfile               # Docker 构建文件(可选,发论文时用)
├── README.md                # 说明如何搭建环境
├── scripts/
│   ├── 01_qc.sh            # 质控脚本
│   ├── 02_assembly.sh      # 组装脚本
│   └── 03_binning.sh       # 分箱脚本
├── data/                    # 原始数据(不放进 Docker 镜像!)
└── results/                 # 分析结果

5.2 七条黄金法则

  1. 一个项目一个环境 —— 不要把所有工具都装在 base 里
  2. 创建时一次性装好 —— conda create -n env tool1 tool2 tool3 比逐个安装冲突少
  3. 用 mamba 替代 conda —— 解析依赖快 10-100 倍
  4. 先 conda 后 pip —— pip 装的包 conda 看不到,所以 pip 永远最后用
  5. 导出 environment.yml —— 每次环境稳定后都导出一份,相当于存档
  6. 版本号要锁定 —— samtools=1.17 而不是只写 samtools
  7. 定期清理 —— conda clean --all 清缓存,docker system prune 清容器

5.3 与 T2D 项目的关联

你现在有三个 conda 环境:

环境名 用途 建议
t2d_ml 机器学习(随机森林分类) 保持,导出 yml 备份
bioinfo 通用生信分析 建议拆分为更具体的环境
qc_tools 质控(FastQC/MultiQC) 保持,轻量环境

建议优化:

# 1. 为每个环境导出备份
conda activate t2d_ml
conda env export --from-history > t2d_ml_environment.yml

conda activate bioinfo
conda env export --from-history > bioinfo_environment.yml

conda activate qc_tools
conda env export --from-history > qc_tools_environment.yml

# 2. 考虑拆分 bioinfo 环境
# 如果 bioinfo 里同时有组装工具和注释工具,建议拆成:
# - assembly_env(megahit, metaspades)
# - annotation_env(prokka, eggnog-mapper)
# 原因:组装工具和注释工具的依赖经常冲突

# 3. 为论文复现准备 Docker
# 把完整流程打包成 Docker 镜像,保证三年后还能跑

六、实操命令速查(每行中文注释)

6.1 Conda 从零到一

# ===== 第一步:安装 Miniconda =====
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 下载 Miniconda 安装脚本

bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3
# 静默安装到家目录下的 miniconda3 文件夹

source $HOME/miniconda3/bin/activate
# 临时激活 conda(让 conda 命令立即可用)

conda init bash
# 永久配置:以后每次开终端自动能用 conda

source ~/.bashrc
# 重新加载配置文件

# ===== 第二步:配置 channel =====
conda config --add channels defaults
conda config --add channels bioconda
conda config --add channels conda-forge
conda config --set channel_priority strict
# 配置频道优先级:conda-forge > bioconda > defaults

# ===== 第三步:安装 mamba 加速器 =====
conda install -n base -c conda-forge mamba -y
# 在 base 环境安装 mamba,之后用 mamba 替代 conda install

# ===== 第四步:创建项目环境 =====
mamba create -n t2d_meta python=3.9 metaphlan humann kraken2 -y
# 创建 T2D 宏基因组分析环境,一次性装好所有工具

conda activate t2d_meta
# 进入环境

# ===== 第五步:验证安装 =====
metaphlan --version
# 检查 MetaPhlAn 版本
humann --version
# 检查 HUMAnN 版本

# ===== 第六步:导出环境 =====
conda env export > environment.yml
# 导出完整环境快照(含精确版本号)

conda env export --from-history > environment_portable.yml
# 导出可移植版本(只含手动安装的包)

6.2 Docker 从零到一

# ===== 第一步:安装 Docker =====
# Ubuntu 上安装 Docker
sudo apt update
# 更新软件包列表

sudo apt install -y docker.io
# 安装 Docker

sudo systemctl start docker
# 启动 Docker 服务

sudo systemctl enable docker
# 设置 Docker 开机自启

sudo usermod -aG docker $USER
# 把当前用户加入 docker 组(这样不用每次都 sudo)
# 注意:加完后要重新登录才生效

# ===== 第二步:验证安装 =====
docker --version
# 查看 Docker 版本

docker run hello-world
# 运行测试容器,看到 "Hello from Docker!" 就成功了

# ===== 第三步:使用生信容器 =====
# 下载 samtools 镜像
docker pull biocontainers/samtools:v1.17_cv1
# 从 BioContainers 下载 samtools 的官方镜像

# 用容器运行 samtools
docker run --rm -v $(pwd):/data biocontainers/samtools:v1.17_cv1 \
    samtools flagstat /data/sample.bam
# --rm:运行完自动删除容器
# -v $(pwd):/data:把当前目录映射为容器里的 /data
# 最后面是要执行的命令

# ===== 第四步:构建自己的镜像 =====
# 先写一个 Dockerfile(内容见 3.3 节)
docker build -t t2d_analysis:v1 .
# 根据 Dockerfile 构建镜像,取名 t2d_analysis,版本 v1

# 运行自己构建的镜像
docker run -it --rm -v /home/pweaz/data:/data t2d_analysis:v1 bash
# 以交互模式启动容器,挂载数据目录

# ===== 第五步:推送镜像(分享给别人)=====
docker tag t2d_analysis:v1 yourusername/t2d_analysis:v1
# 给镜像打标签(加上你的 Docker Hub 用户名)

docker push yourusername/t2d_analysis:v1
# 推送到 Docker Hub(需要先 docker login)

6.3 Singularity(HPC 集群替代方案)

# 为什么要用 Singularity?
# HPC 集群通常不给 Docker 权限(Docker 需要 root),但支持 Singularity

# 从 Docker 镜像转换为 Singularity 镜像
singularity pull samtools.sif docker://biocontainers/samtools:v1.17_cv1
# .sif 是 Singularity 的镜像格式

# 用 Singularity 运行
singularity exec samtools.sif samtools --version
# exec:在容器里执行命令

# 挂载目录运行
singularity exec --bind /home/pweaz/data:/data samtools.sif \
    samtools view -bS /data/sample.sam -o /data/sample.bam
# --bind 相当于 Docker 的 -v,映射本地目录

七、面试怎么答

Q1:你在项目中是怎么管理软件环境的?

参考回答:

我在 T2D 宏基因组项目中使用 Conda 管理分析环境。按用途拆分为三个独立环境:t2d_ml 用于机器学习建模(scikit-learn、XGBoost),bioinfo 用于通用生信分析(samtools、seqkit),qc_tools 用于质控(FastQC、MultiQC)。

这样做的好处是:1)不同工具的依赖不会冲突;2)每个环境都导出了 environment.yml,保证可复现;3)使用 mamba 作为包管理加速器,解决 conda 解析依赖慢的问题。

如果需要保证长期可复现或分享给其他团队,我会用 Docker 把流程打包成镜像,配合 BioContainers 使用预构建的生信工具容器。

Q2:Conda 和 Docker 有什么区别?什么时候用哪个?

参考回答:

隔离级别不同:Conda 是软件包级别的隔离,共享宿主机操作系统;Docker 是操作系统级别的隔离,容器自带完整的系统库。

使用场景:日常开发和快速试验用 Conda,因为轻量、切换快;论文发表、流程部署或分享给他人时用 Docker,因为完全可复现。HPC 集群上通常没有 Docker 权限,会用 Singularity 作为替代。

两者也可以结合:Docker 容器内部安装 Miniconda,用 Conda 管理工具,外面用 Docker 打包成固定镜像。

Q3:你知道 bioconda 吗?怎么配置?

参考回答:

Bioconda 是专门为生物信息学工具维护的 Conda channel(频道),目前有超过 9000 个包,涵盖从序列比对(bwa、bowtie2)到宏基因组分析(MetaPhlAn、HUMAnN)的各类工具。

配置时需要注意 channel 优先级:conda-forge 最高,bioconda 其次,defaults 最低,并设置 channel_priority: strict。这样可以避免不同 channel 之间的包版本冲突。

使用时推荐用 mamba 替代 conda install 来加速依赖解析。

Q4:如果你的分析流程要保证三年后还能复现,你怎么做?

参考回答:

三个层次保证可复现:

  1. 代码层:用 Git 管理分析脚本,锁定每次运行对应的 commit。
  2. 环境层:导出 environment.yml(记录精确版本号),同时准备 Dockerfile。
  3. 数据层:记录原始数据的 MD5 校验值,公共数据库数据记录 accession number。

最稳妥的做法是把整个流程做成 Docker 镜像并推送到 Docker Hub 或 GitHub Container Registry。论文发表时附上镜像地址和运行命令,任何人都能一键复现。

Q5:Docker 的镜像和容器有什么区别?

参考回答:

镜像(Image)是只读的模板,相当于"安装光盘";容器(Container)是镜像的运行实例,相当于用光盘装好的"运行中的电脑"。

一个镜像可以启动多个容器,就像一张光盘可以装多台电脑。容器是可读写的,停止后可以删除或提交为新镜像。

类比面向对象编程:镜像是 Class(类),容器是 Object(实例化的对象)。

Q6:conda install 和 pip install 有什么区别?为什么推荐先用 conda?

参考回答:

conda 是通用包管理器,能安装 Python 包、R 包、C 库、系统工具等各类软件,并且自动处理依赖冲突;pip 只能安装 Python 包,不管理系统级依赖。

推荐先用 conda 的原因:1)conda 能全局处理依赖关系,pip 装的包 conda 看不到,容易导致冲突;2)生信工具(samtools、bwa)只能通过 conda/bioconda 安装,pip 装不了。

正确顺序是:先用 conda 装所有能装的包,最后才用 pip 装只有 PyPI 上有的 Python 包。装了 pip 包后尽量不要再 conda install。

Q7:什么是 Singularity?为什么 HPC 集群用它而不用 Docker?

参考回答:

Singularity(现在也叫 Apptainer)是一个为科学计算和 HPC 设计的容器运行时。

HPC 集群不用 Docker 的原因:Docker 需要 root 权限(或 docker 组权限),这在共享集群上是安全隐患——一个用户可能通过 Docker 获取 root 权限访问其他用户数据。

Singularity 的特点:以普通用户身份运行、不需要 daemon 进程、可以直接拉取 Docker 镜像转换、和集群调度系统(SLURM/PBS)兼容好。命令如 singularity pull docker://biocontainers/samtools:v1.17


八、关键术语对照表

英文术语 中文 白话解释
Environment 环境 一个隔离的软件"小房间"
Package 包/软件包 一个可以安装的软件
Dependency 依赖 运行某软件必需的其他软件
Channel 频道/软件源 下载软件的"商店"
Image 镜像 Docker 的"安装光盘"
Container 容器 镜像启动后的"运行实例"
Registry 注册表/仓库 存放镜像的"商店"(如 Docker Hub)
Dockerfile 构建文件 镜像的"装修说明书"
Volume 卷/挂载 让容器访问宿主机文件的"通道"
Layer 镜像的分层结构,每个 RUN 指令一层
Tag 标签 镜像的版本号(如 v1.17)
Namespace 命名空间 Linux 内核隔离技术(进程互相看不到)
Cgroup 控制组 Linux 内核资源限制技术(限制 CPU/内存)
Reproducibility 可复现性 别人能得到和你一样的结果
BioContainers 生信容器仓库 生信工具的预制 Docker 镜像集合
Singularity/Apptainer HPC 容器运行时 集群上替代 Docker 的工具

九、速记脑图

环境管理
├── Conda(软件包级别)
│   ├── 安装:Miniconda + Mamba
│   ├── 核心命令:create / activate / install / export
│   ├── Channel:conda-forge > bioconda > defaults
│   └── 输出:environment.yml
├── Docker(操作系统级别)
│   ├── 概念:镜像(只读) → 容器(运行)
│   ├── 核心命令:pull / build / run / exec
│   ├── 构建:Dockerfile
│   └── 生信生态:BioContainers
├── Singularity(HPC 替代)
│   └── singularity pull docker://xxx
└── 最佳实践
    ├── 一个项目一个环境
    ├── 先 conda 后 pip
    ├── 导出 yml 存档
    └── 发表用 Docker 固化

学习建议: Conda 是你每天都在用的工具,确保熟练掌握。Docker 理解概念 + 会用 BioContainers 的预制镜像即可。面试重点是能说清楚"为什么要环境管理"和"两者的区别与适用场景"。