Docker架构与核心概念 #
Docker架构 #
整体架构图 #
text
┌─────────────────────────────────────────────────────────────┐
│ Docker 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Client │ │ Client │ │ Client │ │
│ │ (docker) │ │ (Compose) │ │ (其他工具) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ │ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Docker Daemon │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ │ │
│ │ │ image │ │container │ │ network │ │volume │ │ │
│ │ │ builder │ │ runtime │ │ manager │ │manager │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ containerd │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ runc │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Host Operating System │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
核心组件 #
| 组件 | 说明 |
|---|---|
| Docker Client | 命令行工具,与Docker Daemon通信 |
| Docker Daemon | Docker守护进程,处理API请求 |
| containerd | 容器运行时管理器 |
| runc | 底层容器运行时 |
核心概念 #
1. 镜像(Image) #
什么是镜像? #
Docker镜像是一个只读模板,包含创建Docker容器的指令。镜像由多个层(Layer)组成,每层代表Dockerfile中的一条指令。
text
┌─────────────────────────────────┐
│ 应用代码层 │ ← 最上层(可读写)
├─────────────────────────────────┤
│ 依赖库层 │
├─────────────────────────────────┤
│ 运行时层 │
├─────────────────────────────────┤
│ 基础系统层 │ ← 最底层(只读)
└─────────────────────────────────┘
镜像特点 #
- 只读性: 镜像构建后不可修改
- 分层存储: 每层独立,便于复用
- 版本管理: 通过标签管理不同版本
- 轻量级: 共享基础层,节省空间
镜像操作 #
bash
# 查看本地镜像
docker images
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 删除镜像
docker rmi nginx:latest
# 查看镜像详情
docker inspect nginx:latest
# 查看镜像层
docker history nginx:latest
2. 容器(Container) #
什么是容器? #
容器是镜像的运行实例。它是一个轻量级、独立的可执行软件包,包含运行应用所需的所有内容。
text
镜像(Image) ──run──→ 容器(Container)
只读 可读写
静态 动态
模板 实例
容器特点 #
- 隔离性: 进程、网络、文件系统隔离
- 轻量级: 共享宿主内核,资源占用少
- 可移植: 在任何Docker环境运行
- 可扩展: 快速创建和销毁
容器操作 #
bash
# 创建容器
docker create --name mycontainer nginx
# 启动容器
docker start mycontainer
# 运行容器(创建+启动)
docker run -d --name mycontainer nginx
# 停止容器
docker stop mycontainer
# 删除容器
docker rm mycontainer
# 查看容器详情
docker inspect mycontainer
3. 仓库(Registry) #
什么是仓库? #
Docker仓库是存储和分发Docker镜像的服务。Docker Hub是最常用的公共仓库。
text
┌─────────────────────────────────────────────────────┐
│ Docker Registry │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ nginx │ │ redis │ │ mysql │ │
│ │ ├─latest │ │ ├─latest │ │ ├─latest │ │
│ │ ├─alpine │ │ ├─7 │ │ ├─8 │ │
│ │ └─1.23 │ │ └─6 │ │ └─5.7 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
常用仓库 #
| 仓库 | 说明 |
|---|---|
| Docker Hub | Docker官方公共仓库 |
| Docker Registry | 开源私有仓库 |
| Harbor | 企业级私有仓库 |
| 阿里云容器镜像服务 | 国内镜像加速 |
仓库操作 #
bash
# 登录仓库
docker login
# 登出仓库
docker logout
# 推送镜像
docker push myimage:v1.0
# 拉取镜像
docker pull myimage:v1.0
# 标记镜像
docker tag myimage:v1.0 username/myimage:v1.0
4. 数据卷(Volume) #
什么是数据卷? #
数据卷是独立于容器的持久化存储,用于保存容器产生的数据。
text
┌─────────────────────────────────────────────────────┐
│ 容器生命周期 │
├─────────────────────────────────────────────────────┤
│ │
│ 容器创建 ──→ 运行 ──→ 停止 ──→ 删除 │
│ │ │ │
│ │ 数据卷(持久化) │ │
│ └────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
数据卷特点 #
- 持久化: 容器删除后数据不丢失
- 共享: 多个容器可共享同一数据卷
- 独立: 独立于容器生命周期
数据卷操作 #
bash
# 创建数据卷
docker volume create myvolume
# 查看数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect myvolume
# 删除数据卷
docker volume rm myvolume
# 使用数据卷
docker run -v myvolume:/app/data nginx
5. 网络(Network) #
什么是Docker网络? #
Docker网络允许容器之间以及容器与外部世界进行通信。
text
┌─────────────────────────────────────────────────────┐
│ Docker 网络 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ bridge 网络 │ │
│ │ ┌───────┐ ┌───────┐ ┌───────┐ │ │
│ │ │容器 A │ │容器 B │ │容器 C │ │ │
│ │ └───────┘ └───────┘ └───────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ host 网络 │ │
│ │ ┌───────┐ │ │
│ │ │容器 D │ (使用宿主机网络) │ │
│ │ └───────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
网络类型 #
| 类型 | 说明 |
|---|---|
| bridge | 默认网络,容器间可通过IP通信 |
| host | 容器使用宿主机网络 |
| none | 无网络 |
| overlay | 跨主机网络(Swarm模式) |
| macvlan | 为容器分配MAC地址 |
网络操作 #
bash
# 查看网络
docker network ls
# 创建网络
docker network create mynetwork
# 查看网络详情
docker network inspect mynetwork
# 删除网络
docker network rm mynetwork
# 连接容器到网络
docker network connect mynetwork mycontainer
# 断开容器网络
docker network disconnect mynetwork mycontainer
Docker底层技术 #
1. Namespaces(命名空间) #
Namespaces提供资源隔离,Docker使用以下命名空间:
| Namespace | 隔离内容 |
|---|---|
| pid | 进程ID |
| net | 网络设备、协议栈 |
| ipc | 信号量、消息队列 |
| mnt | 文件系统挂载点 |
| uts | 主机名和域名 |
| user | 用户和用户组 |
2. Cgroups(控制组) #
Cgroups提供资源限制和监控:
bash
# 查看容器cgroup配置
cat /sys/fs/cgroup/memory/docker/<container_id>/memory.limit_in_bytes
cat /sys/fs/cgroup/cpu/docker/<container_id>/cpu.cfs_quota_us
3. UnionFS(联合文件系统) #
UnionFS实现镜像的分层存储:
text
┌─────────────────────────────────────────────────────┐
│ 联合文件系统 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ Container │ ← 容器层(可读写) │
│ │ Layer │ │
│ ├─────────────┤ │
│ │ Image │ ← 镜像层(只读) │
│ │ Layer 3 │ │
│ ├─────────────┤ │
│ │ Image │ │
│ │ Layer 2 │ │
│ ├─────────────┤ │
│ │ Image │ │
│ │ Layer 1 │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
Docker工作流程 #
镜像构建流程 #
text
┌─────────────────────────────────────────────────────┐
│ 镜像构建流程 │
├─────────────────────────────────────────────────────┤
│ │
│ Dockerfile ──→ Docker Client ──→ Docker Daemon │
│ │ │
│ ↓ │
│ 执行每条指令 │
│ │ │
│ ↓ │
│ 创建新的镜像层 │
│ │ │
│ ↓ │
│ 最终镜像 │
│ │
└─────────────────────────────────────────────────────┘
容器运行流程 #
text
┌─────────────────────────────────────────────────────┐
│ 容器运行流程 │
├─────────────────────────────────────────────────────┤
│ │
│ docker run ──→ 检查本地镜像 │
│ │ │ │
│ │ (不存在) │
│ │ ↓ │
│ │ 拉取镜像 │
│ │ │ │
│ └──────────────┘ │
│ ↓ │
│ 创建容器层 │
│ ↓ │
│ 配置网络 │
│ ↓ │
│ 挂载存储 │
│ ↓ │
│ 启动容器 │
│ │
└─────────────────────────────────────────────────────┘
小结 #
本节深入学习了Docker的架构和核心概念,包括:
- Docker的客户端-服务器架构
- 镜像、容器、仓库等核心概念
- 数据卷和网络的原理
- Docker底层技术:Namespaces、Cgroups、UnionFS
下一步 #
接下来,让我们学习 镜像基础,深入了解Docker镜像的管理操作。