一、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.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。我们来做个快速自检:
- 打开终端,输入
docker version,确保 Server 和 Client 版本都显示。 - 运行
docker run alpine echo "Hello Docker!",看能否看到输出。 - 执行
docker image ls,观察拉取下来的镜像列表。
如果这三步都顺利通过,恭喜你——你的 Docker 环境已经准备就绪。下一章我们将正式进入镜像的世界,看看一个容器到底是怎么被「包」起来的。
本章核心收获:
- 理解 Docker 是轻量级容器,共享宿主机内核
- 掌握 Docker 与虚拟机的关键差异(速度、体积、隔离性)
- 能在 Linux / macOS / Windows 上正确安装并验证 Docker
- 知道常见的踩坑点(权限、镜像加速、磁盘清理)