第3章:Docker基础——安装与基本命令归纳总结

好了,经过前面两章的铺垫,我们终于要开始动手了。本章的目标非常明确:在你的机器上装好Docker,并掌握那些最常用的命令。我个人觉得,这是整个课程中最“接地气”的一章——因为这些命令,你在后面的每一次实操中都会用到。

说实话,Docker刚火起来那会儿,我还在用虚拟机跑流程。每次换个环境都要重新编译依赖,那叫一个痛苦。后来切到Docker,感觉整个世界都清净了。你想想看,一个命令就能拉起一个完整的环境,多爽。

3.1 安装Docker

安装这件事,不同系统差别挺大。我这里只讲最主流的Linux环境,因为我们的Visium分析最终大概率跑在服务器上。Windows和Mac的用户也别急,Docker Desktop装起来基本是下一步下一步的事。

Linux(以Ubuntu 20.04/22.04为例)

我个人习惯用官方的apt仓库来装,这样后续更新也方便。

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

# 2. 更新apt包索引
sudo apt-get update

# 3. 安装依赖包
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

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

# 5. 设置稳定版仓库
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

# 6. 再次更新索引,并安装Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 7. 验证安装
sudo docker run hello-world
小提示: 如果你在国内服务器上安装,拉取官方镜像可能会很慢。建议配置镜像加速器,比如阿里云或者中科大的。我曾经因为没配镜像,等一个基础镜像下载等了半小时……嗯,那以后我再也没忘过这步。

配置镜像加速器(以阿里云为例)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://your-mirror-id.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
注意: 上面的your-mirror-id需要替换成你自己的阿里云镜像加速器地址,每个人都不一样。登录阿里云容器镜像服务控制台就能看到。

3.2 Docker核心概念速览

在敲命令之前,我们先捋清楚三个最最核心的概念:镜像(Image)、容器(Container)和仓库(Repository)。

我建议你用面向对象编程的思路来理解:镜像就是类,容器就是实例。镜像是一个只读的模板,里面包含了运行环境的一切;容器是镜像运行后的实体,你可以对它进行增删改查,甚至把它保存成一个新的镜像。

为了方便理解,我画了一张图放在下面。这张图会贯穿我们整个课程,建议你多看几遍。

Docker核心概念关系图 Docker三大核心概念关系图 镜像仓库 (Docker Hub / 私有仓库) 镜像A: v1.0 镜像B: latest 镜像C: 2.0 docker pull 本地镜像 (只读模板) ubuntu:20.04 visium:1.0 python:3.9 docker run 运行中的容器 (可读写实例) 容器1 源自ubuntu:20.04 容器2 源自visium:1.0 容器3 源自python:3.9 容器4 源自visium:1.0 核心流程: 从仓库拉取镜像 → 本地保存 → 运行镜像生成容器 → 容器可以停止、删除、提交为新镜像 一个镜像可以生成多个容器,每个容器之间相互隔离,拥有独立的文件系统、网络和进程空间。

看到这张图了吗?整个Docker的工作流程说白了就是:从仓库拉取镜像到本地,然后用本地镜像启动容器。一个镜像可以同时启动多个容器,它们互不干扰。我在项目中遇到过有人把容器当虚拟机用,在里面装了一堆东西,结果后来想更新镜像才发现版本全乱了——这就是没理解好镜像和容器的关系。

3.3 最常用的Docker命令

命令这东西,背是背不完的。我建议你记住几个核心的,剩下的随用随查。下面这张表是我整理的“高频命令清单”,你可以保存下来当参考。

命令 作用 常用示例
docker pull 从仓库拉取镜像 docker pull ubuntu:20.04
docker images 列出本地所有镜像 docker images
docker run 从镜像启动容器 docker run -it ubuntu:20.04 /bin/bash
docker ps 列出运行中的容器 docker ps -a(列出所有容器)
docker stop 停止容器 docker stop container_id
docker rm 删除容器 docker rm container_id
docker rmi 删除镜像 docker rmi image_name
docker exec 进入运行中的容器 docker exec -it container_id /bin/bash
docker commit 将容器保存为新镜像 docker commit container_id my_visium:v1

