Docker容器网络是容器化部署中的核心基础设施。容器间通信、容器与宿主机通信、跨主机容器互通,都需要通过网络驱动来支撑。理解Docker网络模型并正确配置网络模式,是DevOps实践中保障服务可观测性和连通性的基础。
Docker网络驱动模型
Docker默认提供五种网络驱动:bridge、host、none、overlay、macvlan。不同驱动适用于不同部署场景,选择正确的驱动类型是网络配置的第一步。
# 查看当前网络列表
docker network ls
# 输出示例
# NETWORK ID NAME DRIVER SCOPE
# a1b2c3d4e5f6 bridge bridge local
# b2c3d4e5f6a1 host host local
# c3d4e5f6a1b2 none null local
# 查看某网络的详细配置
docker network inspect bridge
# 创建自定义bridge网络
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
--gateway 172.20.0.1 \
--ip-range 172.20.0.0/24 \
mynet
# 创建时指定网络
docker run -d --network mynet --name app nginx:latest
# 容器间通过容器名通信(自定义bridge网络支持DNS解析)
docker run -d --network mynet --name api myapi:latest
docker run -d --network mynet --name web nginx:latest
# web容器内可以直接 ping api 或 curl http://api:8080
自定义bridge网络相比默认bridge网络有一个关键优势:内置DNS解析。在默认bridge网络中,容器间只能通过IP地址通信;在自定义bridge网络中,容器名即为域名,自动解析为容器IP。这一特性在微服务部署中非常重要——服务发现不再依赖额外的DNS组件。
host模式与none模式的适用场景
host模式让容器直接使用宿主机网络栈,没有网络隔离。性能最好但安全性最差,适合对网络吞吐量要求极高的场景。none模式完全禁用网络,适合离线计算任务。
# host模式:容器直接使用宿主机网络
docker run -d --network host --name nginx nginx:latest
# 容器的80端口直接映射到宿主机80端口,无需-p参数
# 注意:host模式不支持端口映射(-p参数无效)
# none模式:完全禁用网络
docker run -d --network none --name isolated alpine sleep 3600
# 容器只有lo回环接口,无法与外部通信
# 手动为none容器配置网络(高级场景)
docker exec -it isolated sh
ip addr add 10.0.0.100/24 dev eth0
ip link set eth0 up
# 需要宿主机侧也做对应配置,通常用于测试
overlay网络实现跨主机容器通信
在多主机Docker部署中,overlay网络通过VXLAN隧道实现跨主机容器互通。使用overlay网络前需要初始化Swarm集群。
# 初始化Swarm集群(在管理节点执行)
docker swarm init --advertise-addr 192.168.1.10
# 其他节点加入Swarm
docker swarm join --token SWMTKN-xxx 192.168.1.10:2377
# 创建overlay网络
docker network create \
--driver overlay \
--subnet 10.10.0.0/16 \
--attachable \
my-overlay
# --attachable允许独立容器(非Swarm服务)加入该网络
# 不加--attachable则只有Swarm服务可以使用
# 在不同主机上启动容器,加入同一个overlay网络
# 主机A
docker run -d --network my-overlay --name app1 nginx:latest
# 主机B
docker run -d --network my-overlay --name app2 nginx:latest
# app1和app2可以直接通过容器名通信,自动跨主机路由
overlay网络的VXLAN封装会增加约50字节的数据包开销。在MTU为1500的网络环境中,建议将Docker的MTU设置为1450以避免分包。
# 创建overlay网络时设置MTU
docker network create \
--driver overlay \
--opt com.docker.network.driver.mtu=1450 \
my-overlay
# 查看容器网络接口和MTU
docker exec app1 ip addr show eth0
# 确认mtu 1450
容器与外部网络的通信控制
默认情况下容器可以通过宿主机的NAT规则访问外部网络。在生产环境中,需要对容器的出站流量做限制,防止容器被入侵后成为跳板。
# 查看Docker自动生成的iptables规则
iptables -t nat -L -n -v | grep -i docker
# POSTROUTING链中的MASQUERADE规则使容器可以访问外网
# 限制特定容器只能访问内网
docker run -d --name restricted --network mynet alpine sleep 3600
# 获取容器PID
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' restricted)
# 为容器创建独立的网络命名空间
mkdir -p /var/run/netns
ln -sf /proc/$CONTAINER_PID/ns/net /var/run/netns/restricted
# 在容器命名空间中设置路由限制
ip netns exec restricted ip route del default
ip netns exec restricted ip route add default via 172.20.0.1
ip netns exec restricted iptables -P OUTPUT DROP
ip netns exec restricted iptables -A OUTPUT -d 10.0.0.0/8 -j ACCEPT
ip netns exec restricted iptables -A OUTPUT -d 172.16.0.0/12 -j ACCEPT
# 清理
ip netns del restricted
端口映射与暴露的区别
Dockerfile中的EXPOSE和docker run的-p参数是两个不同概念。EXPOSE是文档性质的声明,不会实际映射端口;-p才真正创建端口映射规则。
# Dockerfile中声明暴露端口(仅文档作用)
# EXPOSE 8080
# 运行时映射端口到宿主机
docker run -d -p 8080:80 --name web nginx:latest
# 宿主机8080端口 → 容器80端口
# 绑定到特定IP
docker run -d -p 127.0.0.1:8080:80 nginx:latest
# 只监听localhost,外部无法访问
# 随机端口映射
docker run -d -P nginx:latest
# Docker自动分配一个32768-60999范围的高端口
# 查看端口映射
docker port web
# 80/tcp -> 0.0.0.0:8080
# 多端口映射
docker run -d \
-p 80:80 \
-p 443:443 \
-p 8080:8080 \
--name full nginx:latest
容器网络故障排查
容器网络不通时,系统化的排查步骤可以快速定位问题。
# 1. 确认容器状态和网络
docker inspect --format '{{.NetworkSettings.IPAddress}}' app1
docker inspect --format '{{json .NetworkSettings.Networks}}' app1
# 2. 从容器内测试连通性
docker exec app1 ping 8.8.8.8
docker exec app1 nslookup example.com
docker exec app1 curl -v http://api:8080
# 3. 检查宿主机iptables规则是否正常
iptables -t nat -L DOCKER -n -v
iptables -t filter -L DOCKER -n -v
# 4. 检查docker-proxy进程
ps aux | grep docker-proxy
# docker-proxy负责转发未走iptables的流量
# 5. 查看容器网络命名空间的详细状态
docker exec app1 ip addr
docker exec app1 ip route
docker exec app1 cat /etc/resolv.conf
# 6. overlay网络排查:检查VXLAN隧道
docker network inspect my-overlay | grep -A5 "Containers"
# 在各节点上检查VXLAN接口
ip link show | grep vxlan
常见的容器网络故障包括:bridge网络中容器无法访问外网(检查宿主机net.ipv4.ip_forward是否开启)、自定义网络中DNS解析失败(检查dockerd的DNS配置和容器内resolv.conf)、overlay网络跨主机不通(检查Swarm节点的4789/7946端口是否开放)。CI/CD流水线中部署容器时,网络配置应通过docker-compose或Swarm service声明式定义,避免手动docker run导致配置不一致。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/docker-rong-qi-wang-luo-pei-zhi-shi-zhan-bridgeoverlay-mo/