Docker 系列(一):容器到底是什么
2026年7月28日 · 12 分钟
从一句开发者黑话说起
「在我电脑上明明是好的啊。」
几乎每个团队都被这句话折磨过。代码在你机器上跑得好好的,一到同事电脑或线上服务器 就报错——可能是 Node 版本不同、缺了某个系统库、环境变量没配、依赖版本对不上。
Docker 要解决的,就是「环境一致性」这个根本问题:把你的应用连同它运行所需的 一切(代码、运行时、系统库、配置)打包成一个标准化的「集装箱」,无论搬到哪台机器, 打开都是一模一样的环境。
容器 vs 虚拟机:本质区别
很多人第一次接触会问:这跟虚拟机(VM)有什么区别?看这张对比:
虚拟机 容器
┌─────────────────┐ ┌─────────────────┐
│ App A │ App B │ │ App A │ App B │
├─────────┼────────┤ ├─────────┼────────┤
│ 客户机OS│客户机OS│ │ 运行时依赖库 │
├─────────┴────────┤ ├──────────────────┤
│ Hypervisor │ │ Docker Engine │
├──────────────────┤ ├──────────────────┤
│ 宿主机 OS │ │ 宿主机 OS │
├──────────────────┤ ├──────────────────┤
│ 硬件 │ │ 硬件 │
└──────────────────┘ └──────────────────┘
关键差异在于:
- 虚拟机:每个 VM 都要跑一套完整的操作系统(客户机 OS),启动要几十秒到几分钟, 动辄占用几个 GB 内存。
- 容器:所有容器共享宿主机的内核,只打包应用和依赖,没有独立操作系统。 启动是毫秒到秒级,一个容器可能只占几十 MB。
一句话概括:虚拟机虚拟的是硬件,容器虚拟的是操作系统。 容器更轻、更快、密度更高, 一台机器能同时跑成百上千个容器。
三个必须搞懂的核心概念
学 Docker,先把这三个名词的关系理清,后面一切都好懂:
-
镜像(Image):一个只读的模板,包含运行应用所需的一切。你可以把它理解为 「安装光盘」或「类(class)」。比如一个
nginx镜像里就装好了 Nginx 程序及其依赖。 -
容器(Container):镜像的一个运行实例。就像「对象(object)」是「类」的实例 一样。同一个镜像可以启动出很多个互相隔离的容器。容器可以启动、停止、删除。
-
仓库(Registry):存放镜像的地方,类似 GitHub 之于代码。最大的公共仓库是 Docker Hub。你
pull(拉取)别人的镜像,也可以push(推送)自己的镜像。
它们的关系是:
Registry(仓库) --pull--> Image(镜像) --run--> Container(容器)
例:Docker Hub 例:nginx:latest 例:正在运行的网站
Docker 的整体架构
Docker 采用 C/S(客户端-服务端)架构:
- Docker Client(客户端):你敲的
docker命令,就是客户端。 - Docker Daemon(守护进程 dockerd):真正干活的后台服务,负责构建、运行、管理容器。
- Registry(镜像仓库):负责存储和分发镜像。
当你执行 docker run nginx 时,背后发生了这些事:
# 你敲的命令(客户端)
docker run nginx
# 背后流程:
# 1. Client 把请求发给 Daemon
# 2. Daemon 检查本地有没有 nginx 镜像
# 3. 本地没有 -> 去 Registry(Docker Hub)拉取
# 4. 基于镜像创建并启动一个容器
一个直观的例子
假设你要跑一个 Nginx 网站服务器。没有 Docker 时,你要:安装 Nginx、配置、处理依赖、 祈祷版本兼容……有了 Docker,只需一行:
docker run -d -p 8080:80 nginx
几秒后,打开 http://localhost:8080 就能看到 Nginx 欢迎页。不用安装任何东西,玩坏了
docker rm 删掉即可,宿主机干干净净。这就是 Docker 的魔力:标准、快速、隔离、可弃。
本篇小结
- Docker 解决的核心痛点是环境一致性。
- 容器与虚拟机的本质区别:共享内核 vs 独立 OS,容器更轻更快。
- 记牢三大概念:镜像(模板)、容器(实例)、仓库(存储分发)。
- Docker 是 C/S 架构:客户端发命令,守护进程干活,仓库存镜像。
下一篇我们动手:安装 Docker,运行你的第一个容器,掌握最常用的一批命令。