3.4 实战演练:启动你的第一个容器

光说不练假把式。现在我们来实际操作一下,启动一个Nginx容器看看效果。

# 1. 拉取最新版Nginx镜像
docker pull nginx:latest

# 2. 后台运行一个Nginx容器,并映射端口
docker run -d --name my-nginx -p 8080:80 nginx:latest

# 3. 查看容器是否运行
docker ps

# 4. 访问测试(在浏览器打开 http://localhost:8080)
# 或者用curl测试:
curl http://localhost:8080

# 5. 进入容器内部看看
docker exec -it my-nginx /bin/bash

# 6. 退出容器
exit

# 7. 停止并删除容器
docker stop my-nginx
docker rm my-nginx

关键点解析:

  • -d:后台运行,不占用终端
  • --name:给容器起个名字,方便后续操作
  • -p 8080:80:把宿主机的8080端口映射到容器的80端口
  • -it:交互模式,配合/bin/bash进入容器命令行

我记得第一次成功跑起来的时候,看到Welcome to nginx!那个页面,心里还是挺激动的。说白了,Docker让环境部署变得像搭积木一样简单。

3.5 数据卷与文件拷贝

容器里的文件默认是临时的,一旦容器删除,数据就没了。但在生物信息学分析中,我们经常需要把分析结果保存到宿主机,或者把宿主机数据传入容器。这时候就需要数据卷(Volume)或者在容器与宿主机之间拷贝文件。

方式一:使用数据卷(推荐)

# 创建一个数据卷
docker volume create visium_data

# 挂载数据卷启动容器
docker run -d --name visium_analysis \
  -v visium_data:/workspace/data \
  visium_image:latest

方式二:使用bind mount(直接挂载宿主机目录)

# 将宿主机的 /home/user/visium_data 挂载到容器的 /data
docker run -d --name visium_analysis \
  -v /home/user/visium_data:/data \
  visium_image:latest
注意: bind mount需要写绝对路径,相对路径会报错。我之前就因为偷懒写了个./data,结果容器一直起不来,排查了半天才发现是路径问题。切记,绝对路径!

方式三:从宿主机拷贝文件到容器

# 从宿主机拷贝到容器
docker cp /path/to/local/file.txt container_id:/path/in/container/

# 从容器拷贝到宿主机
docker cp container_id:/path/in/container/result.txt /path/to/local/

这三种方式你根据实际场景选一种就行。我个人习惯用bind mount,因为可以直接在宿主机上编辑数据,容器里实时生效。但有些生产环境建议用数据卷,更安全。

3.6 查看日志与资源占用

调试的时候,日志是你最好的朋友。

# 查看容器日志(实时跟踪)
docker logs -f container_id

# 查看容器资源占用(CPU、内存、网络等)
docker stats

# 查看容器内部进程
docker top container_id

# 查看容器详细信息(IP地址、挂载卷等)
docker inspect container_id

我在做Visium分析的时候,经常用docker logs来跟踪分析进度,用docker stats看内存是不是吃满了——毕竟空间转录组数据量不小,容易撑爆内存。

3.7 本章核心知识清单

最后,我帮你把这一章的核心要点梳理一下,方便你复习时快速定位。

知识点 一句话总结 关键命令/操作
安装Docker 通过apt仓库安装Docker Engine apt-get install docker-ce
核心概念 镜像(类) → 容器(实例) → 仓库(存储) 学会区分这三个概念
镜像管理 拉取、查看、删除镜像 pull、images、rmi
容器管理 启动、停止、删除、进入容器 run、stop、rm、exec
数据持久化 数据卷或bind mount挂载目录 -v、docker cp
调试排查 查看日志、资源占用、详情信息 logs、stats、inspect
我的习惯: 每次启动容器时,我都会加上--name参数给它起个有意义的名字。不然容器多了之后你会看到一堆类似laughing_goldberg的随机名字,根本分不清谁是谁。以后我们在管理多个Visium分析任务时,这个习惯会帮你省下不少时间。

好了,第三章的内容就是这些。把命令多敲几遍,你很快就能形成肌肉记忆。接下来我们就可以正式进入Visium分析环境的Docker镜像构建了。