1. Docker 简介与安装

我记得 2013 年刚接触 Docker 时,它还是个连容器网络都不太稳定的毛头小子。当时团队被环境不一致搞得焦头烂额——开发机跑得好好的,测试环境就崩了,生产环境更是一言难尽。Docker 的出现,说白了就是把“环境配置”也塞进版本控制里,让“我的机器能跑”变成“任何机器都能跑”。

本章我们先聊 Docker 的来龙去脉,再把核心概念理清,最后亲手装好它。你想想看,如果连工具都没装顺手,后面的实践就是空谈。

1.1 发展历程:从 chroot 到容器生态

容器技术不是 Docker 发明的。1979 年的 chroot 就能让进程拥有独立文件系统;2000 年以后,FreeBSD Jails、Solaris Zones、Linux VServer 陆续出现。但直到 2013 年,Docker 公司把 LXC、cgroups、联合文件系统(UnionFS)等老技术打包成一个简单易用的命令行工具,容器才真正走进大众视野。

为什么 Docker 能火?因为它解决了“如何打包应用及其依赖”这个最头疼的问题。我早期用 RPM 打包时,经常漏掉某个系统库,排错能排到半夜。Docker 镜像把操作系统层、运行时、应用代码全压进一个不可变的层,交付后谁都不用再装依赖。

关键里程碑:
  • 2013 – Docker 开源,基于 LXC
  • 2014 – 发布 libcontainer,自研容器运行时
  • 2017 – 引入 containerd 和 runc,标准化 OCI
  • 2019 – Docker 被 Mirantis 收购,但引擎和镜像格式仍是事实标准

1.2 核心概念镜像、容器、仓库与引擎

我个人习惯把 Docker 理解成“乐高积木管理系统”。下面几个概念必须刻在脑子里:

概念类比说明
镜像积木图纸 + 零件包只读的模板,包含操作系统、软件、配置
容器搭好的成品镜像的可写运行实例,可以有状态
仓库积木商店存储和分发镜像的地方,如 Docker Hub
Docker 引擎你那双搭积木的手客户端‑服务端架构,负责拉、建、跑
曾经有同事问我:“容器就是轻量级虚拟机对吧?” 不对。虚拟机有独立内核,容器共用宿主机内核。你想想看,在 Windows 上用 Docker 跑 Linux 容器,底层其实走了 Hyper‑V 虚拟化,本质上还是借了虚拟机一层。千万别混淆。

还有一个常被忽视的点:Dockerfile。它是镜像的配方,每一条指令生成一个只读层。我踩过坑:在生产环境忘了清理 apt-get install 留下的临时文件,镜像体积从 200MB 膨胀到 800MB。后来加了一层 rm -rf /var/lib/apt/lists/*,效果立竿见影。

1.3 跨平台安装与验证

装 Docker 其实不难,但不同系统有小差异。我一个一个说。

Linux(以 Ubuntu 22.04 为例)

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /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
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
如果你在 CentOS 上装,记得先去掉旧版 docker、docker.io 包。我那次没卸干净,新引擎和旧组件冲突,dockerd 怎么都启不来。

macOS

直接下载 Docker Desktop for Mac 的 .dmg 安装包,拖进 Applications 即可。它会自动配置 HyperKit 虚拟机来跑 Linux 容器。注意:Apple Silicon 芯片上,Docker Desktop 默认用 Rosetta 2 转译 x86 镜像,也可以用 --platform linux/arm64 指定原生架构。

Windows

安装 Docker Desktop for Windows,需要启用 WSL 2 后端。如果你用 Windows 10/11 专业版,也可以选 Hyper-V 模式。安装完后任务栏出现鲸鱼图标就算成功。

Windows 上最常见的问题:WSL 2 没更新到最新。跑 wsl --update 可以解决。不然容器启动后直接报 “WSL 2 kernel not ready”。

验证安装

docker version          # 查看客户端和服务端版本
docker info             # 看引擎状态、容器数量、存储驱动等
docker run hello-world  # 经典验证,确认能拉镜像并运行

我第一次跑 docker run hello-world,看到那几行欢迎文字时,感觉像打开了新世界的大门——一个命令,应用就无感跑起来了。

1.4 知识体系总览

下面这张图把 Docker 的四个核心组成部分以及它们之间的关系画清楚了,方便你对照本章内容做整体记忆。

Docker 核心组件与工作流 Docker Client Docker Daemon containerd runc + 容器实例 Registry 工作流:client → daemon → containerd → runc 启动容器; daemon 从 registry 拉取/推送镜像,镜像层缓存可复用。

从图中你能看到,Docker 不是单体巨兽,而是由多个独立组件协作:客户端发命令,守护进程处理请求,containerd 管理容器生命周期,runc 真正运行容器。Registry 则负责镜像的存与取。这种分层设计让 Docker 非常灵活,也便于单独升级每个组件。

1.5 总结与避坑

安装完别急着跑。建议先做三件事:
  1. 执行 sudo usermod -aG docker $USER 把当前用户加入 docker 组,之后就不用每次加 sudo 了(注意:退出重登才能生效)。
  2. 配置镜像加速器(如阿里云、中科大的),不然从 Docker Hub 拉大镜像会等到怀疑人生。
  3. 检查存储驱动:docker info | grep Storage,推荐 overlay2,不要再用 lvm 或 devicemapper。

我曾经在大规模 CI 集群上遇到过 daemon 把磁盘写满的惨案——因为没设置日志轮转。后来在 daemon.json 里配了 "log-opts": {"max-size": "10m", "max-file": "3"},世界清净了。