安装与环境
这一课你将能做到
- 在 Windows / macOS / Linux 任一平台完成 Docker 安装,并用
docker version 验证客户端与引擎都正常
- 配置国内镜像加速器,让
docker pull 从龟速变成秒级
- 跑通
hello-world 并拉取 MySQL 8.0 镜像,确认引擎、网络、存储三条链路全通
为什么要学
工具装不稳,后面 10 课全白搭。安装环节最容易踩的坑不在 Docker 本身,而在它的依赖上:Windows 要先有 WSL2、BIOS 要开虚拟化、国内网络要配加速器。把这些一次性处理干净,后面每课的命令才能顺畅执行。
同时这一课会帮你建立 Docker 的架构认知:docker 命令只是客户端,真正干活的是后台的 daemon。理解了这一点,你就明白为什么有「Docker Desktop」和「Docker Engine」两个东西、为什么 Linux 上默认要 sudo、为什么改配置要重启引擎。
本课程默认开发机是 Windows(Docker Desktop + WSL2),macOS 与 Linux 同样覆盖;生产部署场景(第 12 课)默认是 Linux 服务器 + Docker Engine。
先建立图像
你敲的命令 后台真正干活的
┌─────────────┐ REST API ┌──────────────────┐ ┌─────────────┐
│ docker CLI │ ───────────→ │ dockerd (daemon) │ ───→ │ Registry │
│ docker.exe │ │ 管镜像/容器/网络/卷 │ │ Docker Hub │
└─────────────┘ └──────────────────┘ └─────────────┘
三个名词先分清:
| 名词 | 是什么 | 装在哪 |
|---|
| Docker CLI | docker 命令行客户端 | 所有平台 |
| Docker Engine | 守护进程 + CLI + 运行时 | Linux 服务器(也可 Desktop 内置) |
| Docker Desktop | Engine + GUI + WSL2 集成的桌面套件 | Windows / macOS |
Windows 为什么需要 WSL2?因为 Linux 容器必须有 Linux 内核。WSL2 是微软提供的轻量级虚拟化 Linux 内核环境,Docker Desktop 把引擎跑在 WSL2 里,你在 PowerShell 敲命令,实际是转发给 WSL2 里的引擎。
跟着做
步骤 1:确认系统前提(Windows)
- Windows 10 64 位(2004 及以上,内部版本 19041+)或 Windows 11。
- 管理员身份打开 PowerShell,执行:
wsl --update
wsl --install
- 重启电脑。然后检查虚拟化是否开启:任务管理器 → 性能 → CPU → 「虚拟化:已启用」。若显示已禁用,需要进 BIOS 打开 Intel VT-x 或 AMD-V。
步骤 2:安装 Docker Desktop(Windows / macOS)
到 https://www.docker.com/products/docker-desktop/ 下载对应版本:
- Windows:安装时保持默认勾选 Use WSL 2 based engine。
- macOS:Apple 芯片(M1/M2/M3/M4)选 Apple Silicon 版。
- 安装完成后启动 Docker Desktop,等右下角鲸鱼图标/状态条变绿。
步骤 3:Linux 服务器安装(Ubuntu 22.04 为例)
# 卸载旧版(如果有)
sudo apt-get remove -y docker docker-engine docker.io containerd runc
# 安装依赖与官方 GPG 密钥
sudo apt-get update
sudo apt-get install -y 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 -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 免 sudo 使用 docker(重新登录 shell 后生效)
sudo usermod -aG docker $USER
步骤 4:验证安装
docker version # Client 和 Server 两段都有版本号才算引擎正常
docker info # 引擎详情:镜像数、容器数、存储驱动、操作系统
docker run hello-world # 拉取并运行官方测试镜像
hello-world 成功输出会包含一段「Hello from Docker!」——它证明三件事同时通了:CLI→daemon 通信、daemon→Registry 拉取、本地运行容器。
步骤 5:配置国内镜像加速
Docker Hub 在国内直连很慢且限流。打开 Docker Desktop → Settings → Docker Engine,在 JSON 里加 registry-mirrors:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1ms.run"
]
}
点 Apply & Restart(会重启引擎)。Linux 服务器则编辑 /etc/docker/daemon.json 后执行:
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info | grep -A 3 "Registry Mirrors" # 确认加速器已加载
更稳的做法:登录阿里云控制台 → 容器镜像服务 → 镜像加速器,获取你的专属加速地址(每个账号一个,长期稳定)。
步骤 6:拉取业务镜像做全链路验证
docker pull mysql:8.0
docker images # 应看到 mysql 8.0 一行
能稳定拉下来,说明加速器配置生效。这个镜像后面第 4、8、9、10 课都会反复使用。
讲清楚要点
- CLI 与 daemon 是 C/S 架构:
docker 命令通过 REST API(默认走 /var/run/docker.sock 或 TCP)与 daemon 通信。Linux 上 permission denied ... docker.sock 就是当前用户不在 docker 组,用 usermod -aG docker 解决。
- Docker Desktop 与 Engine 的定位:开发机用 Desktop(自带 GUI、WSL2 集成、资源限额设置);生产服务器用 Engine(纯命令行,systemd 管理服务)。命令完全一致,学一套两边通用。
- WSL2 是 Windows 跑 Linux 容器的基石:容器内是真正的 Linux 环境。想给 Docker 分配内存/CPU,在
.wslconfig 或 Docker Desktop → Resources 里调,而不是改容器参数。
- daemon.json 是引擎的全局配置文件:加速器、日志大小限制(
log-driver/log-opts)、insecure-registries 都在这里配,改完必须重启引擎。
- 版本号含义:
docker version 里 Client 是 CLI 版本,Server 是引擎版本。生产排障时先核对两边版本,太老的 CLI 对新引擎会缺命令。
你可能会懵的地方
-
Docker Desktop 和 Docker Engine 装哪个?
Windows/macOS 开发机:只能装 Desktop(它内部已经包含 Engine)。Linux:服务器装 Engine;Linux 桌面机两者皆可,纯命令行用 Engine 就够。
-
WSL2 和传统虚拟机是一回事吗?
思路类似(都是虚拟出一个 Linux 内核),但 WSL2 由系统组件 Hyper-V 轻量虚拟化实现,秒级启动、文件互访无缝,比装 VMware 轻得多。Docker Desktop 依赖它,不需要你再装 VMware/VirtualBox。
-
为什么 Linux 上 docker 命令要 sudo?
因为访问 daemon 的 socket 文件属主是 root。把自己加进 docker 组即可免 sudo——但要知道:docker 组权限约等于 root 权限,别把非运维同事加进去。
-
hello-world 到底干了什么?
它是一个十几 KB 的极简镜像,唯一动作是打印一段说明文字然后退出。它常驻镜像列表里,用 docker images 能看到,可 docker rmi hello-world 删掉。
-
拉镜像报 toomanyrequests 限流怎么办?
Docker Hub 对匿名用户按 IP 限流(约每 6 小时 100 次 pull)。解法:注册 Docker Hub 账号并 docker login(额度翻倍),或走配置好的加速器。
错法对照
| 错法 | 问题 | 正解 |
|---|
| Windows 上不开 WSL2 直接装 Desktop | 引擎起不来 | 先 wsl --install 再装 Desktop |
| 虚拟化没开就反复重装 Docker | 重装无用 | BIOS 开启 VT-x / AMD-V |
| 加速地址写进别的配置文件 | 不生效 | 写 daemon.json 的 registry-mirrors,重启引擎 |
| Linux 上一直 sudo docker | 权限绕过不统一 | usermod -aG docker $USER 后重新登录 |
用 apt 直接装 docker.io | 版本旧、缺 compose 插件 | 用官方 apt 源装 docker-ce 全家桶 |
| Desktop 一启动就卡住就卸载重装 | 治标不治本 | 先 wsl --shutdown 再重启 Desktop |
卡点急救
- 报错
WSL 2 installation is incomplete:管理员 PowerShell 执行 wsl --update,然后重启 Docker Desktop。
- Docker Desktop 卡在 Starting:PowerShell 执行
wsl --shutdown,等 10 秒再启动 Desktop;仍不行则检查 BIOS 虚拟化。
docker pull 超时/龟速:docker info 确认加速器已加载;加速地址失效就换列表里的另一个,或用阿里云专属地址。
- Linux 上
permission denied 连接 docker.sock:sudo usermod -aG docker $USER,注销重新登录(newgrp docker 可临时生效)。
- 端口
hello-world 都跑不起来报网络错误:检查公司代理——Docker Desktop → Settings → Resources → Proxies 填入代理地址。
面试常问
-
描述一下 Docker 的整体架构?
客户端 docker CLI 通过 REST API 调用 daemon(dockerd);daemon 负责构建、运行、管理容器,底层用 containerd + runc 创建进程;镜像从 Registry(Docker Hub / 私有仓库)拉取。三者可以分布在不同机器。
-
为什么 Windows 上能跑 Linux 容器?
Windows 自身内核不是 Linux,所以 Docker Desktop 用 WSL2 提供一个真正的 Linux 内核,容器跑在 WSL2 的轻量虚拟机里。Linux 容器永远需要 Linux 内核,这一点不因平台而变。
-
Docker Desktop 和 Docker Engine 的区别?
Engine 是核心(daemon + CLI + 运行时),Linux 原生;Desktop 是面向开发者的封装,额外提供 GUI、WSL2/Hyper-V 集成、资源限额、自动更新。命令行体验一致。
-
镜像加速的原理是什么?
配置的 mirror 相当于 Docker Hub 的只读缓存代理。拉取时 daemon 先请求 mirror,未命中再回源 Hub,命中后缓存后续请求直接返回。
自测三问
docker run hello-world 成功运行,证明了哪三条链路是通的?
- 为什么改了
daemon.json 必须重启 Docker 引擎?重启会影响正在运行的容器吗?
- Windows 上想限制 Docker 总共只用 8GB 内存,应该在哪里设置?
小结一句话
安装的本质是把「CLI → 引擎 → Registry」三条链路接通:Windows 靠 WSL2 供内核,国内靠加速器供网速,hello-world 是三条链路的统一验收标准。
延伸