2. Docker 安装与配置:把环境先搭起来

做批次质控的,最怕环境不一致。在我参与的几个 BIO 项目里,每次换机器就得重新装依赖、调路径、对版本,搞不好还要熬夜。
Docker 的出现,说白了就是把整个运行环境打包成一个“盒子”,到哪都能用。但前提是——你先把 Docker 装好,配对。

这一节,咱们就把安装、守护进程配置、镜像加速这三件事一次性搞定。我踩过的坑,这次你就不用再踩了。

2.1 各平台安装:别被花哨的安装步骤吓到

Docker 官方一直推荐 Docker Desktop,但我个人习惯——在 Linux 服务器上,直接装 Docker Engine 就够了,省资源,也方便后续的生产部署。而在 Mac 和 Windows 上,Docker Desktop 是最省事的选择。

Linux(Ubuntu / Debian)

我建议先卸载旧版本,再走官方的 apt 源。干净、可控。

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖工具
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

# 添加 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

# 设置仓库
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 Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

装完以后,记得把当前用户加到 docker 组,不然每次都得 sudo。嗯,这里有个小坑——我之前就是忘记这一步,结果跑 CI 的时候一直权限报错,排查了半天。

sudo usermod -aG docker $USER
newgrp docker   # 或者重新登录一次

Mac(Intel / Apple Silicon)

直接去 Docker 官网下载 Docker Desktop for Mac,双击安装。注意:Apple Silicon(M1/M2)版本对 x86 镜像会有 Rosetta 2 的兼容问题,但日常用问题不大。我在 M1 机器上跑过质控镜像,速度还不错。

安装完成后,点菜单栏里的小鲸鱼,确认状态是 Docker Desktop is running 就行。

Windows(WSL 2)

Windows 上我最推荐的方式是:启用 WSL 2,然后安装 Docker Desktop 并设置为 WSL 2 后端。这样性能损失最小,而且可以直接在 Ubuntu 子系统里用 docker 命令。

# Windows PowerShell(管理员)
wsl --install -d Ubuntu
# 之后重启,安装 Docker Desktop,并在设置中勾选
# “Use WSL 2 based engine”
注意: Windows 下不要直接安装 Docker Toolbox(老古董了),也不要用 Hyper-V 模式,除非你明确需要特殊网络隔离。WSL 2 方案是我目前在 Windows 上测试过的最稳的一条路。

2.2 Docker Daemon 配置:别让守护进程拖后腿

Docker Daemon 是后台服务,所有容器的启停、网络、存储都由它管。默认配置够用,但要上生产或者跑大数据量的质控流程,我建议改几个参数。

配置文件通常位于 /etc/docker/daemon.json(Linux/macOS),Windows 上在 Docker Desktop 的设置界面里也能改。下面是我在项目中常用的配置模板:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [],
  "data-root": "/data/docker"
}

我解释一下几个关键点:

  • log-driver & log-opts:限制日志文件大小,防止磁盘被日志撑爆。我有一次没设这个,跑了几轮质控后发现根目录满了,服务直接挂了。
  • storage-driver:overlay2 是目前最推荐的文件系统驱动,性能和稳定性都最好。
  • cgroupdriver:建议改成 systemd,否则和 kubelet 会有冲突。如果你只跑 standalone Docker,那保持默认也行。
  • data-root:我习惯把 Docker 数据目录挪到大盘上,避免挤占系统盘。

改完配置文件后,需要重启 Docker 服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

验证一下配置是否生效:

docker info | grep -E "Storage Driver|Logging Driver|Data Root"
配置项 说明 推荐值
log-driver 日志驱动类型 json-file
max-size 单个日志文件最大大小 10m
storage-driver 镜像与容器存储驱动 overlay2
data-root Docker 数据存储路径 非系统盘路径,如 /data/docker

2.3 国内镜像加速器:别让 pull 速度卡住你

你想想看,一个质控镜像可能几百 MB,要是从 Docker Hub 直接 pull,国内网络环境……嗯,我不说你也能猜到。我曾经在项目交付前一天,花了一个多小时等一个镜像,结果超时失败了。从那以后,我第一步就是配加速器。

国内可用的加速器主要有以下几种:

  • 阿里云容器镜像服务:需注册阿里云获取个人加速地址。
  • 腾讯云容器镜像服务:同样需注册,给专属加速域名。
  • 中科大 USTC 镜像站:无需注册,但稳定性看运气。
  • Docker 官方中国区:registry.docker-cn.com,但近年速度也不如以前了。

配置方法很简单,在 /etc/docker/daemon.json 中加上 registry-mirrors 字段即可:

{
  "registry-mirrors": [
    "https://xxxx.mirror.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
小技巧: 可以同时配置多个加速器地址。Docker 会逐个尝试,如果一个超时,自动切换下一个。我在项目中就放了阿里云和 USTC 两个,基本没遇到过 pull 不动的情况。

改完记得重启服务或者重新加载:

sudo systemctl daemon-reload
sudo systemctl restart docker

测试是否生效:

docker info | grep -A 5 "Registry Mirrors"

如果看到你配置的地址,说明加速器已经生效了。然后立刻 pull 一个镜像试试速度:

time docker pull nginx:latest

以前可能要等两三分钟,配置后几十秒就能拉下来,这就是质控流程里基础环境复现的第一步保障。

关键提醒: 镜像加速器只对 Docker Hub 的镜像生效。如果你用的是私有仓库或第三方仓库(如 quay.io、ghcr.io),加速器不生效,需要你单独配置代理或使用 registry-mirror 转发。这一点我在对接团队内部仓库时吃过亏。
Docker 安装与配置核心流程 ① 平台安装 Linux(apt) | Mac(Docker Desktop) | Windows(WSL 2 + Docker Desktop) ② Docker Daemon 配置 daemon.json 关键参数 存储驱动 overlay2 日志限制 10m x 3 cgroupdriver systemd ③ 国内镜像加速器 registry-mirrors:阿里云 / 腾讯云 / USTC / Docker中国区 配置完成后:sudo systemctl daemon-reload && sudo systemctl restart docker 验证命令:docker info | grep ...