mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-24 10:45:23 +00:00
Remove blank lines after code block markers
This commit is contained in:
@@ -13,7 +13,6 @@ graph LR
|
||||
D -->|管理| C2["Containers\n容器"]
|
||||
D -->|管理| C3["Images\n镜像"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.1.2 组件详解
|
||||
@@ -84,7 +83,6 @@ flowchart TD
|
||||
R -->|7. 进程退出| E
|
||||
S -->|8. 监控 IO 和退出| P
|
||||
```
|
||||
|
||||
1. **CLI** 发送请求给 **Dockerd**
|
||||
2. **Dockerd** 解析请求,调用 **Containerd**
|
||||
3. **Containerd** 准备镜像,转换为 OCI Bundle
|
||||
@@ -119,7 +117,6 @@ flowchart TD
|
||||
CLI -- "(Socket 映射)" --> Engine
|
||||
end
|
||||
```
|
||||
|
||||
- 使用轻量级虚拟机 (Apple Virtualization / WSL 2) 运行 Linux 内核
|
||||
- 文件挂载 (Bind Mount) 需要跨越 VM 边界 (这也是文件 I/O 慢的原因)
|
||||
- 网络端口需要从宿主机转发到 VM
|
||||
|
||||
@@ -25,7 +25,6 @@ flowchart LR
|
||||
|
||||
H4 -. "(实际是宿主机的 1234)" .- C1
|
||||
```
|
||||
|
||||
### 12.2.2 Namespace 的类型
|
||||
|
||||
Linux 内核提供了以下几种 Namespace,Docker 容器使用了全部:
|
||||
@@ -53,7 +52,6 @@ PID Namespace 负责进程 ID 的隔离,使得容器内的进程彼此不可
|
||||
#### PID 隔离效果
|
||||
|
||||
```bash
|
||||
|
||||
## 宿主机上查看进程
|
||||
|
||||
$ ps aux | grep nginx
|
||||
@@ -67,7 +65,6 @@ PID USER COMMAND
|
||||
1 root nginx: master process ← 在容器内是 PID 1
|
||||
2 root nginx: worker process
|
||||
```
|
||||
|
||||
#### PID 关键点
|
||||
|
||||
- 容器内的 PID 1 进程特殊重要——它是容器的主进程,退出则容器停止
|
||||
@@ -102,7 +99,6 @@ flowchart LR
|
||||
|
||||
H2 <--> C2
|
||||
```
|
||||
|
||||
#### NET 关键点
|
||||
|
||||
- 每个容器有独立的网卡、IP、路由表、iptables 规则
|
||||
@@ -133,7 +129,6 @@ MNT Namespace 负责文件系统挂载点的隔离,确保容器看到独立的
|
||||
│ └── merged/ ────┼─── 这个目录成为容器的 /
|
||||
└── ... └── ...
|
||||
```
|
||||
|
||||
#### 与 chroot 的区别
|
||||
|
||||
| 特性 | chroot | MNT Namespace |
|
||||
@@ -155,7 +150,6 @@ UTS Namespace 主要用于隔离主机名和域名。
|
||||
#### UTS 隔离效果
|
||||
|
||||
```bash
|
||||
|
||||
## 宿主机
|
||||
|
||||
$ hostname
|
||||
@@ -166,7 +160,6 @@ my-server
|
||||
$ docker run --hostname mycontainer ubuntu hostname
|
||||
mycontainer
|
||||
```
|
||||
|
||||
UTS = “UNIX Time-sharing System”,是历史遗留的名称。
|
||||
|
||||
---
|
||||
@@ -219,7 +212,6 @@ flowchart LR
|
||||
C1 -- 映射 --> H1
|
||||
C2 -- 映射 --> H2
|
||||
```
|
||||
|
||||
#### 安全意义
|
||||
|
||||
容器内的 root 用户可以映射为宿主机上的普通用户,即使容器被突破,攻击者在宿主机上也只有普通权限。
|
||||
@@ -235,7 +227,6 @@ flowchart LR
|
||||
#### 实验 1:UTS Namespace
|
||||
|
||||
```bash
|
||||
|
||||
## 创建新的 UTS namespace 并启动 shell
|
||||
|
||||
$ sudo unshare --uts /bin/bash
|
||||
@@ -252,11 +243,9 @@ $ exit
|
||||
$ hostname
|
||||
my-server
|
||||
```
|
||||
|
||||
#### 实验 2:PID Namespace
|
||||
|
||||
```bash
|
||||
|
||||
## 创建新的 PID 和 MNT namespace
|
||||
|
||||
$ sudo unshare --pid --mount --fork /bin/bash
|
||||
@@ -272,11 +261,9 @@ USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||||
root 1 0.0 0.0 8960 4516 pts/0 S 10:00 0:00 /bin/bash
|
||||
root 8 0.0 0.0 10072 3200 pts/0 R+ 10:00 0:00 ps aux
|
||||
```
|
||||
|
||||
#### 实验 3:NET Namespace
|
||||
|
||||
```bash
|
||||
|
||||
## 创建新的网络 namespace
|
||||
|
||||
$ sudo unshare --net /bin/bash
|
||||
@@ -287,7 +274,6 @@ $ ip addr
|
||||
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
|
||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.2.10 Namespace 的局限性
|
||||
|
||||
@@ -28,7 +28,6 @@ flowchart LR
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.3.2 cgroups 的历史
|
||||
@@ -62,7 +61,6 @@ Docker 提供了丰富的参数来配置容器的资源限制,主要包括内
|
||||
#### 内存限制
|
||||
|
||||
```bash
|
||||
|
||||
## 限制容器最多使用 512MB 内存
|
||||
|
||||
$ docker run -m 512m myapp
|
||||
@@ -75,7 +73,6 @@ $ docker run -m 512m --memory-swap 1g myapp
|
||||
|
||||
$ docker run --memory-reservation 256m myapp
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `-m` / `--memory` | 硬限制 (超过会 OOM Kill)|
|
||||
@@ -86,7 +83,6 @@ $ docker run --memory-reservation 256m myapp
|
||||
#### CPU 限制
|
||||
|
||||
```bash
|
||||
|
||||
## 限制使用 1.5 个 CPU 核心
|
||||
|
||||
$ docker run --cpus=1.5 myapp
|
||||
@@ -99,7 +95,6 @@ $ docker run --cpuset-cpus="0,1" myapp
|
||||
|
||||
$ docker run --cpu-shares=512 myapp
|
||||
```
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--cpus` | 限制 CPU 核心数 (如 1.5)|
|
||||
@@ -110,7 +105,6 @@ $ docker run --cpu-shares=512 myapp
|
||||
#### 磁盘 I/O 限制
|
||||
|
||||
```bash
|
||||
|
||||
## 限制设备写入速度为 10MB/s
|
||||
|
||||
$ docker run --device-write-bps /dev/sda:10mb myapp
|
||||
@@ -123,22 +117,18 @@ $ docker run --device-read-bps /dev/sda:10mb myapp
|
||||
|
||||
$ docker run --device-write-iops /dev/sda:100 myapp
|
||||
```
|
||||
|
||||
#### 进程数限制
|
||||
|
||||
```bash
|
||||
|
||||
## 限制最多 100 个进程
|
||||
|
||||
$ docker run --pids-limit=100 myapp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.3.5 查看容器资源使用
|
||||
|
||||
```bash
|
||||
|
||||
## 实时监控所有容器的资源使用
|
||||
|
||||
$ docker stats
|
||||
@@ -154,7 +144,6 @@ $ docker stats mycontainer
|
||||
|
||||
$ docker inspect mycontainer --format '{{json .HostConfig}}' | jq
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.3.6 资源限制的效果
|
||||
@@ -162,7 +151,6 @@ $ docker inspect mycontainer --format '{{json .HostConfig}}' | jq
|
||||
#### 内存超限
|
||||
|
||||
```bash
|
||||
|
||||
## 启动限制 100MB 内存的容器
|
||||
|
||||
$ docker run -m 100m stress --vm 1 --vm-bytes 200M
|
||||
@@ -177,11 +165,9 @@ abc123 Exited (137) 5 seconds ago hopeful_darwin
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
#### CPU 限制验证
|
||||
|
||||
```bash
|
||||
|
||||
## 不限制 CPU
|
||||
|
||||
$ docker run --rm stress --cpu 4
|
||||
@@ -196,7 +182,6 @@ $ docker run --rm --cpus=1 stress --cpu 4
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.3.7 cgroups v1 vs v2
|
||||
@@ -218,13 +203,11 @@ Docker 19.03+ 默认优先使用 cgroups v2(如果系统支持),提供更
|
||||
"cgroup-driver": "systemd"
|
||||
}
|
||||
```
|
||||
|
||||
常见的 `cgroup-driver` 值包括 `systemd` (推荐) 和 `cgroupfs`。重启 Docker 守护进程后生效。
|
||||
|
||||
#### 检查系统使用的版本
|
||||
|
||||
```bash
|
||||
|
||||
## 查看 cgroup 版本
|
||||
|
||||
$ mount | grep cgroup
|
||||
@@ -238,7 +221,6 @@ $ cat /proc/filesystems | grep cgroup
|
||||
nodev cgroup
|
||||
nodev cgroup2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.3.8 在 Compose 中设置限制
|
||||
@@ -258,7 +240,6 @@ services:
|
||||
cpus: '0.25'
|
||||
memory: 256M
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.3.9 最佳实践
|
||||
@@ -268,22 +249,18 @@ services:
|
||||
#### 1. 始终设置内存限制
|
||||
|
||||
```bash
|
||||
|
||||
## 防止 OOM 影响宿主机
|
||||
|
||||
$ docker run -m 1g myapp
|
||||
```
|
||||
|
||||
#### 2. 为关键应用设置 CPU 保证
|
||||
|
||||
```bash
|
||||
$ docker run --cpus=2 --cpu-shares=2048 critical-app
|
||||
```
|
||||
|
||||
#### 3. 监控资源使用
|
||||
|
||||
```bash
|
||||
|
||||
## 配合 Prometheus + cAdvisor 监控
|
||||
|
||||
$ docker run -d --name cadvisor \
|
||||
@@ -293,5 +270,4 @@ $ docker run -d --name cadvisor \
|
||||
-v /var/lib/docker:/var/lib/docker:ro \
|
||||
ghcr.io/google/cadvisor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -21,7 +21,6 @@ flowchart TD
|
||||
ContainerFS --> UnionFS
|
||||
UnionFS --> ContainerLayer --> ImageLayer3 --> ImageLayer2 --> ImageLayer1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.4.2 为什么 Docker 使用联合文件系统
|
||||
@@ -35,7 +34,6 @@ flowchart TD
|
||||
Nginx["nginx:alpine"] --> Alpine["alpine:3.19 (共享基础层)"]
|
||||
MyApp["myapp:latest"] --> Alpine
|
||||
```
|
||||
|
||||
多个镜像共享相同的底层,节省磁盘空间。
|
||||
|
||||
#### 2. 快速构建
|
||||
@@ -48,7 +46,6 @@ COPY package.json ./ # 层2:依赖定义
|
||||
RUN npm install # 层3:安装依赖
|
||||
COPY . . # 层4:应用代码
|
||||
```
|
||||
|
||||
代码变化时,只需重建层 4,层 1-3 使用缓存。
|
||||
|
||||
#### 3. 容器启动快
|
||||
@@ -80,7 +77,6 @@ flowchart LR
|
||||
B_C --- B_I
|
||||
A_C --- A_I
|
||||
```
|
||||
|
||||
**流程**:
|
||||
|
||||
1. 从只读层读取文件
|
||||
@@ -112,7 +108,6 @@ Docker 的存储驱动经历了从早期各式各样的机制(如 aufs, device
|
||||
#### 查看当前存储驱动与后端
|
||||
|
||||
```bash
|
||||
|
||||
## 查看默认存储驱动 (Storage Driver)
|
||||
$ docker info | grep "Storage Driver"
|
||||
Storage Driver: overlay2
|
||||
@@ -121,7 +116,6 @@ Storage Driver: overlay2
|
||||
$ docker info | grep "containerd image store"
|
||||
containerd image store: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.4.5 overlay2 工作原理
|
||||
@@ -142,7 +136,6 @@ flowchart TD
|
||||
OverlayFS --> Lower2
|
||||
OverlayFS --> Lower1
|
||||
```
|
||||
|
||||
- **lowerdir**:只读的镜像层 (可以有多个)
|
||||
- **upperdir**:可写的容器层
|
||||
- **workdir**:OverlayFS 的工作目录
|
||||
@@ -162,7 +155,6 @@ flowchart TD
|
||||
### 12.4.6 查看镜像层
|
||||
|
||||
```bash
|
||||
|
||||
## 查看镜像的层信息
|
||||
|
||||
$ docker history nginx:alpine
|
||||
@@ -184,7 +176,6 @@ $ docker inspect nginx:alpine --format '{{json .GraphDriver.Data}}' | jq
|
||||
"WorkDir": "/var/lib/docker/overlay2/.../work"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12.4.7 最佳实践
|
||||
@@ -194,7 +185,6 @@ $ docker inspect nginx:alpine --format '{{json .GraphDriver.Data}}' | jq
|
||||
#### 1. 减少镜像层数
|
||||
|
||||
```docker
|
||||
|
||||
## ❌ 每条命令创建一层
|
||||
|
||||
RUN apt-get update
|
||||
@@ -207,7 +197,6 @@ RUN apt-get update && \
|
||||
apt-get install -y nginx && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
#### 2. 避免在容器中写入大量数据
|
||||
|
||||
容器层的写入性能低于直接写入。大量数据应使用:
|
||||
|
||||
Reference in New Issue
Block a user