一、Docker 基础

这一章,我们从零开始。你不是来学理论,是来亲手搭一个能分析镜像、看层、拆包的工具环境。那第一步就是搞清楚:Docker 到底是个什么东西,它跟传统虚拟机差在哪,以及怎么在你电脑上把它跑起来。

1.1 Docker 是什么?

Docker 是一个容器化平台。说白了,就是能把你的应用和它所需的一切——代码、系统库、配置文件——打包成一个叫「镜像」的东西,然后丢到任何有 Docker 的机器上直接运行。

我记得 2016 年刚接触 Docker 时,还很不理解:明明有虚拟机,为什么还要多此一举?后来我手动配过一次生产环境:从 Linux 内核参数到 Nginx 编译选项,再到 Python 包依赖……折腾了两天,结果还是漏了某个 .so 文件。嗯,从那以后,我再也没手搓过环境了。

一句话理解:Docker 让你把环境和代码塞进一个「标准化盒子」,走到哪,运行效果都一样。

1.2 Docker vs 虚拟机

很多人把 Docker 和虚拟机混为一谈。其实它们的核心差异在于「虚拟化层」在哪。

对比维度 传统虚拟机 Docker 容器
虚拟化方式 硬件级虚拟化(Hypervisor) 操作系统级虚拟化(内核共享)
启动速度 几十秒到几分钟 毫秒到秒级
资源占用 每个 VM 包含完整 OS,GB 级 共享宿主机内核,MB 级
隔离性 强(完全独立内核) 较弱(依赖 Namespace + Cgroups)
镜像体积 几 GB ~ 几十 GB 通常几十 MB ~ 几百 MB
典型场景 需要完整 OS 环境的测试 微服务、CI/CD、轻量化部署

你可能会问:既然隔离性弱,为什么还用 Docker?实际上大部分业务场景根本不需要完整虚拟化。我在项目中遇到过一台 64G 的物理机,跑 5 个 VM 就发烫,而换成 Docker 容器后轻松跑了 30 多个服务。代价只是偶尔调一下内核参数,性价比很高。

一个简单类比:虚拟机像搬家——每搬一次就要带整栋房子;Docker 像住酒店——只带个人物品(应用),房间(系统环境)酒店提供,还共享空调和水电(内核)。

1.3 Docker 安装配置

磨刀不误砍柴工,现在我们来装 Docker。我会覆盖三个主流系统,你自己选对应的。

1.3.1 Linux(以 Ubuntu 20.04/22.04 为例)

我个人习惯用官方的安装脚本,干净利落。

# 更新包索引
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

# 验证安装
sudo docker run hello-world

曾经我踩过的坑:在公司的代理网络下直接运行安装脚本会报 GPG 密钥超时。记得先配置 HTTP_PROXY 环境变量,或手动下载密钥文件。

1.3.2 macOS

macOS 上推荐用 Docker Desktop。去官网下载 .dmg 安装包,双击拖入 Applications 即可。安装后会在菜单栏出现小鲸鱼图标。

# 打开终端,验证版本
docker version

如果你是 M 芯片(ARM 架构),安装时 Docker Desktop 会自动安装 Rosetta 2 兼容层。我这里提醒一句:某些底层镜像(比如 alpine:3.18)已经原生支持 ARM,不用跑模拟,启动快得多。

1.3.3 Windows

Windows 上强烈建议用 WSL 2 + Docker Desktop 的方式。为什么?因为 Hyper-V 模式需要开启硬件虚拟化,而且与部分虚拟机软件冲突。

# 在 PowerShell (管理员) 中启用 WSL 2
wsl --install -d Ubuntu

# 安装 Docker Desktop for Windows,选择 WSL 2 后端

# 安装后打开 Docker Desktop,验证
docker info

小技巧:在 WSL 2 中执行 docker ps 时,Docker Desktop 会自动将命令转发给 Windows 的 Docker 守护进程。你不需要在 WSL 里单独装 Docker。

1.4 验证安装与配置

装好之后,我们跑一下最基本的命令,确认 Docker 能正常干活。

# 查看 Docker 版本信息
docker version

# 查看 Docker 系统信息(含内核版本、容器数量等)
docker info

# 运行一个测试容器
docker run hello-world

如果看到类似下面的输出,说明安装成功了:

Hello from Docker!
This message shows that your installation appears to be working correctly.

这里有个细节:docker run hello-world 实际上帮我们做了三件事——拉取镜像、创建容器、运行并打印信息、然后退出。回头学完镜像和容器部分,你再回来看这段日志,会豁然开朗。

1.5 知识体系全景

这一章的内容在整门课中处于什么位置?下面这张图能帮你快速建立全局概念。

第1章 Docker基础知识体系 Docker 基础 Docker 简介 Docker vs 虚拟机 安装配置 容器 vs 镜像 隔离/启动/资源/场景 Linux / macOS / Windows docker version / docker info / hello-world 本章目标:理解容器化思想,完成环境安装,为后续镜像分析做准备

整个课程我们会从这张图的根部开始,逐步展开到镜像分层、构建优化、安全扫描等高级话题。这一章你打下的基础——尤其是对容器本质的理解——会在后续所有章节反复出现。

1.6 避坑与最佳实践

  • 非 root 用户运行 Docker:默认情况下 docker 命令需要 sudo。避免每次都打 sudo 的最好方式是将当前用户加入 docker 组:sudo usermod -aG docker $USER,然后重新登录。曾经我第一次这样做后没注销,直接运行 docker ps 还是报权限错误,差点以为白配了。
  • 镜像源加速:国内拉取官方镜像时常超时。建议配置镜像加速器。以 Docker Desktop 为例,在设置 > Docker Engine 中修改 registry-mirrors:
{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
  • 磁盘空间管理:Docker 默认镜像和容器数据存储在 /var/lib/docker 下,长期使用会占用大量磁盘。定期执行 docker system prune -a 可以清理未使用的镜像和容器。我有个习惯:每次做完实验就顺手跑一次,免得下次启动时发现磁盘爆满。

调试小工具:如果你不确定 Docker 是否正常,可以运行 docker system df 查看磁盘使用情况;或者 docker events 实时监控守护进程事件。

1.7 小练习:验证你的环境

到现在为止,你的机器上应该已经装好了 Docker。我们来做个快速自检:

  1. 打开终端,输入 docker version,确保 Server 和 Client 版本都显示。
  2. 运行 docker run alpine echo "Hello Docker!",看能否看到输出。
  3. 执行 docker image ls,观察拉取下来的镜像列表。

如果这三步都顺利通过,恭喜你——你的 Docker 环境已经准备就绪。下一章我们将正式进入镜像的世界,看看一个容器到底是怎么被「包」起来的。

本章核心收获:

  • 理解 Docker 是轻量级容器,共享宿主机内核
  • 掌握 Docker 与虚拟机的关键差异(速度、体积、隔离性)
  • 能在 Linux / macOS / Windows 上正确安装并验证 Docker
  • 知道常见的踩坑点(权限、镜像加速、磁盘清理)