核心概念
Docker 是什么
Docker 是一个容器化平台,能把应用及其运行环境(代码、运行时、系统库、配置)打包成一个可移植的单元——镜像,并在任意装有 Docker 的机器上以容器形式运行。
一句话:“一次构建,到处运行”(Build once, run anywhere)。
容器 vs 虚拟机
| 维度 | 容器 | 虚拟机 |
|---|---|---|
| 隔离级别 | 进程级(共享宿主机内核) | 硬件级(虚拟整套硬件) |
| 启动速度 | 秒级甚至毫秒级 | 分钟级 |
| 资源占用 | MB 级 | GB 级(需独立 Guest OS) |
| 性能损耗 | 接近原生 | 有一定损耗 |
| 便携性 | 镜像小、分发快 | 镜像大、分发慢 |
虚拟机(每台含完整 OS): 容器(共享内核):
┌──────────────┐ ┌──────────────┐ ┌────┐ ┌────┐ ┌────┐
│ App │ App │ │ App │ │ A │ │ B │ │ C │
│ Bins │ Bins │ │ Bins │ ├────┤ ├────┤ ├────┤
│ Guest OS │ │ Guest OS │ │ 容器引擎 (Docker) │
├──────────────┤ ├──────────────┤ ├─────────────────┤
│ Hypervisor(虚拟硬件层) │ │ 宿主操作系统内核 │
├─────────────────────────────┤ ├─────────────────┤
│ 宿主操作系统 │ │ 硬件 │
├─────────────────────────────┤ └─────────────────┘
│ 硬件 │
└─────────────────────────────┘注:Colima/WSL2 这类方案在 macOS/Windows 上仍需一个轻量 Linux 虚拟机来提供内核,但容器本身仍共享该内核。
三个核心对象
镜像(Image)
- 只读的模板,包含运行应用所需的文件系统和启动配置。
- 分层存储(UnionFS / OverlayFS),每一层是一次变更。
- 由
Dockerfile构建,或从仓库pull。
容器(Container)
- 镜像的运行实例,在镜像层之上加了一层可写层。
- 生命周期:创建 → 运行 → 停止 → 删除。
- 删除容器不删除镜像;删除镜像前必须先删除依赖它的容器。
仓库(Registry)
- 存放与分发镜像的服务。默认是 Docker Hub。
- 命名格式:
[registry/][namespace/]name[:tag]nginx→docker.io/library/nginx:latestgcr.io/kubernetes/etcd:3.5.0
三者关系:
Dockerfile --build--> 镜像 --run--> 容器 --commit--> 新镜像
镜像 <--pull/push--> 仓库(Registry)整体架构
Docker 采用 客户端-服务端(C/S) 架构:
┌──────────────┐ ┌─────────────────────────┐
│ docker CLI │ REST │ dockerd(守护进程) │
│ (客户端) │ ──────▶ │ - 镜像管理 │
└──────────────┘ API │ - 容器管理 │
│ - 网络/存储 │
│ - 通过 containerd 调 │
│ runc 创建容器 │
└─────────────────────────┘- docker CLI:命令行客户端,你输入的命令。
- dockerd:守护进程,真正干活的服务端,监听
/var/run/docker.sock。 - containerd / runc:底层容器运行时,负责真正创建、运行容器。
- OCI 标准:镜像格式与运行时规范,保证跨实现兼容(Docker、Podman、containerd 等)。
docker version若只显示 Client 而无 Server,说明守护进程没起来或连接不到(见 08-排错)。
分层与写时复制(COW)
镜像分层示例(以 nginx:alpine 为例,示意):
layer 5: CMD ["nginx","-g","daemon off;"] ← 启动命令(元数据)
layer 4: COPY nginx.conf /etc/nginx/ ← 你自己的配置
layer 3: apk add nginx ← 安装 nginx
layer 2: apk add libc ca-certificates ← 依赖
layer 1: alpine base image ← 基础系统
─────────────────────────────────────────────
容器可写层(新建/修改的文件都写在这里,随容器删除而消失)好处:
- 复用:多个镜像共享相同基础层,节省磁盘与拉取时间。
- 增量:只下载缺失的层。
- 缓存:Dockerfile 中未变化的层直接复用缓存,加快构建。
常用概念速览
| 术语 | 含义 |
|---|---|
| Dockerfile | 构建镜像的脚本 |
| build | 构建镜像 |
| tag | 镜像标签(版本号) |
| pull / push | 从仓库拉取 / 推送镜像 |
| registry | 镜像仓库(Docker Hub 等) |
| container | 容器,镜像运行实例 |
| volume | 数据卷,持久化存储 |
| bind mount | 挂载宿主机目录 |
| network | 容器网络 |
| compose | 多容器编排工具 |
学习提醒
- 先理解 镜像 = 模板、容器 = 实例,这是所有操作的基础。
- 一切状态都可查询:
docker ps、docker images、docker inspect。 - 容器默认是无状态的:删掉容器,其内部未持久化的数据就没了(见 网络与存储)。
