一、Docker 简介与核心概念归纳总结

做质控流程可重复性验证,说白了就是让每次测试环境一模一样。我这些年踩过最大的坑,就是环境不一致——明明本地跑得好好的,到服务器就崩了。

Docker 的出现,就是来解决这个问题的。它把你的应用和底层依赖打包成一个轻量级的“集装箱”,走到哪儿都带着。

一句话总结:Docker 是应用打包、分发、运行的标准化引擎。它保证“在我这儿能跑,在你那儿也能跑”。

1.1 什么是容器?跟虚拟机有啥区别?

这个问题我刚入行时也迷糊过。容器不是虚拟机,它俩的架构天差地别。

对比维度 传统虚拟机 Docker 容器
底层原理 硬件虚拟化(Hypervisor) 操作系统级虚拟化
操作系统 每个 VM 包含完整 Guest OS 共享宿主机内核
启动速度 分钟级 秒级乃至毫秒级
资源开销 高(GB 级内存占用) 低(MB 级,仅多进程隔离)
可移植性 依赖 Hypervisor 兼容性 依赖 Docker 引擎,镜像即移
质控场景适配性 重,难以快速复制环境 轻,一键拉起质控环境

我个人习惯:做质控验证时,能用容器绝不用虚拟机。原因很简单——启动一个质控环境只需几秒钟,而不是等虚拟机开机。我最早用 Vagrant 管理测试环境,后来全切到了 Docker,效率不是一个量级。

1.2 Docker 的核心技术栈

Docker 里常说的几个核心概念,你得一个个吃透。

  • 镜像(Image):一个只读的模板,包含操作系统基础层、运行时、依赖库和你的应用代码。比如 ubuntu:22.04 就是一个基础镜像。
  • 容器(Container):镜像的运行实例。你可以启动、停止、删除容器,就像操作一个轻量级进程。
  • 仓库(Repository):存储镜像的地方。Docker Hub 是最常用的公共仓库,企业内部也可以用 Harbor 自建。
  • Dockerfile:定义镜像构建步骤的脚本文件。写 Dockerfile 就像写“环境安装说明书”。
  • 数据卷(Volume):持久化容器数据的机制。质控过程中产生的日志、报告,都该挂在 Volume 里。

这五个概念串联起来,就是 Docker 的日常操作流程。

我曾经踩过一个坑:在 Dockerfile 里直接用 RUN apt-get install 不加 --no-install-recommends,结果构建出的镜像多了几百兆无用的推荐包。质控环境不是越全越好,要干净、要最小化。记住,镜像越大,拉取越慢,质控链路越脆弱。

1.3 镜像的分层结构

你想想看,为什么 Docker 镜像能那么灵活?核心在于它的分层结构。

每个 Dockerfile 里的 RUN、COPY、ADD 指令都会生成一个只读层。这些层堆叠起来,就是完整的镜像。容器启动时,Docker 在最上层加一个可读写层(容器层),所有修改都写在这里。

这样做的好处很明显:

  • 缓存加速:如果某个层没变,构建时直接复用缓存。我见过一个项目,通过优化 Dockerfile 层顺序,构建时间从 10 分钟降到了 30 秒。
  • 节省空间:多个容器共享基础层,宿主机磁盘占用大幅降低。
  • 版本追溯:每个层都有唯一哈希值,谁动过哪个层一清二楚——这简直就是为质控可重复性量身定做的。

下面这张图展示了 Docker 的核心知识体系:从镜像分层到容器生命周期,再到数据持久化和网络通信。

Docker 核心知识体系框架图 Docker 核心知识体系 Docker 引擎 镜像(Image) 分层结构 Dockerfile 定义 只读层 容器(Container) 运行状态:运行/停止/删除 可读写层 命名空间隔离 仓库(Repository) Docker Hub / 私有仓库 镜像 push / pull 版本标签管理 数据卷(Volume) 持久化质控日志、报告 卷挂载 vs 绑定挂载 网络(Network) 桥接 / Host / Overlay 容器间通信

1.4 容器生命周期管理

容器的生命周期很简单:创建 → 启动 → 运行 → 停止 → 删除。但在质控场景里,每个阶段都有讲究。

我常用的基本命令:

# 从镜像启动容器
docker run -d --name my-qc-env ubuntu:22.04 sleep 3600

# 查看运行中的容器
docker ps

# 进入容器执行命令
docker exec -it my-qc-env bash

# 停止容器
docker stop my-qc-env

# 删除容器(注意:质控做完一定删,不要留僵尸)
docker rm my-qc-env

# 查看镜像
docker images

# 拉取指定版本镜像
docker pull ubuntu:22.04

# 从 Dockerfile 构建镜像
docker build -t my-qc-image:v1.0 .

我建议你养成一个习惯:每个质控任务跑完,都用 docker rm -f 清理干净。我在团队里推行过“容器随用随删”的规范,服务器资源利用率直接翻倍。记住:容器是无状态的,需要保留的就写到 Volume 里。

1.5 Docker 在质控可重复性中的作用

说白了,质控流程最怕的就是“这次跑过了,下次跑不过”。Docker 给了你三个杀手锏:

  • 环境一致:无论本地、CI 还是生产服务器,同一个镜像跑出来的环境绝对一致。
  • 版本锁定:镜像标签(如 ubuntu:22.04)绑定了完整的软件栈,不会因为操作系统更新而意外“升级”依赖。
  • 快速回滚:如果某个镜像版本出了问题,直接切回上一个标签的镜像就能还原环境。我在一次质控事故中就是靠 docker pull my-qc-env:v1.0 半小时恢复的——要是传统环境,至少得折腾一整天。

记住一个原则:质控流程的每个依赖——操作系统、编译工具、数据库、中间件——都应该在 Dockerfile 里写死版本号。不要用 latest 标签,不要写 apt-get install python 而不指定版本。否则,你今天验证通过的东西,下周可能因为上游的一个小版本升级就挂了。

1.6 快速上手:第一个 Docker 环境

光说不练假把式。我带你跑一个最简单的质控环境验证流程。

第一步:安装 Docker

# Ubuntu 环境
sudo apt-get update
sudo apt-get install -y docker.io

# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 检查版本
docker --version

第二步:拉取一个干净的 Ubuntu 镜像

docker pull ubuntu:22.04

第三步:启动容器并验证环境

# 启动一个交互式容器
docker run -it --name qc-test ubuntu:22.04 bash

# 在容器内查看系统信息
cat /etc/os-release

# 安装一个常用质控工具
apt-get update && apt-get install -y curl jq

# 验证 curl 版本
curl --version

# 退出容器
exit

第四步:保存这个质控环境为镜像

# 基于现有容器创建新镜像
docker commit qc-test qc-base:v1.0

# 查看镜像
docker images

# 以后你可以用这个镜像快速拉起环境
docker run -it --rm qc-base:v1.0 bash

注意:docker commit 方式虽然方便,但不推荐用于生产。因为这种方式构建的镜像没有 Dockerfile 层记录,别人不知道这个镜像里到底装了什么东西。正式项目中,一定要把每个安装步骤写在 Dockerfile 里。这样才是可追溯、可复现的。

嗯,到这里 Docker 的核心概念已经说清了。镜像、容器、仓库、数据卷、网络——这五个东西你弄明白,后面的章节就会顺风顺水。接下来的课程,我们会一步步深入,把 Dockerfile 写得滴水不漏,再配合 CI 流水线,真正做到一键重现质控环境。