mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-24 18:55:31 +00:00
Add blank lines before headers
This commit is contained in:
@@ -18,6 +18,7 @@ Docker 容器的 DNS 配置有两种情况:
|
||||
这是 Docker 网络最强大的功能之一。在自定义网络中,容器可以通过 “名字” 找到彼此,而不需要知道对方的 IP (因为 IP 可能会变)。
|
||||
|
||||
```bash
|
||||
|
||||
## 1. 创建自定义网络
|
||||
|
||||
$ docker network create mynet
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
使用 `docker network create` 命令可以创建自定义网络:
|
||||
|
||||
```bash
|
||||
|
||||
## 创建网络
|
||||
|
||||
$ docker network create mynet
|
||||
@@ -31,6 +32,7 @@ $ docker network inspect mynet
|
||||
启动容器时通过 `--network` 参数指定连接的网络:
|
||||
|
||||
```bash
|
||||
|
||||
## 启动容器并连接到自定义网络
|
||||
|
||||
$ docker run -d --name web --network mynet nginx
|
||||
@@ -63,6 +65,7 @@ flowchart LR
|
||||
以下是 Docker 网络管理中常用的命令:
|
||||
|
||||
```bash
|
||||
|
||||
## 列出网络
|
||||
|
||||
$ docker network ls
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
同一自定义网络内的容器可以直接通过容器名通信,这是推荐的容器互联方式:
|
||||
|
||||
```bash
|
||||
|
||||
## 创建网络
|
||||
|
||||
$ docker network create app-net
|
||||
@@ -26,6 +27,7 @@ $ docker run -d --name app --network app-net myapp
|
||||
一个容器可以同时连接到多个网络,这对于需要跨网络通信的中间件容器特别有用:
|
||||
|
||||
```bash
|
||||
|
||||
## 启动容器
|
||||
|
||||
$ docker run -d --name multi-net-container --network frontend nginx
|
||||
@@ -44,6 +46,7 @@ $ docker inspect multi-net-container --format '{{json .NetworkSettings.Networks}
|
||||
`--link` 是 Docker 早期用于容器互联的方式,**已经被废弃**,不建议在新项目中使用。请使用自定义网络替代:
|
||||
|
||||
```bash
|
||||
|
||||
## 旧方式(不推荐)
|
||||
|
||||
$ docker run --link db:database myapp
|
||||
|
||||
@@ -30,6 +30,7 @@ Docker 提供了多种方式来指定端口映射。
|
||||
使用 `-p <宿主机端口>:<容器端口>` 格式:
|
||||
|
||||
```bash
|
||||
|
||||
## 将宿主机的 8080 端口映射到容器的 80 端口
|
||||
|
||||
$ docker run -d -p 8080:80 nginx
|
||||
@@ -103,6 +104,7 @@ 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
|
||||
@@ -134,6 +136,7 @@ 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
|
||||
|
||||
@@ -7,6 +7,7 @@ Docker 网络提供了天然的隔离能力,不同网络之间的容器默认
|
||||
不同网络之间默认隔离,容器只能与同一网络中的容器直接通信:
|
||||
|
||||
```bash
|
||||
|
||||
## 创建两个网络
|
||||
|
||||
$ docker network create frontend
|
||||
@@ -42,6 +43,7 @@ ping: db: Name or service not known
|
||||
如果确实需要某个容器跨网络通信,可以将其同时连接到多个网络:
|
||||
|
||||
```bash
|
||||
|
||||
## 创建一个中间件容器,连接到两个网络
|
||||
|
||||
$ docker run -d --name api --network frontend myapi
|
||||
|
||||
@@ -35,6 +35,7 @@ veth 对
|
||||
**Docker Swarm 模式下的 Overlay 网络:**
|
||||
|
||||
```bash
|
||||
|
||||
# 初始化 Swarm(创建集群)
|
||||
docker swarm init
|
||||
|
||||
@@ -61,6 +62,7 @@ docker service ps web
|
||||
**单机 Overlay 网络模拟(Linux 容器):**
|
||||
|
||||
```bash
|
||||
|
||||
# 创建自定义 overlay 网络
|
||||
docker network create --driver overlay custom-overlay
|
||||
|
||||
@@ -79,6 +81,7 @@ docker network inspect custom-overlay
|
||||
#### Overlay 网络性能优化
|
||||
|
||||
```bash
|
||||
|
||||
# 调整 MTU(Maximum Transmission Unit)避免分片
|
||||
# VXLAN 开销 50 字节,物理 MTU 1500,建议设置为 1450
|
||||
docker network create --driver overlay \
|
||||
@@ -122,6 +125,7 @@ networks:
|
||||
Calico 使用 BGP 协议进行路由,支持网络策略和 eBPF 加速。
|
||||
|
||||
```yaml
|
||||
|
||||
# Kubernetes 中安装 Calico
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
@@ -156,6 +160,7 @@ data:
|
||||
Flannel 提供简单的 overlay 网络实现,适合小到中等规模的集群。
|
||||
|
||||
```bash
|
||||
|
||||
# 安装 Flannel
|
||||
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
|
||||
|
||||
@@ -202,6 +207,7 @@ EOF
|
||||
Cilium 使用 eBPF 在内核级别实现网络策略和可观测性,性能优异。
|
||||
|
||||
```bash
|
||||
|
||||
# 安装 Cilium
|
||||
helm repo add cilium https://helm.cilium.io
|
||||
helm install cilium cilium/cilium \
|
||||
@@ -222,6 +228,7 @@ helm upgrade cilium cilium/cilium \
|
||||
Weave 提供简单的跨主机通信,支持加密和多播。
|
||||
|
||||
```bash
|
||||
|
||||
# Docker 中使用 Weave 网络
|
||||
docker run -d --name weave \
|
||||
--net=host \
|
||||
@@ -269,6 +276,7 @@ DNS 响应 → 容器缓存 → 应用
|
||||
**在运行时指定 DNS:**
|
||||
|
||||
```bash
|
||||
|
||||
# 单个容器
|
||||
docker run -d \
|
||||
--dns 8.8.8.8 \
|
||||
@@ -334,6 +342,7 @@ networks:
|
||||
**使用 Docker 内建 DNS 的服务发现:**
|
||||
|
||||
```bash
|
||||
|
||||
# 创建自定义网络
|
||||
docker network create mynet
|
||||
|
||||
@@ -343,6 +352,7 @@ docker run -d --name db --network mynet postgres:latest
|
||||
|
||||
# 在其他容器中通过服务名访问
|
||||
docker run -it --network mynet busybox sh
|
||||
|
||||
# ping web # 自动解析到 web 容器 IP
|
||||
# ping db # 自动解析到 db 容器 IP
|
||||
```
|
||||
@@ -377,6 +387,7 @@ services:
|
||||
#### DNS 性能优化
|
||||
|
||||
```bash
|
||||
|
||||
# 检查 DNS 延迟
|
||||
time docker exec <container> nslookup www.example.com
|
||||
|
||||
@@ -494,6 +505,7 @@ spec:
|
||||
|
||||
```yaml
|
||||
---
|
||||
|
||||
# 拒绝所有默认
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
@@ -506,6 +518,7 @@ spec:
|
||||
- Egress
|
||||
|
||||
---
|
||||
|
||||
# Frontend 容器策略
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
@@ -550,6 +563,7 @@ spec:
|
||||
port: 53
|
||||
|
||||
---
|
||||
|
||||
# API 容器策略
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
@@ -590,6 +604,7 @@ spec:
|
||||
port: 53
|
||||
|
||||
---
|
||||
|
||||
# 数据库容器策略
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
@@ -660,6 +675,7 @@ spec:
|
||||
#### 选择建议
|
||||
|
||||
```bash
|
||||
|
||||
# 1. 开发环境:使用 Bridge 网络
|
||||
docker network create my-app
|
||||
docker compose up # 默认使用 bridge
|
||||
@@ -682,6 +698,7 @@ helm install cilium cilium/cilium --namespace kube-system
|
||||
**常见网络问题诊断:**
|
||||
|
||||
```bash
|
||||
|
||||
# 1. 容器无法访问外部网络
|
||||
docker exec <container> ping 8.8.8.8
|
||||
docker exec <container> cat /etc/resolv.conf
|
||||
|
||||
Reference in New Issue
Block a user