Remove blank lines after code block markers

This commit is contained in:
yeasy
2026-03-21 22:36:09 -07:00
parent 312f8fea42
commit 9ac19d79ee
132 changed files with 0 additions and 1517 deletions

View File

@@ -18,7 +18,6 @@ Docker 容器的 DNS 配置有两种情况:
这是 Docker 网络最强大的功能之一在自定义网络中容器可以通过 名字 找到彼此而不需要知道对方的 IP (因为 IP 可能会变)
```bash
## 1. 创建自定义网络
$ docker network create mynet
@@ -33,7 +32,6 @@ $ docker run -it --rm --network mynet alpine ping web
PING web (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.074 ms
```
**原理**
Docker 守护进程在 `127.0.0.11` 运行了一个 DNS 服务器容器内的 DNS 请求会被转发到这里如果是容器名解析为容器 IP如果是外部域名 ( google.com)转发给上游 DNS
@@ -51,7 +49,6 @@ Docker 守护进程在 `127.0.0.11` 运行了一个 DNS 服务器。容器内的
$ docker run -it --dns=114.114.114.114 ubuntu cat /etc/resolv.conf
nameserver 114.114.114.114
```
#### 2. --dns-search
指定 DNS 搜索域例如设置为 `example.com` `ping host` 会尝试解析 `host.example.com`
@@ -59,7 +56,6 @@ nameserver 114.114.114.114
```bash
$ docker run --dns-search=example.com myapp
```
#### 3. --hostname -h
设置容器的主机名
@@ -67,7 +63,6 @@ $ docker run --dns-search=example.com myapp
```bash
$ docker run -h myweb nginx
```
---
### 9.1.4 全局 DNS 配置
@@ -82,7 +77,6 @@ $ docker run -h myweb nginx
]
}
```
修改后需要重启 Docker 服务`systemctl restart docker`
---

View File

@@ -9,7 +9,6 @@ abc123... bridge bridge local
def456... host host local
ghi789... none null local
```
### 9.2.1 网络类型对比
各网络类型的特点和适用场景如下
@@ -42,7 +41,6 @@ Bridge 是 Docker 默认使用的网络模式。Docker 启动时会自动创建
```bash
$ docker run -d --network host nginx
```
这种模式下网络性能最高但容器之间和宿主机之间没有网络隔离
### 9.2.4 None 网络
@@ -54,7 +52,6 @@ $ docker run -it --network none alpine ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> ...
inet 127.0.0.1/8 scope host lo
```
### 9.2.5 数据流向
容器网络中的数据流向可以分为以下几种情况

View File

