五种网络模式对比 1/6

模式适用场景隔离性DNS 解析端口映射
bridge同主机多容器通信(默认)容器间隔离自定义网络有需要 -p 映射
host高性能网络,直接用宿主机网络无隔离无(直接用宿主机)不需要
none完全隔离,不需要网络完全隔离
macvlan容器需要独立 IP(物理网络可见)物理网络级隔离依赖外部 DNS不需要
ipvlan类似 macvlan 但共享 MAC 地址较 macvlan 弱依赖外部 DNS不需要
# 创建不同类型的网络
docker network create mynet                    # bridge(默认)
docker network create -d macvlan \              # macvlan
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 macnet

自定义网络 DNS 解析 2/6

自定义 bridge 网络内置 DNS,容器可通过容器名互访。默认 bridge 网络不支持 DNS。

# 创建自定义网络
docker network create appnet

# 启动容器加入网络
docker run -d --name api --network appnet myapi
docker run -d --name web --network appnet nginx:alpine

# web 容器内可以直接访问 api
docker exec web curl http://api:8080
💡 Compose 自动创建自定义网络,服务名即 DNS 名:http://db:5432http://redis:6379

容器间通信 3/6

同网络通信

app (172.18.0.2) ← DNS: db → db (172.18.0.3)
同一自定义网络 appnet,通过容器名 DNS 互访

跨网络通信

frontend (fe_net) ← 需要端口映射 → 宿主机 localhost:8080 ← -p 8080:80 → backend (be_net)
不同网络的容器无法直接通信,需通过端口映射或 docker network connect

--link 已废弃 已废弃 4/6

--link 是 Docker 早期容器互联方式,已被自定义网络完全取代。

维度--link(已废弃)自定义网络(推荐)
DNS修改 /etc/hosts(静态)内置 DNS(动态)
双向通信不支持支持
多容器需逐个 link加入网络即可
重启后IP 变化可能失效DNS 自动更新
# ❌ 旧方式(已废弃)
docker run --name app --link db:database myapp

# ✅ 新方式(推荐)
docker network create mynet
docker run --name db --network mynet mysql:8.0
docker run --name app --network mynet myapp

端口映射安全 5/6

# 仅本机可访问
docker run -p 127.0.0.1:5432:5432 postgres:16-alpine

# 所有接口可访问(默认)
docker run -p 5432:5432 postgres:16-alpine

# Compose 中指定绑定地址
ports:
  - "127.0.0.1:5432:5432"  # 仅本机
  - "3000:3000"             # 公开
⚠️ 数据库等敏感服务务必绑定 127.0.0.1,避免暴露到公网。用 docker ps --format "table {{.Names}}\t{{.Ports}}" 检查端口绑定。

docker network connect 多网络 6/6

一个容器可以同时加入多个网络,实现灵活的网络拓扑。

# 创建前后端网络
docker network create frontend
docker network create backend

# API 容器加入两个网络
docker run -d --name api --network backend myapi
docker network connect frontend api

# Nginx 只在前端网络
docker run -d --name nginx --network frontend nginx:alpine

# DB 只在后端网络
docker run -d --name db --network backend mysql:8.0

# nginx → api (frontend网) → db (backend网)
# db 无法被 nginx 直接访问(网络隔离)
💡 Compose 中使用 networks 关键字为服务指定多个网络。