讲解
Docker 是容器技术的代名词。要理解它解决什么问题,先回忆没有它时的经典对话:「代码在我机器上是好的」。开发环境、测试环境、生产环境的操作系统版本、依赖库、环境变量稍有不同,就可能让同一份代码表现迥异。Docker 的思路是把应用和它需要的整个运行环境(依赖、配置、运行时)打包成一个标准化的「镜像」,任何装了 Docker 的机器都能以完全一样的方式运行它——一次构建,到处运行。
容器和虚拟机经常被拿来对比。虚拟机用 Hypervisor 虚拟出整套硬件,每台虚拟机跑一个完整的操作系统内核,启动以分钟计、体积以 GB 计;容器则是宿主机操作系统上的一个普通进程,靠 Linux 内核的 namespace(隔离进程、网络、文件系统视图)和 cgroup(限制 CPU、内存用量)实现隔离,共享宿主机内核,启动以毫秒计、体积以 MB 计。所以容器不是「轻量级虚拟机」,而是「被隔离和限制的进程」——这个心智模型能让你看懂后面绝大多数命令的行为。
Docker 的生态里有三个核心概念贯穿始终:镜像(image)是只读的打包产物,像一张安装光盘;容器(container)是镜像的运行实例,像用光盘启动起来的系统,可以启动、停止、删除,互不影响;仓库(registry)是镜像的分发中心,Docker Hub 是默认的公共仓库。本教程每个示例都在真实 Docker 29 上执行验证过,资源命名统一带 ohmydocs-verify- 前缀,学完照做不会弄乱你自己的环境。
示例
确认本机 Docker 已就绪(客户端 + 守护进程版本):
docker version --format '客户端 {{.Client.Version}} / 服务端 {{.Server.Version}}'
看一眼守护进程的基本信息(存储驱动、 cgroup 版本等):
docker info --format '存储驱动: {{.Driver}}, 容器数: {{.Containers}}, 镜像数: {{.Images}}'
跑官方的最小示例镜像,验证「拉取 → 运行」全链路(首次运行会自动从 Docker Hub 拉取):
docker run --rm hello-world
常见坑
- 把容器当虚拟机用:往容器里装 sshd、跑一堆服务、登录进去改文件——这是虚拟机思维。容器应该单进程、可丢弃、通过镜像重建。
- 混淆镜像和容器:删了容器镜像还在,删了镜像正在跑的容器不受影响;docker ps 看容器,docker images 看镜像,先分清再操作。
- 以为容器里的改动会保留:容器删除后其可写层随之消失,重要数据必须放进数据卷(后面专章讲)。
- 在 macOS/Windows 上忘了虚拟机的存在:这两个平台上 Docker 跑在一个内置 Linux 虚拟机里,「宿主机网络」「挂载路径」的含义和 Linux 上略有差异。
小结
Docker = 把应用连环境一起打包成镜像,以隔离进程(容器)的形式随处运行;镜像、容器、仓库三个概念贯穿全部内容。下一章把 Docker 装好并完成第一次验证。