Docker 核心概念
Docker 的三大核心组件:镜像(Image)、容器(Container)、仓库(Registry)。
类比理解
| 概念 | 类比 | 说明 |
|---|---|---|
| 镜像(Image) | 模具 / Java 类 | 静态的、只读的模板,定义了运行环境的全部内容 |
| 容器(Container) | 月饼 / Java 对象 | 镜像的运行实例,可创建、启动、停止、删除 |
| 仓库(Registry) | Maven 仓库 / npm registry | 存储和分发镜像的中心化服务 |
镜像(Image)
什么是镜像
镜像是一个只读模板,包含了运行某个应用所需的全部内容:操作系统、运行时、库、代码、配置。镜像采用分层存储(UnionFS),每层只记录与上一层的差异。
┌──────────────────┐
│ Writable Layer │ ← 容器层(读写)
├──────────────────┤
│ Layer 3: App │ ← 镜像层(只读)
├──────────────────┤
│ Layer 2: Nginx │
├──────────────────┤
│ Layer 1: Debian │
├──────────────────┤
│ Layer 0: bootfs │
└──────────────────┘🔬 深入原理:Docker 使用 Overlay2 存储驱动,通过联合文件系统(UnionFS)将多个只读层叠加为一个视图。写操作触发 Copy-on-Write:当容器需要修改某个文件时,先将该文件从只读层复制到容器的可写层,再在可写层修改。这就是为什么容器启动快、占用空间小——只记录增量。
镜像命名规范
[registry/][namespace/]repository[:tag]
# 完整形式
docker.io/library/nginx:latest
# 省略形式(等于上面)
nginx| 部分 | 说明 | 默认值 |
|---|---|---|
registry |
镜像仓库地址 | docker.io(Docker Hub) |
namespace |
命名空间/用户名 | library(官方镜像) |
repository |
镜像名 | 必填 |
tag |
版本标签 | latest |
🚨 陷阱:
latest标签不代表最新版本——它只是默认 tag,由镜像作者决定指向哪个版本。生产环境必须显式指定版本号。
镜像分层与复用
多个镜像可以共享相同的底层,节省磁盘空间:
镜像 A: [Debian] → [Python 3.11] → [App_A v1.0] ← App_A 特有层
镜像 B: [Debian] → [Python 3.11] → [App_B v2.3] ← App_B 特有层
↑ ↑ 共享底层容器(Container)
什么是容器
容器是镜像的一个运行实例。可以将其理解为一个轻量级的、隔离的进程运行环境。容器之间相互隔离,但与宿主机共享内核。
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB 级别 | GB 级别 |
| 隔离程度 | 进程级(共享内核) | 硬件级(独立 OS) |
| 可运行数量 | 数千个 | 数十个 |
容器生命周期
pull/create → start → running → stop → stopped
↓ ↓
restart ←────── paused
↓
kill → stopped
↓
rm (容器被删除)容器的状态
| 状态 | 说明 |
|---|---|
created |
已创建但未启动 |
running |
正在运行 |
paused |
已暂停(进程冻结) |
stopped |
已停止(exit code 可查) |
dead |
被守护进程标记为不可恢复 |
仓库(Registry)
什么是 Registry
Registry 是镜像的存储和分发中心。Docker Hub 是官方公共 Registry,也可以搭建私有 Registry。
docker pull nginx
│
▼
Docker Hub (docker.io)
├── library/nginx
│ ├── latest → manifest → 实际层数据
│ ├── 1.25 → manifest → 实际层数据
│ └── 1.24 → manifest → 实际层数据
└── user/other-image
└── v1.0镜像拉取流程
- Docker 客户端向 Registry 请求镜像的 manifest
- manifest 中列出了镜像包含的所有 层(layers)
- Docker 客户端检查本地已有哪些层
- 并行拉取缺失的层
- 校验 SHA256 摘要
- 解压并存储
⚡ 性能提示:拉取镜像时 Docker 默认并行下载 3 层(可通过
--max-concurrent-downloads调整)。如果镜像共享已有镜像的底层,这些层会被跳过(“Already exists”)。
常见 Registry
| Registry | 地址 | 说明 |
|---|---|---|
| Docker Hub | docker.io |
官方公共仓库 |
| GitHub Container Registry | ghcr.io |
GitHub 提供的容器仓库 |
| Google Container Registry | gcr.io |
Google Cloud 容器仓库 |
| Alibaba Cloud ACR | registry.cn-hangzhou.aliyuncs.com |
阿里云容器镜像服务 |
| Harbor | 自建 | 企业级开源 Registry |
架构概览
┌────────────────────────────────────────────┐
│ Docker 客户端 │
│ (docker CLI / API) │
└──────────────┬─────────────────────────────┘
│ REST API (Unix Socket / TCP)
┌──────────────▼─────────────────────────────┐
│ Docker Daemon │
│ ┌──────────┐ ┌──────────┐ ┌────────────┐ │
│ │ 镜像管理 │ │ 容器管理 │ │ 网络管理 │ │
│ └──────────┘ └──────────┘ └────────────┘ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 卷管理 │ │ containerd│ │
│ └──────────┘ └─────┬────┘ │
└─────────────────────┼──────────────────────┘
│
┌───────▼───────┐
│ runc │
│ (OCI Runtime) │
└───────────────┘- Docker CLI:用户使用的命令行工具
- Docker Daemon (dockerd):后台服务,管理镜像、容器、网络、卷
- containerd:管理容器生命周期的守护进程
- runc:OCI 标准的容器运行时,实际创建和运行容器