Docker 基础:安装与核心概念
开始聊 Docker 之前,我想先问你一个问题:你在做 MaxQuant 分析的时候,有没有被环境问题折腾过?
我记得有一次,实验室新来了个师弟,配了一个星期的 MaxQuant 依赖库,最后还是崩了。那天我从头到尾帮他查了一遍——编译器版本不对、底层系统库不一致、Qt 的依赖链断了一截……折腾到半夜。就在那个时候我下定决心,必须用 Docker 把这些乱七八糟的东西彻底管起来。
说白了,Docker 就是把你的软件连带着它运行所需要的全部环境,打包成一个独立的标准单位。无论你换到哪台服务器、哪个操作系统,只要装上 Docker,就能直接“拎包入住”。
这一节我们就从最基础的东西开始——安装 Docker,然后把镜像、容器、仓库这三个核心概念理清楚。
安装 Docker,其实没那么复杂
我建议你直接装 Docker Engine,而不是 Docker Desktop。Docker Desktop 虽然有漂亮的图形界面,但在 Linux 服务器上一般用不到,而且它还占了额外的资源。对咱们做生物信息学分析的人来来说,命令行操作反而更高效。
在 Ubuntu 系统上,装起来三步就够了:
# 更新包索引
sudo apt-get update
# 安装依赖并添加 Docker 官方 GPG 密钥和仓库
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动并验证
sudo systemctl start docker
sudo docker run hello-world
sudo docker run hello-world 后,看到 “Hello from Docker!” 的输出,才算安装成功。如果报错说权限不够,你的用户可能不在 docker 用户组里。可以用 sudo usermod -aG docker $USER 把自己加进去,然后退出重新登录。
装完之后我建议你立刻跑一次 docker version 检查一下版本。我用的是 24.0 以上的版本,支持了更多新特性,比如 BuildKit 构建器。如果你在生产环境,升级到比较新的稳定版会比较安心。
镜像、容器、仓库——三个概念吃透
这三个东西的关系,我习惯用一个比喻来理解。
镜像就像一个模板。它包含了你的程序、依赖、配置文件、环境变量……总之运行这个软件所需的一切。你可以把它看作一个只读的、静态的操作系统“快照”。
容器则是镜像运行时的实例。你可以启动、停止、删除容器,每个容器都是独立的沙盒环境。容器之间互不影响,你在容器里改文件、装软件,都不影响宿主机和其他容器。
仓库是用来存镜像的地方。Docker Hub 是个公共的镜像仓库,里面已经有了成千上万别人打包好的镜像——包括 Ubuntu、Python、R、甚至用容器装的 MaxQuant。
你想想看,如果你只是想做一次 MaxQuant 分析,根本不需要手动构建镜像。直接从仓库拉一个别人已经做好的版本就可以。
| 核心概念 | 类比 | 操作命令 | 典型示例 |
|---|---|---|---|
| 镜像 | 操作系统的 ISO 安装盘 | docker pull、docker images、docker build |
bioinformatics/maxquant:2.0.3.0 |
| 容器 | 运行在虚拟机里的操作系统 | docker run、docker ps、docker stop |
docker run -v /data:/data myimage |
| 仓库 | 共享光盘库、GitHub | docker push、docker search |
hub.docker.com、私有 Harbor |
slim 或 alpine 基础镜像来构建。
常用操作,上手就能用
下面这些命令我每天都在用,我建议你直接复制到终端练一练。
# 从 Docker Hub 拉取一个 Ubuntu 镜像
docker pull ubuntu:22.04
# 查看本地已经有的镜像
docker images
# 以交互模式运行一个容器
docker run -it --name my_first_container ubuntu:22.04 /bin/bash
# 你在容器里就可以像在普通 Ubuntu 里一样操作了
# 退出容器:exit
# 查看运行中的容器(加上 -a 可以看到所有容器,包括已停止的)
docker ps -a
# 删除一个容器
docker rm my_first_container
# 删除镜像
docker rmi ubuntu:22.04
你可能已经注意到了,docker run 后面的参数非常灵活。-it 让你交互式操作,--name 给你的容器起个名字,ubuntu:22.04 是镜像名加标签。像我这种天天用命令行的,80% 的 Docker 操作都集中在这几个命令上。
docker run -v /宿主机路径:/容器内路径 myimage。你可以把这个步骤当作一个固定流程来走。
拉取镜像的真实场景
第 5 章我们会正式开始构建 MaxQuant 镜像。但这里你先体验一下:从 Docker Hub 拉取一个现成的 MaxQuant 镜像看看。
# 我习惯在拉取前先搜索一下
docker search maxquant
# 直接拉取一个我个人验证过的版本
docker pull biocontainers/maxquant:v2.0.3.0
# 查看是否拉取成功
docker images | grep maxquant
拉下来的镜像大小可能超过 2GB,这个很正常。MaxQuant 本身是 .NET 应用,依赖 Mono 运行环境,再加上 .NET 运行库和底层系统库,体积自然不小。
SVG 知识体系图
下面这张图帮你把这一章的核心逻辑串起来:
从图上你可以看到完整的链路:
- 镜像仓库(比如 Docker Hub)里存放着成百上千个版本的 MaxQuant 镜像。
- 你在本地主机执行
docker pull命令,把镜像拉取到本地。 - 一次拉取,永久可用——之后每次创建容器都会基于这个镜像。
- Docker 引擎把镜像作为只读层,启动一个可写的容器层。
- 容器就是你最终运行分析的地方。
-v 参数)或者提交了镜像(docker commit)。如果你刚刚跑完一次 MaxQuant 分析,忘了挂载数据,那就只能重新跑一遍了——别问我怎么知道的。
好了,这一节的东西就这些。装好 Docker,理解镜像、容器和仓库的关系,后面的章节才有发挥的空间。你可以在终端里先跑一遍上面列的命令,哪怕只是拉几个基础镜像玩一玩,也比光看文档有用得多。