style: apply global formatting fixes (struct, spacing, zhlint)

This commit is contained in:
Baohua Yang
2026-02-21 11:08:52 -08:00
parent ad68b2d973
commit 79ac9c639a
159 changed files with 1708 additions and 882 deletions

View File

@@ -1,15 +1,15 @@
## 14.6 Docker 网络实现
Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备特别是 veth pair建议先熟悉了解这两部分的基本概念再阅读本章
Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备 (特别是 veth pair)建议先熟悉了解这两部分的基本概念再阅读本章
### 基本原理
首先要实现网络通信机器需要至少一个网络接口物理接口或虚拟接口来收发数据包此外如果不同子网之间要进行通信需要路由机制
首先要实现网络通信机器需要至少一个网络接口 (物理接口或虚拟接口) 来收发数据包此外如果不同子网之间要进行通信需要路由机制
Docker 中的网络接口默认都是虚拟的接口虚拟接口的优势之一是转发效率较高
Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中对于本地系统和容器内系统看来就像是一个正常的以太网卡只是它不需要真正同外部网络设备通信速度要快很多
Docker 容器网络就利用了这项技术它在本地主机和容器内分别创建一个虚拟接口并让它们彼此连通这样的一对接口叫做 `veth pair`
Docker 容器网络就利用了这项技术它在本地主机和容器内分别创建一个虚拟接口并让它们彼此连通 (这样的一对接口叫做 `veth pair`)
### 创建网络参数
@@ -21,7 +21,7 @@ Docker 创建一个容器的时候,会执行如下操作:
完成这些之后容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络
可以在 `docker run` 的时候通过 `--net` 参数来指定容器的网络配置4个可选值
可以在 `docker run` 的时候通过 `--net` 参数来指定容器的网络配置 4 个可选值
* `--net=bridge` 这个是默认值连接到默认的网桥
* `--net=host` 告诉 Docker 不要将容器网络放到隔离的命名空间中即不要容器化容器内的网络此时容器使用本地主机的网络它拥有完全的本地主机接口访问权限容器进程可以跟主机其它 root 进程一样可以打开低范围的端口可以访问本地网络服务比如 D-bus还可以让容器做一些影响整个主机系统的事情比如重启主机因此使用这个选项的时候要非常小心如果进一步的使用 `--privileged=true`容器会被允许直接配置主机的网络堆栈
* `--net=container:NAME_or_ID` Docker 将新建容器的进程放到一个已存在容器的网络栈中新容器进程有自己的文件系统进程列表和资源限制但会和已存在的容器共享 IP 地址和端口等网络资源两者进程可以直接通过 `lo` 环回接口通信
@@ -57,7 +57,7 @@ $ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A
$ sudo ip link set A up
```
B放到容器的网络命名空间命名为 eth0启动它并配置一个可用 IP桥接网段和默认网关
B 放到容器的网络命名空间命名为 eth0启动它并配置一个可用 IP (桥接网段) 和默认网关
```bash
$ sudo ip link set B netns $pid
$ sudo ip netns exec $pid ip link set dev B name eth0