mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 12:21:17 +00:00
Fix format issue
This commit is contained in:
@@ -116,18 +116,15 @@ flowchart TD
|
||||
|
||||
在 macOS 和 Windows 上,因为内核差异,架构稍微复杂:
|
||||
|
||||
```
|
||||
┌────────────── MacOS / Windows ──────────────┐
|
||||
│ Docker CLI │
|
||||
│ │ │
|
||||
├──────┼──────────────────────────────────────┤
|
||||
│ ▼ (Socket 映射) │
|
||||
│ ┌────────── Linux VM (虚拟机) ───────────┐ │
|
||||
│ │ │ │
|
||||
│ │ Dockerd <--> Containerd <--> Runc │ │
|
||||
│ │ │ │
|
||||
│ └────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────┘
|
||||
```mermaid
|
||||
flowchart TD
|
||||
subgraph HostOS ["MacOS / Windows"]
|
||||
CLI["Docker CLI"]
|
||||
subgraph LinuxVM ["Linux VM (虚拟机)"]
|
||||
Engine["Dockerd <--> Containerd <--> Runc"]
|
||||
end
|
||||
CLI -- "(Socket 映射)" --> Engine
|
||||
end
|
||||
```
|
||||
|
||||
- 使用轻量级虚拟机(Apple Virtualization / WSL 2)运行 Linux 内核
|
||||
|
||||
@@ -4,15 +4,24 @@
|
||||
|
||||
> **Namespace 是 Linux 内核提供的资源隔离机制,它让容器内的进程仿佛运行在独立的操作系统中。**Namespace 是容器技术的核心基础之一。它回答了一个关键问题:**如何让一个进程"以为"自己独占整个系统?**
|
||||
|
||||
```
|
||||
宿主机视角: 容器内视角:
|
||||
┌─────────────────────────┐ ┌─────────────────────────┐
|
||||
│ PID 1: systemd │ │ PID 1: nginx │ ← 容器认为自己是 PID 1
|
||||
│ PID 2: sshd │ │ PID 2: nginx worker │
|
||||
│ PID 3: dockerd │ │ │
|
||||
│ PID 1234: nginx ←──────│─────│ (实际是宿主机的 1234) │
|
||||
│ PID 1235: nginx worker │ │ │
|
||||
└─────────────────────────┘ └─────────────────────────┘
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph Host ["宿主机视角"]
|
||||
direction TB
|
||||
H1["PID 1: systemd"]
|
||||
H2["PID 2: sshd"]
|
||||
H3["PID 3: dockerd"]
|
||||
H4["PID 1234: nginx"]
|
||||
H5["PID 1235: nginx worker"]
|
||||
end
|
||||
|
||||
subgraph Container ["容器内视角"]
|
||||
direction TB
|
||||
C1["PID 1: nginx<br/>← 容器认为自己是 PID 1"]
|
||||
C2["PID 2: nginx worker"]
|
||||
end
|
||||
|
||||
H4 -. "(实际是宿主机的 1234)" .- C1
|
||||
```
|
||||
|
||||
### Namespace 的类型
|
||||
@@ -76,13 +85,21 @@ NET Namespace 负责网络栈的隔离,包括网卡、路由表和 iptables
|
||||
|
||||
#### NET 隔离效果
|
||||
|
||||
```
|
||||
宿主机 容器
|
||||
┌─────────────────────┐ ┌─────────────────────┐
|
||||
│ eth0: 192.168.1.10 │ │ eth0: 172.17.0.2 │ ← 不同的 IP
|
||||
│ docker0: 172.17.0.1│◄───────►│ (veth pair 连接) │
|
||||
│ 端口 80 可用 │ │ 端口 80 可用 │ ← 可以使用相同端口
|
||||
└─────────────────────┘ └─────────────────────┘
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph Host ["宿主机"]
|
||||
direction TB
|
||||
H1["eth0: 192.168.1.10<br/>端口 80 可用"]
|
||||
H2["docker0: 172.17.0.1"]
|
||||
end
|
||||
|
||||
subgraph Container ["容器"]
|
||||
direction TB
|
||||
C1["eth0: 172.17.0.2<br/>端口 80 可用"]
|
||||
C2["(veth pair 连接)"]
|
||||
end
|
||||
|
||||
H2 <--> C2
|
||||
```
|
||||
|
||||
#### NET 关键点
|
||||
@@ -185,12 +202,22 @@ USER Namespace 允许将容器内的用户 ID 映射到宿主机的不同用户
|
||||
|
||||
#### USER 隔离效果
|
||||
|
||||
```
|
||||
容器内 宿主机
|
||||
┌─────────────────┐ ┌─────────────────┐
|
||||
│ UID 0 (root) │───映射────►│ UID 100000 │ ← 非特权用户
|
||||
│ UID 1 (daemon) │───映射────►│ UID 100001 │
|
||||
└─────────────────┘ └─────────────────┘
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph Container ["容器内"]
|
||||
direction TB
|
||||
C1["UID 0 (root)"]
|
||||
C2["UID 1 (daemon)"]
|
||||
end
|
||||
|
||||
subgraph Host ["宿主机"]
|
||||
direction TB
|
||||
H1["UID 100000<br/>← 非特权用户"]
|
||||
H2["UID 100001"]
|
||||
end
|
||||
|
||||
C1 -- 映射 --> H1
|
||||
C2 -- 映射 --> H2
|
||||
```
|
||||
|
||||
#### 安全意义
|
||||
|
||||
@@ -8,17 +8,25 @@
|
||||
|
||||
> **核心作用**:让多个容器公平共享宿主机资源,防止单个容器耗尽系统资源。
|
||||
|
||||
```
|
||||
无 cgroups 限制: 有 cgroups 限制:
|
||||
┌──────────────────────┐ ┌──────────────────────┐
|
||||
│ 宿主机资源 │ │ 宿主机资源 │
|
||||
│ ┌─────────────┐ │ │ ┌───┬───┬───┐ │
|
||||
│ │ 容器 A │ │ │ │ A │ B │ C │ │
|
||||
│ │ 占用所有 │ │ │ │1GB│1GB│1GB│ ← 限制│
|
||||
│ │ 内存和 CPU │ │ │ ├───┼───┼───┤ │
|
||||
│ └─────────────┘ │ │ │2核│1核│1核│ │
|
||||
│ 容器 B、C 饥饿 │ │ └───┴───┴───┘ │
|
||||
└──────────────────────┘ └──────────────────────┘
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph NoLimit ["无 cgroups 限制"]
|
||||
direction TB
|
||||
subgraph HostRes1 ["宿主机资源"]
|
||||
A["容器 A<br/>占用所有<br/>内存和 CPU"]
|
||||
B["容器 B、C 饥饿"]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph Limit ["有 cgroups 限制"]
|
||||
direction TB
|
||||
subgraph HostRes2 ["宿主机资源"]
|
||||
direction LR
|
||||
C_A["A<br/>1GB<br/>2核"]
|
||||
C_B["B<br/>1GB<br/>1核"]
|
||||
C_C["C<br/>1GB<br/>1核"]
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -8,25 +8,18 @@
|
||||
|
||||
> **核心思想**:将多个只读层叠加,最上层可写,形成完整的文件系统。
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ 容器看到的文件系统 │
|
||||
│ /bin /etc /lib /usr /var /app /data │
|
||||
└────────────────────────┬────────────────────────────────┘
|
||||
│
|
||||
┌───────────────┴───────────────┐
|
||||
│ UnionFS 联合挂载 │
|
||||
└───────────────┬───────────────┘
|
||||
│
|
||||
┌────────────────────────┴────────────────────────────────┐
|
||||
│ 容器层 (读写) │ /app/data/log.txt (新写入) │
|
||||
├────────────────────┼────────────────────────────────────│
|
||||
│ 镜像层3 (只读) │ /app/app.py │
|
||||
├────────────────────┼────────────────────────────────────│
|
||||
│ 镜像层2 (只读) │ /usr/local/bin/python │
|
||||
├────────────────────┼────────────────────────────────────│
|
||||
│ 镜像层1 (只读) │ /bin /etc /lib (基础系统) │
|
||||
└────────────────────┴────────────────────────────────────┘
|
||||
```mermaid
|
||||
flowchart TD
|
||||
ContainerFS["容器看到的文件系统<br/>/bin /etc /lib /usr /var /app /data"]
|
||||
UnionFS["UnionFS 联合挂载"]
|
||||
|
||||
ContainerLayer["容器层 (读写) : /app/data/log.txt (新写入)"]
|
||||
ImageLayer3["镜像层3 (只读) : /app/app.py"]
|
||||
ImageLayer2["镜像层2 (只读) : /usr/local/bin/python"]
|
||||
ImageLayer1["镜像层1 (只读) : /bin /etc /lib (基础系统)"]
|
||||
|
||||
ContainerFS --> UnionFS
|
||||
UnionFS --> ContainerLayer --> ImageLayer3 --> ImageLayer2 --> ImageLayer1
|
||||
```
|
||||
|
||||
---
|
||||
@@ -37,13 +30,10 @@ Docker 选择联合文件系统作为其存储驱动,主要基于以下几个
|
||||
|
||||
#### 1. 镜像分层复用
|
||||
|
||||
```
|
||||
nginx:alpine myapp:latest
|
||||
│ │
|
||||
└────────┬────────────┘
|
||||
│
|
||||
▼
|
||||
alpine:3.19 (共享基础层)
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Nginx["nginx:alpine"] --> Alpine["alpine:3.19 (共享基础层)"]
|
||||
MyApp["myapp:latest"] --> Alpine
|
||||
```
|
||||
|
||||
多个镜像共享相同的底层,节省磁盘空间。
|
||||
@@ -73,15 +63,21 @@ COPY . . # 层4:应用代码
|
||||
|
||||
当容器修改只读层中的文件时:
|
||||
|
||||
```
|
||||
修改前: 修改后:
|
||||
┌─────────────────────┐ ┌─────────────────────┐
|
||||
│ 容器层 (空) │ │ 容器层 │
|
||||
├─────────────────────┤ │ /etc/nginx.conf ←──┼── 复制到容器层后修改
|
||||
│ 镜像层 │ ├─────────────────────┤
|
||||
│ /etc/nginx.conf │ │ 镜像层 │
|
||||
└─────────────────────┘ │ /etc/nginx.conf │ (原文件仍在,但被遮蔽)
|
||||
└─────────────────────┘
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph Before ["修改前"]
|
||||
direction TB
|
||||
B_C["容器层 (空)"]
|
||||
B_I["镜像层<br/>/etc/nginx.conf"]
|
||||
end
|
||||
|
||||
subgraph After ["修改后"]
|
||||
direction TB
|
||||
A_C["容器层<br/>/etc/nginx.conf ← 复制到容器层后修改"]
|
||||
A_I["镜像层<br/>/etc/nginx.conf (原文件仍在,但被遮蔽)"]
|
||||
end
|
||||
B_C --- B_I
|
||||
A_C --- A_I
|
||||
```
|
||||
|
||||
**流程**:
|
||||
@@ -130,23 +126,19 @@ Storage Driver: overlay2
|
||||
|
||||
overlay2 是目前最推荐的存储驱动:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ merged(合并视图) │
|
||||
│ 容器看到的完整文件系统 │
|
||||
└─────────────────────────┬───────────────────────────────────┘
|
||||
│
|
||||
┌───────────────┴───────────────┐
|
||||
│ OverlayFS │
|
||||
└───────────────┬───────────────┘
|
||||
│
|
||||
┌────────────────┼────────────────┐
|
||||
▼ ▼ ▼
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ upper │ │ lower2 │ │ lower1 │
|
||||
│ (容器层) │ │ (镜像层) │ │ (基础层) │
|
||||
│ 读写 │ │ 只读 │ │ 只读 │
|
||||
└─────────────┘ └─────────────┘ └─────────────┘
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Merged["merged (合并视图)<br/>容器看到的完整文件系统"]
|
||||
OverlayFS["OverlayFS"]
|
||||
|
||||
Upper["upper<br/>(容器层)<br/>读写"]
|
||||
Lower2["lower2<br/>(镜像层)<br/>只读"]
|
||||
Lower1["lower1<br/>(基础层)<br/>只读"]
|
||||
|
||||
Merged --> OverlayFS
|
||||
OverlayFS --> Upper
|
||||
OverlayFS --> Lower2
|
||||
OverlayFS --> Lower1
|
||||
```
|
||||
|
||||
- **lowerdir**:只读的镜像层(可以有多个)
|
||||
|
||||
Reference in New Issue
Block a user