1. Docker 基础:简介、安装与配置

大家好,欢迎来到这门课。

开始之前,我想先聊聊为什么我们非要用 Docker 来跑 AlphaFold。说白了,生物信息学软件的环境依赖是出了名的“坑”。Python 版本、CUDA 版本、cuDNN 版本、系统库的 ABI 兼容性……稍微搭错一步,可能就要浪费一整天重装系统。我早期做蛋白质结构预测时,就在 Ubuntu 18.04 和 20.04 之间来回折腾过,编译 OpenMM 总是报错,后来发现是 glibc 版本不对。从那以后,但凡涉及多依赖的科研软件,我第一反应就是——扔进容器。

这一章,我们先打好地基。我个人习惯把 Docker 看作一个“轻量级虚拟机”,但它比虚拟机快得多,因为它共享宿主机的内核。你想想看,一个容器启动也就是毫秒级的事儿。

本章核心目标:让你在自己的电脑上装好 Docker,完成核心配置,并理解镜像、容器和仓库这三个最基础的概念。这样我们才能在后续章节里顺利把 AlphaFold 的整个环境“装进盒子”。

1.1 Docker 是什么?

Docker 是一个开源的容器化引擎。它的工作逻辑很简单:

  • 镜像(Image):一个只读的模板,里面包含了运行应用所需的一切——代码、运行时、系统工具、库、配置。可以理解成一个“快照”。
  • 容器(Container):镜像的运行实例。你可以启动、停止、删除它。它就像从镜像这个“类”里 new 出来的“对象”。
  • 仓库(Registry):存放镜像的地方。最常用的是 Docker Hub,里面已经有官方维护的 AlphaFold 镜像。

我举个例子吧。镜像就像你下载的一个游戏 ISO 文件,容器就是你用这个 ISO 加载并运行起来的游戏进程。进程之间相互隔离,共享宿主机内核,但看起来每台“机器”都是独立干净的。

给我的学生一个小提示:如果你曾经用过 Anaconda 的虚拟环境,那 Docker 的隔离性比 conda 要彻底得多。conda 只隔离 Python 包,Docker 隔离的是整个文件系统和进程空间。

1.2 核心概念与架构

这章的知识体系,我习惯用一张图来说明白。你看下面的架构:

Docker 核心知识体系 Docker 引擎 (daemon) 镜像 (Image) 只读模板 分层存储 容器 (Container) 运行实例 可读写层 仓库 (Registry) 镜像分发 Docker Hub 操作系统层:Linux / Windows WSL2 / macOS 核心工作流: 1. 从仓库拉取或构建一个镜像 2. 基于这个镜像启动一个容器 3. 在容器内运行 AlphaFold 或其他应用 4. 容器停止后,修改丢失;需要持久化时挂载数据卷

你看到了,Docker 引擎是核心,它负责管理镜像的拉取、容器的启停、网络和存储的分配。镜像和容器的关系是“类与对象”,仓库则是“软件包管理器”的服务器端。

1.3 在 Linux 上安装 Docker

我绝大多数线下项目都在 Linux 上跑,所以咱们优先讲 Linux。Ubuntu 是最常见的发行版。这里我直接贴命令,你复制粘贴就行。

第一步:卸载旧版本(如果有的话)

sudo apt-get remove docker docker-engine docker.io containerd runc

第二步:设置仓库

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
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

第三步:安装 Docker 引擎

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

装完以后,验证一下:

sudo docker run hello-world

如果你看到了 Docker 的欢迎信息,那就说明安装成功了。我在项目里遇到新手经常卡在这一步——没加 sudo 权限,或者仓库源没加对。记住,apt-get update 一定要在改完源之后重新执行一次。

1.4 在 Windows 上安装 Docker

Windows 平台我建议走 WSL2 路线。Docker Desktop 最新版已经强制依赖 WSL2 了,所以你要先装好 WSL。

我个人的做法是这样的:

  1. 以管理员身份打开 PowerShell。
  2. 执行 wsl --install,这会默认安装 Ubuntu。
  3. 重启电脑,从 Docker 官网下载 Docker Desktop for Windows。
  4. 安装时勾选“Use WSL 2 based engine”。
  5. 安装完成后,在设置里把默认 WSL 发行版指向你的 Ubuntu 实例。

警告:千万别在 Windows 上直接装 Docker Toolbox 那种老古董了。它用的是 VirtualBox,性能差,网络配置也麻烦。现在 WSL2 就是标准答案。

1.5 在 macOS 上安装 Docker

macOS 相对简单。去 Docker Hub 下载 Docker.dmg,拖到 Applications 里就行。不过有两个注意事项:

  1. Apple Silicon(M1/M2) 的用户,务必下载“Apple Chip”版本的 Docker Desktop。早期的 x86 镜像在 ARM 上可能跑不起来,但好在 AlphaFold 官方镜像已经支持多架构了。
  2. 资源限制:Docker 在 macOS 上默认跑在轻量虚拟机里。我建议你给 Docker 至少分配 4 核 CPU 和 8GB 内存。因为 AlphaFold 在跑推理时对显存和内存要求都很高。

1.6 安装后的基础配置

装好只是第一步。接下来这几项配置,我强烈建议你立刻做,不然以后会踩坑。

1.6.1 用户组配置(Linux)

每次敲 sudo docker 确实烦人。我们把自己加到 docker 组里,就能省掉 sudo 了。

sudo usermod -aG docker $USER
newgrp docker
docker run hello-world

这里要注意:加完组后需要重新登录才能生效。我曾经见过有人忘了重新登录,然后一直报权限错误,折腾了半天。

安全提醒:把用户加入 docker 组等于给了这个用户 root 权限。因为 docker 组用户可以通过 docker run -v /:/host 挂载宿主机根目录。生产环境慎用。

1.6.2 镜像加速器配置

国内拉 Docker Hub 的镜像有时慢得让人崩溃。我习惯配置一个加速器。这里以阿里云的为例:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://你的加速ID.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

你可以去各大云厂商的容器服务里申请一个加速器地址。腾讯云、华为云、网易也都提供。配置完以后,拉镜像的速度会从几十 KB/s 提升到几 MB/s。

1.6.3 数据持久化目录准备

AlphaFold 的模型参数文件有好几个 GB,每次启动容器都重新下载太慢了。我习惯在宿主机上建立一个数据目录,然后挂载到容器里。

mkdir -p ~/alphafold/data
mkdir -p ~/alphafold/output

这个目录在后面的章节里我们会反复用到。好了,到这里 Docker 的基础环境就搭建完毕了。

版本选择建议:我目前推荐 Docker Engine 24.x 或 Docker Desktop 4.25+。太老的版本在 GPU 支持上可能有兼容性问题。AlphaFold 需要 CUDA 11+,所以 Docker 版本别太旧。

快速检查清单

检查项 验证命令 预期结果
Docker 版本 docker version 显示 Client 和 Server 版本
无需 sudo docker ps 显示空列表,无权限报错
镜像加速生效 docker info | grep Mirrors 显示加速器地址
数据目录 ls ~/alphafold/data 目录存在且可写