mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 20:31:18 +00:00
chore: remove unused historic image files
This commit is contained in:
@@ -34,6 +34,7 @@ Docker 的内部架构如同洋葱一样分层,每一层专注解决特定问
|
||||
#### 2。Dockerd (守护进程)
|
||||
|
||||
Docker 的大脑。
|
||||
|
||||
- 监听 API 请求
|
||||
- 管理 Docker 对象 (镜像、容器、网络、卷)
|
||||
- 编排下层组件完成工作
|
||||
@@ -41,6 +42,7 @@ Docker 的大脑。
|
||||
#### 3。Containerd (高级运行时)
|
||||
|
||||
行业标准的容器运行时 (CNCF 毕业项目)。
|
||||
|
||||
- 管理容器的完整生命周期 (启动、停止)
|
||||
- 镜像拉取与存储
|
||||
- **不包含**复杂的与容器无关的功能 (如构建、API)
|
||||
@@ -49,6 +51,7 @@ Docker 的大脑。
|
||||
#### 4。Runc (低级运行时)
|
||||
|
||||
用于创建和运行容器的 CLI 工具。
|
||||
|
||||
- 直接与内核交互 (Namespaces,Cgroups)
|
||||
- 遵循 OCI (Open Container Initiative) 规范
|
||||
- **主要职责**:根据配置启动一个容器,然后退出 (将控制权交给容器进程)
|
||||
@@ -56,6 +59,7 @@ Docker 的大脑。
|
||||
#### 5. Shim
|
||||
|
||||
每个容器都有一个 shim 进程。
|
||||
|
||||
- **解耦**:允许 dockerd 重启而不影响容器运行
|
||||
- **保持 IO**:维持容器的标准输入输出
|
||||
- **状态汇报**:向 containerd 汇报容器退出状态
|
||||
@@ -135,13 +139,15 @@ flowchart TD
|
||||
|
||||
### 总结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 组件 | 角色 | 关键职责 |
|
||||
|------|------|----------|
|
||||
| **CLI** | 指挥官 | 发送指令,展示结果 |
|
||||
| **Dockerd** | 大管家 | API 接口,整体调度 |
|
||||
| **Containerd** | 经理 | 容器生命周期,镜像管理 |
|
||||
| **Shim** | 监工 | 保持 IO,允许无守护进程重启 |
|
||||
| **Runc** | 工人 | 真正干活(创建容器),干完就走 |
|
||||
| **Runc** | 工人 | 真正干活 (创建容器),干完就走 |
|
||||
|
||||
### 延伸阅读
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ Linux 内核提供了以下几种 Namespace,Docker 容器使用了全部:
|
||||
| **UTS** | 主机名 | 独立的主机名和域名 |
|
||||
| **IPC** | 进程间通信 | 独立的信号量、消息队列、共享内存 |
|
||||
| **USER** | 用户/组 ID | 容器内的 root 可以映射为宿主机的普通用户 |
|
||||
| **Cgroup** | Cgroup 根目录 | 隔离 cgroup 层级视图(Linux 4.6+) |
|
||||
| **Cgroup** | Cgroup 根目录 | 隔离 cgroup 层级视图 (Linux 4.6+)|
|
||||
|
||||
---
|
||||
|
||||
@@ -139,6 +139,8 @@ MNT Namespace 负责文件系统挂载点的隔离,确保容器看到独立的
|
||||
|
||||
#### 与 chroot 的区别
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | chroot | MNT Namespace |
|
||||
|------|--------|---------------|
|
||||
| 安全性 | 可以逃逸 | 更安全 |
|
||||
|
||||
@@ -33,17 +33,21 @@ flowchart LR
|
||||
|
||||
### cgroups 的历史
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 时间 | 事件 |
|
||||
|------|------|
|
||||
| 2006 | Google 工程师提出 cgroups 概念 |
|
||||
| 2008 | Linux 2.6.24 正式支持 cgroups v1 |
|
||||
| 2016 | Linux 4.5 引入 cgroups v2 |
|
||||
| 现在 | Docker 默认使用 cgroups v2(如系统支持) |
|
||||
| 现在 | Docker 默认使用 cgroups v2 (如系统支持)|
|
||||
|
||||
---
|
||||
|
||||
### cgroups 可以限制的资源
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 资源类型 | 子系统 | 说明 |
|
||||
|---------|--------|------|
|
||||
| **CPU** | `cpu`, `cpuset` | CPU 使用时间和核心分配 |
|
||||
@@ -78,10 +82,10 @@ $ docker run --memory-reservation 256m myapp
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `-m` / `--memory` | 硬限制(超过会 OOM Kill) |
|
||||
| `-m` / `--memory` | 硬限制 (超过会 OOM Kill)|
|
||||
| `--memory-swap` | 内存 + swap 总限制 |
|
||||
| `--memory-reservation` | 软限制(内存竞争时生效) |
|
||||
| `--oom-kill-disable` | 禁用 OOM Killer(谨慎使用) |
|
||||
| `--memory-reservation` | 软限制 (内存竞争时生效)|
|
||||
| `--oom-kill-disable` | 禁用 OOM Killer (谨慎使用)|
|
||||
|
||||
#### CPU 限制
|
||||
|
||||
@@ -103,9 +107,9 @@ $ docker run --cpu-shares=512 myapp
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--cpus` | 限制 CPU 核心数(如 1.5) |
|
||||
| `--cpus` | 限制 CPU 核心数 (如 1.5)|
|
||||
| `--cpuset-cpus` | 绑定到特定 CPU 核心 |
|
||||
| `--cpu-shares` | CPU 时间片权重(相对值) |
|
||||
| `--cpu-shares` | CPU 时间片权重 (相对值)|
|
||||
| `--cpu-period` / `--cpu-quota` | 精细控制 CPU 配额 |
|
||||
|
||||
#### 磁盘 I/O 限制
|
||||
@@ -207,12 +211,14 @@ $ docker run --rm --cpus=1 stress --cpu 4
|
||||
|
||||
### cgroups v1 vs v2
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | cgroups v1 | cgroups v2 |
|
||||
|------|-----------|-----------|
|
||||
| 层级结构 | 多层级(每个资源单独) | 统一层级 |
|
||||
| 层级结构 | 多层级 (每个资源单独)| 统一层级 |
|
||||
| 管理复杂度 | 复杂 | 简化 |
|
||||
| 资源分配 | 基于层级 | 基于子树 |
|
||||
| PSI(压力监控) | ❌ | ✅ |
|
||||
| PSI (压力监控)| ❌ | ✅ |
|
||||
| rootless 容器 | 部分支持 | 完整支持 |
|
||||
|
||||
#### 概述
|
||||
|
||||
@@ -56,6 +56,7 @@ COPY . . # 层4:应用代码
|
||||
#### 3。容器启动快
|
||||
|
||||
容器启动时不需要复制镜像,只需:
|
||||
|
||||
1. 在镜像层上创建一个薄的可写层
|
||||
2. 联合挂载所有层
|
||||
|
||||
@@ -83,6 +84,7 @@ flowchart LR
|
||||
```
|
||||
|
||||
**流程**:
|
||||
|
||||
1. 从只读层读取文件
|
||||
2. 复制到容器的可写层
|
||||
3. 在可写层中修改
|
||||
@@ -105,6 +107,8 @@ Docker 可使用多种联合文件系统实现:
|
||||
|
||||
#### 各发行版推荐
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| Linux 发行版 | 推荐存储驱动 |
|
||||
|-------------|-------------|
|
||||
| Ubuntu 16.04+ | overlay2 |
|
||||
@@ -154,6 +158,8 @@ flowchart TD
|
||||
|
||||
#### 文件操作行为
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 操作 | 行为 |
|
||||
|------|------|
|
||||
| **读取** | 从上到下查找第一个匹配的文件 |
|
||||
@@ -217,12 +223,14 @@ RUN apt-get update && \
|
||||
#### 2。避免在容器中写入大量数据
|
||||
|
||||
容器层的写入性能低于直接写入。大量数据应使用:
|
||||
|
||||
- 数据卷 (Volume)
|
||||
- 绑定挂载 (Bind Mount)
|
||||
|
||||
#### 3。使用。dockerignore
|
||||
|
||||
排除不需要的文件可以:
|
||||
|
||||
- 减小构建上下文
|
||||
- 避免创建不必要的层
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ Docker 容器网络就利用了这项技术。它在本地主机和容器内分
|
||||
### 创建网络参数
|
||||
|
||||
Docker 创建一个容器的时候,会执行如下操作:
|
||||
|
||||
* 创建一对虚拟接口,分别放到本地主机和新容器中;
|
||||
* 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth65f9;
|
||||
* 容器一端放到新容器中,并修改名字作为 eth0,这个接口只在容器的命名空间可见;
|
||||
@@ -22,6 +23,7 @@ Docker 创建一个容器的时候,会执行如下操作:
|
||||
完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。
|
||||
|
||||
可以在 `docker run` 的时候通过 `--net` 参数来指定容器的网络配置,有 4 个可选值:
|
||||
|
||||
* `--net=bridge` 这个是默认值,连接到默认的网桥。
|
||||
* `--net=host` 告诉 Docker 不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 `--privileged=true`,容器会被允许直接配置主机的网络堆栈。
|
||||
* `--net=container:NAME_or_ID` 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 `lo` 环回接口通信。
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB |
@@ -1,5 +1,7 @@
|
||||
## 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| Namespace | 隔离内容 | 一句话说明 |
|
||||
|-----------|---------|-----------|
|
||||
| PID | 进程 ID | 容器有自己的进程树 |
|
||||
|
||||
Reference in New Issue
Block a user