我第一次接触 Docker,是在一个凌晨两点的上线现场。当时要在三台服务器上部署一套微服务应用,依赖的中间件有 Nginx、Redis、MySQL、Nacos,每台机器的系统版本还不一样。运维同事用一个 Compose 文件,敲了两条命令,五分钟内把整条链路的服务全部拉起来了。那一刻我就意识到,容器化这东西不只是“又一个部署工具”,它直接改变了我们对环境、交付和运维的认知方式。
这篇随笔不是官方文档的翻译,也不是命令手册的堆砌,而是从我这些年实际使用 Docker 的经验里,把核心概念、安装选型、实战部署、排错思路串成一条线。里面的每一段命令、每一处配置都是我在真实环境里跑过的。如果你刚接触容器化,或者已经用了一阵子但总在奇怪的问题上卡壳,这篇文章应该能帮你把碎片化的知识拼成一张完整的图。
1. 先说清楚 Docker 到底是什么:别急着敲命令
很多人学 Docker 的第一步就是装环境、跑 hello-world,然后跟着教程敲了一堆命令,最后发现还是没搞懂这东西到底在解决什么问题。我建议你先花十分钟把三个核心概念想明白,后面所有操作都会顺理成章。
1.1 容器和虚拟机的本质区别:共用内核和自带内核
传统的虚拟机,比如 VMware 或 VirtualBox,是在宿主机之上模拟出一整套完整的硬件环境,然后在虚拟硬件里装一个完整的操作系统。这意味着每个虚拟机都包含一个完整的 Guest OS,占用几个 GB 的磁盘空间,启动时间以分钟计。
Docker 容器的思路完全不同。它利用 Linux 内核的 Namespace 和 Cgroup 两大特性,在同一个宿主机内核上把进程、文件系统、网络、用户空间隔离成一个个独立的“沙箱”。容器不包含操作系统内核,它只打包应用和执行应用所需的运行环境,比如库文件、依赖、配置。
这里有个很关键的推论:因为所有容器共享宿主机内核,所以 Linux 容器只能在 Linux 上原生运行。Windows 上的 Docker Desktop 是通过 WSL2(Windows Subsystem for Linux)创建一个轻量级 Linux 虚拟机,在虚拟机里跑容器引擎,这才实现了 Windows 下运行 Linux 容器。
用生活化的类比来说:虚拟机是“整租”,你自己装修、自己买家电;容器是“合租”,厨房卫生间都是公用的,你只需要带上自己的牙刷和毛巾。
1.2 镜像、容器、仓库:三件套的关系和核心命令
这三个概念是理解 Docker 的基石,很多人混淆是因为没抓住它们之间的关系。
- 镜像(Image):一个只读的模板,包含应用代码、运行环境、依赖库、配置文件。镜像是由一层一层的只读文件系统叠加而成的,这一层一层的结构就是 Docker 能高效分发和增量存储的根本原因。
- 容器(Container):镜像运行时的实例。当镜像被运行,Docker 会在镜像层之上加一个可写层,应用的所有写入操作都在这个可写层进行。容器可以启动、停止、删除,删除后可写层里的数据也会消失。
- 仓库(Repository):集中存放镜像的地方。官方的是 Docker Hub,国内也有各种镜像加速源。你可以把它理解成应用商店,需要什么镜像就拉什么下来。
对应到命令上,核心的链路是:
bash复制# 拉取镜像
docker pull nginx:latest
# 查看本地镜像列表
docker images
# 基于镜像创建并启动容器
docker run -d --name web-nginx -p 8080:80 nginx:latest
# 查看运行中的容器
docker ps
# 进入容器内部交互式操作
docker exec -it web-nginx bash
# 停止和删除容器
docker stop web-nginx
docker rm web-nginx
# 删除镜像
docker rmi nginx:latest
这套命令你不需要死记,理解了层次关系后自然就能顺下来:pull 拿镜像,run 起容器,exec 进容器,ps 查状态,rm 清环境。
1.3 什么时候该用 Docker,什么时候不该用
这个判断比任何命令都重要。我见过很多人把 Docker 当成万能药,什么项目都往里塞,结果给自己制造了一堆麻烦。
适合用 Docker 的场景:
- 环境不一致问题突出:开发环境跑得好好的,一到测试或生产就崩溃,Docker 把整个运行环境打包后,这个问题直接消失。
- 多版本依赖共存:同一个机器需要跑多个不同版本的 Java、Python、MySQL,用容器隔离是最干净的方案。
- 微服务架构:服务多了之后,每个服务单独部署、单独扩缩容,Docker 加编排工具是标配。
- 快速搭建临时环境:比如测试某个软件、跑个靶场、搭个数据库,用完即焚,不污染宿主机。
- CI/CD 流水线:打包、测试、发布各环节都需要干净且一致的构建环境,容器是最佳载体。
不适合用 Docker 的场景:
- 需要极致性能的计算密集型任务:容器有轻微的性能损耗,虽然很小,但高频计算、高性能计算集群一般不用。
- 桌面级 GUI 应用:虽然可以通过 X11 或 VNC 做图形转发,但体验一般,不如原生安装。
- 需要实时访问宿主机特殊硬件的场景:比如某些加密狗、特殊 USB 设备,容器里适配很麻烦。
- 单机单应用且没有环境冲突:杀鸡不必用牛刀,多一层反而增加运维复杂度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:安装 Docker 背后的原理和选型
环境安装这部分最容易踩坑的是 Windows 用户。我看到热搜里大量关于“Docker Desktop 安装”“虚拟化未检测到”“D盘安装”“一直 starting”的问题,本质上都是没理解 Docker Desktop 在 Windows 上的运行机制。这里把 Linux 和 Windows 两条路线都说清楚。
2.1 Linux 上安装 Docker:官方源和镜像加速
在 Linux 上安装 Docker 有两种途径,一种是直接用发行版自带的软件源安装(比如 apt 或 yum),另一种是使用 Docker 官方提供的安装脚本。我推荐先用官方脚本安装,因为发行版源里的版本往往偏旧,后续会遇到兼容性问题。
以 Ubuntu 22.04 为例,官方推荐的方式是先卸载旧版本,然后通过官方 apt 源安装:
bash复制# 卸载可能存在的旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get 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
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
CentOS 7 的安装思路一致,只是包管理器从 apt 换成了 yum,这里不展开。
安装完成后,需要把当前用户加入 docker 组,否则每次执行 docker 命令都要加 sudo:
bash复制sudo usermod -aG docker $USER
# 重新登录终端后生效
然后是配置镜像加速器。这一步非常重要,特别是国内网络环境,直接从 Docker Hub 拉镜像速度会非常慢。在 /etc/docker/daemon.json 中写入:
json复制{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
保存后重启 Docker 服务:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
提示:镜像加速器只是拉取镜像时使用,不影响已拉取镜像的运行。不同加速源的可用性会变化,建议多配几个备选。
2.2 Windows 上安装 Docker Desktop:WSL2 是核心
Windows 上的 Docker Desktop 从 2022 年开始默认基于 WSL2 运行。它是这样工作的:WSL2 会在 Windows 上运行一个轻量级虚拟机,这个虚拟机内嵌了一个完整的 Linux 内核,Docker Engine 就跑在这个虚拟机里。Windows 上的 Docker CLI 通过管道与虚拟机内的 Engine 通信。
理解了这条链路,很多安装问题就豁然开朗了。比如“Virtualization support not detected”这类报错,本质是 Docker Desktop 在初始化 WSL2 虚拟机时发现宿主机的虚拟化功能没有开启或不可用。
排查和修复顺序如下:
- 进入任务管理器,性能选项卡,查看“虚拟化”是否显示“已启用”。如果显示“已禁用”,需要进 BIOS/UEFI,找到 Intel VT-x(Intel 平台)或 AMD-V(AMD 平台),将其开启。
- 确认 Windows 功能中的“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个选项都已勾选。控制面板 > 程序 > 启用或关闭 Wind
