Skip to content

01 - Docker 网络模型

Docker 网络类型

Docker 提供了多种网络驱动,每种适用于不同场景:

┌─────────────────────────────────────────────────────────────┐
│                      Docker Host                            │
│                                                             │
│  ┌──────────────────────────────────────────────────────┐   │
│  │           bridge (docker0) - 默认                     │   │
│  │  172.17.0.0/16                                       │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐              │   │
│  │  │ App A   │  │ App B   │  │ App C   │              │   │
│  │  │ .17.0.2 │  │ .17.0.3 │  │ .17.0.4 │              │   │
│  │  └─────────┘  └─────────┘  └─────────┘              │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌───────────────────────────┐                              │
│  │  host 网络                 │                              │
│  │  容器直接使用宿主机网络栈    │                              │
│  │  没有网络隔离               │                              │
│  └───────────────────────────┘                              │
│                                                             │
│  ┌───────────────────────────┐                              │
│  │  none 网络                 │                              │
│  │  完全隔离,无网络连接        │                              │
│  └───────────────────────────┘                              │
└─────────────────────────────────────────────────────────────┘

四种主要网络模式

模式说明使用场景
bridge默认模式,容器通过虚拟网桥通信单机多容器通信
host容器共享宿主机网络栈需要最高网络性能
none没有网络连接安全隔离、离线处理
overlay跨主机容器网络Docker Swarm / 多机部署

Bridge 网络详解

默认 bridge 网络

bash
# 查看所有网络
docker network ls

# 查看默认 bridge 网络详情
docker network inspect bridge

# 默认 bridge 的容器之间可以通过 IP 通信,但不能通过容器名通信
docker run -d --name c1 nginx:alpine
docker run -d --name c2 nginx:alpine

docker exec c1 ping -c 2 172.17.0.3   # ✓ 可以通过 IP
docker exec c1 ping -c 2 c2           # ✗ 不能通过容器名

自定义 bridge 网络(推荐)

bash
# 创建自定义网络
docker network create my-network

# 在自定义网络中运行容器
docker run -d --name c1 --network my-network nginx:alpine
docker run -d --name c2 --network my-network nginx:alpine

# 自定义网络支持容器名 DNS 解析
docker exec c1 ping -c 2 c2           # ✓ 可以通过容器名!

# 清理
docker stop c1 c2 && docker rm c1 c2
docker network rm my-network

自定义网络的优势

  1. 自动 DNS 解析:容器之间可以通过名称互相访问
  2. 更好的隔离:不同网络中的容器互相不可见
  3. 可配置:可以指定子网、网关等

端口映射深入

bash
# 映射到指定端口
docker run -d -p 8080:80 nginx

# 映射到随机端口
docker run -d -p 80 nginx
docker port <container_id>  # 查看分配的端口

# 映射到指定 IP
docker run -d -p 127.0.0.1:8080:80 nginx

# 映射多个端口
docker run -d -p 8080:80 -p 8443:443 nginx

# 映射 UDP 端口
docker run -d -p 5353:53/udp dns-server

实操练习

bash
# 创建一个隔离的应用网络
docker network create app-net

# 运行 Redis
docker run -d --name redis --network app-net redis:alpine

# 运行一个 Python 容器,验证可以通过名称访问 Redis
docker run --rm -it --network app-net python:3.11-slim bash
# 在容器内:
pip install redis
python -c "import redis; r = redis.Redis(host='redis'); r.set('key','hello'); print(r.get('key'))"
exit

# 清理
docker stop redis && docker rm redis
docker network rm app-net

下一步

02 - Docker 数据卷