@@ -17,7 +17,6 @@
使用 `docker network create` 命令可以创建自定义网络
```bash
## 创建网络
$ docker network create mynet
@@ -26,13 +25,11 @@ $ docker network create mynet
$ docker network inspect mynet
```
### 9.3.3 使用自定义网络
启动容器时通过 `--network` 参数指定连接的网络
```bash
## 启动容器并连接到自定义网络
$ docker run -d --name web --network mynet nginx
@@ -44,7 +41,6 @@ $ docker exec web ping db
PING db (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.083 ms
```
### 9.3.4 容器名 DNS 解析
自定义网络自动提供 DNS 服务Docker 守护进程在 `127.0.0.11` 运行了一个嵌入式 DNS 服务器容器内的 DNS 请求会被转发到这里
@@ -59,13 +55,11 @@ flowchart LR
Web["web<br/>172.18.0.2"] -- "DNS: 'db' → 172.18.0.3" --> DB["db<br/>172.18.0.3"]
end
```
### 9.3.5 常用网络命令
以下是 Docker 网络管理中常用的命令
```bash
## 列出网络
$ docker network ls
@@ -94,7 +88,6 @@ $ docker network rm mynet
$ docker network prune
```
---
> **🔥 踩坑实录**

View File

@@ -7,7 +7,6 @@
同一自定义网络内的容器可以直接通过容器名通信这是推荐的容器互联方式
```bash
## 创建网络
$ docker network create app-net
@@ -21,13 +20,11 @@ $ docker run -d --name app --network app-net myapp
...
```
### 9.4.2 连接到多个网络
一个容器可以同时连接到多个网络这对于需要跨网络通信的中间件容器特别有用
```bash
## 启动容器
$ docker run -d --name multi-net-container --network frontend nginx
@@ -40,13 +37,11 @@ $ docker network connect backend multi-net-container
$ docker inspect multi-net-container --format '{{json .NetworkSettings.Networks}}'
```
### 9.4.3 --link 已废弃
`--link` Docker 早期用于容器互联的方式**已经被废弃**不建议在新项目中使用请使用自定义网络替代
```bash
## 旧方式(不推荐)
$ docker run --link db:database myapp
@@ -57,7 +52,6 @@ $ docker network create mynet
$ docker run --network mynet --name db postgres
$ docker run --network mynet --name app myapp
```
使用自定义网络的优势在于
- 原生支持 DNS 解析

View File

@@ -18,7 +18,6 @@ flowchart TD
Host --> Proxy["Docker Proxy<br/>端口映射 (8080 -> 80)"]
Proxy --> Container["容器 (Class B: 80)"]
```
---
### 9.5.2 端口映射方式
@@ -30,12 +29,10 @@ Docker 提供了多种方式来指定端口映射。
使用 `-p <宿主机端口>:<容器端口>` 格式
```bash
## 将宿主机的 8080 端口映射到容器的 80 端口
$ docker run -d -p 8080:80 nginx
```
此时访问 `http://localhost:8080` 即可看到 Nginx 页面
**多种格式**
@@ -54,7 +51,6 @@ $ docker run -d -p 8080:80 nginx
```bash
$ docker run -d -P nginx
```
查看映射结果
```bash
@@ -62,7 +58,6 @@ $ docker ps
CONTAINER ID PORTS
abc123456 0.0.0.0:49153->80/tcp
```
此时 Nginx 被映射到了宿主机的 49153 端口
---
@@ -80,7 +75,6 @@ $ docker port mycontainer
80/tcp -> 0.0.0.0:8080
80/tcp -> [::]:8080
```
#### docker ps
运行 `docker ps` 可以查看到所有容器的端口映射列表
@@ -90,7 +84,6 @@ $ docker ps
CONTAINER ID IMAGE PORTS NAMES
abc123456 nginx 0.0.0.0:8080->80/tcp web
```
---
### 9.5.4 最佳实践与安全
@@ -104,12 +97,10 @@ abc123456 nginx 0.0.0.0:8080->80/tcp web
如果不希望对外暴露 (例如数据库服务)应绑定到 `127.0.0.1`
```bash
## 仅允许本机访问
$ docker run -d -p 127.0.0.1:3306:3306 mysql
```
#### 2. 避免端口冲突
如果宿主机 8080 已经被占用了容器将无法启动
@@ -126,7 +117,6 @@ $ docker run -d -p 127.0.0.1:3306:3306 mysql
```bash
$ docker run -d -p 53:53/udp dns-server
```
---
### 9.5.5 实现原理
@@ -136,12 +126,10 @@ Docker 使用 `docker-proxy` 进程 (用户态) 或 `iptables` DNAT 规则 (内
当流量到达宿主机端口时iptables 规则将其目标地址修改为容器 IP 并转发
```bash
## 简化的 iptables 逻辑
iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
```
这也是为什么你在容器内部看到的访问来源 IP 通常是网关 IP ( 172.17.0.1)而不是真实的外部 Client IP (除非使用 host 网络模式)
---

View File

@@ -7,7 +7,6 @@ Docker 网络提供了天然的隔离能力,不同网络之间的容器默认
不同网络之间默认隔离容器只能与同一网络中的容器直接通信
```bash
## 创建两个网络
$ docker network create frontend
@@ -26,7 +25,6 @@ $ docker run -d --name db --network backend postgres
$ docker exec web ping db
ping: db: Name or service not known
```
### 9.6.2 安全优势
这种隔离机制带来以下安全优势
@@ -43,7 +41,6 @@ ping: db: Name or service not known
如果确实需要某个容器跨网络通信可以将其同时连接到多个网络
```bash
## 创建一个中间件容器,连接到两个网络
$ docker run -d --name api --network frontend myapi
@@ -51,7 +48,6 @@ $ docker network connect backend api
## 现在 api 容器既可以访问 frontend 中的 web也可以访问 backend 中的 db
```
这种方式让你可以精确控制哪些容器可以跨网络通信遵循最小权限原则
### 9.6.4 典型网络架构
@@ -79,5 +75,4 @@ graph TD
API --> DB
API --> Cache
```
在这种架构中API 服务器同时连接到 `frontend` `backend` 网络充当两个网络之间的桥梁负载均衡器和 Web 服务器无法直接访问数据库增强了安全性

View File

@@ -29,13 +29,11 @@ veth 对
容器 B (192.168.0.3,不同宿主机)
```
#### 创建和使用 Overlay 网络
**Docker Swarm 模式下的 Overlay 网络**
```bash
# 初始化 Swarm创建集群
docker swarm init
@@ -58,11 +56,9 @@ docker service create --name web \
# 验证服务跨节点通信
docker service ps web
```
**单机 Overlay 网络模拟Linux 容器**
```bash
# 创建自定义 overlay 网络
docker network create --driver overlay custom-overlay
@@ -77,11 +73,9 @@ docker exec container1 curl http://container2
# 检查网络配置
docker network inspect custom-overlay
```
#### Overlay 网络性能优化
```bash
# 调整 MTUMaximum Transmission Unit避免分片
# VXLAN 开销 50 字节,物理 MTU 1500建议设置为 1450
docker network create --driver overlay \
@@ -113,7 +107,6 @@ networks:
driver_opts:
com.docker.network.driver.mtu: 1450
```
### 9.7.2 CNI 插件生态概览
容器网络接口CNI是容器编排平台尤其是 Kubernetes的标准化网络接口不同的 CNI 插件提供不同的网络能力
@@ -125,7 +118,6 @@ networks:
Calico 使用 BGP 协议进行路由支持网络策略和 eBPF 加速
```yaml
# Kubernetes 中安装 Calico
apiVersion: v1
kind: ConfigMap
@@ -154,13 +146,11 @@ data:
]
}
```
**Flannel - 简单可靠的 Overlay**
Flannel 提供简单的 overlay 网络实现适合小到中等规模的集群
```bash
# 安装 Flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
@@ -201,13 +191,11 @@ data:
}
EOF
```
**Cilium - eBPF 驱动的先进网络**
Cilium 使用 eBPF 在内核级别实现网络策略和可观测性性能优异
```bash
# 安装 Cilium
helm repo add cilium https://helm.cilium.io
helm install cilium cilium/cilium \
@@ -222,13 +210,11 @@ helm upgrade cilium cilium/cilium \
--set hubble.enabled=true \
--set hubble.ui.enabled=true
```
**Weave - 跨主机网络通信**
Weave 提供简单的跨主机通信支持加密和多播
```bash
# Docker 中使用 Weave 网络
docker run -d --name weave \
--net=host \
@@ -239,7 +225,6 @@ docker run -d --name weave \
# 连接到 Weave 网络
docker run -d --network weave --name web nginx:latest
```
**CNI 插件对比表**
| 特性 | Calico | Flannel | Cilium | Weave |
@@ -270,13 +255,11 @@ Docker 内嵌 DNS 服务器 (127.0.0.11)
DNS 响应 → 容器缓存 → 应用
```
#### 配置容器 DNS
**在运行时指定 DNS**
```bash
# 单个容器
docker run -d \
--dns 8.8.8.8 \
@@ -294,7 +277,6 @@ docker run -d \
# 查看容器 DNS 配置
docker exec <container_id> cat /etc/resolv.conf
```
**Docker Compose DNS 配置**
```yaml
@@ -325,7 +307,6 @@ networks:
# nameserver 8.8.8.8
# nameserver 1.1.1.1
```
**Docker 守护进程级别配置**
```json
@@ -336,13 +317,11 @@ networks:
"registry-mirrors": ["https://mirror.example.com"]
}
```
#### 自定义服务发现
**使用 Docker 内建 DNS 的服务发现**
```bash
# 创建自定义网络
docker network create mynet
@@ -356,7 +335,6 @@ docker run -it --network mynet busybox sh
# ping web # 自动解析到 web 容器 IP
# ping db # 自动解析到 db 容器 IP
```
**Compose 服务名自动发现**
```yaml
@@ -383,11 +361,9 @@ services:
# frontend 容器可以直接访问 http://backend:8080
# backend 容器可以直接访问 postgres://database:5432
```
#### DNS 性能优化
```bash
# 检查 DNS 延迟
time docker exec <container> nslookup www.example.com
@@ -417,7 +393,6 @@ kubectl patch deployment -n kube-system coredns --patch '{
}
}'
```
### 9.7.4 网络策略实践
网络策略定义了容器间的流量控制规则是微服务架构中的安全基础
@@ -438,7 +413,6 @@ spec:
- Ingress
# 不指定 ingress 规则,表示拒绝所有入站流量
```
**允许特定来源的入站流量**
```yaml
@@ -461,7 +435,6 @@ spec:
- protocol: TCP
port: 8080
```
**允许出站流量到数据库**
```yaml
@@ -500,7 +473,6 @@ spec:
- protocol: TCP
port: 443
```
#### 微服务网络策略示例
```yaml
@@ -625,7 +597,6 @@ spec:
- protocol: TCP
port: 5432
```
#### 使用 Calico/Cilium 的高级网络策略
**L7 应用层策略 Cilium 支持**
@@ -659,7 +630,6 @@ spec:
sourceIPs:
- "10.0.0.0/8"
```
### 9.7.5 跨主机容器通信方案对比
#### 方案对比表
@@ -675,7 +645,6 @@ spec:
#### 选择建议
```bash
# 1. 开发环境:使用 Bridge 网络
docker network create my-app
docker compose up # 默认使用 bridge
@@ -692,13 +661,11 @@ helm install cilium cilium/cilium --namespace kube-system
# 5. 需要多云/跨域:使用 Weave
```
### 9.7.6 网络故障排查
**常见网络问题诊断**
```bash
# 1. 容器无法访问外部网络
docker exec <container> ping 8.8.8.8
docker exec <container> cat /etc/resolv.conf

View File

@@ -28,7 +28,6 @@ graph TD
Internet((互联网)) <--> eth0
```
本章将详细介绍 Docker 网络配置的各个方面
## 本章内容