Docker网络是容器化部署中最关键的组件之一,决定了容器之间的通信方式和与外部网络的连接能力。Docker提供了多种网络驱动,满足不同的网络隔离和连接需求。本文以Ubuntu 20.04为例,全面介绍Docker的网络模型、配置方法和生产环境最佳实践。
▶一、Docker网络驱动概览
Docker内置的5种网络驱动各有特点:Bridge(桥接)模式是默认驱动,每个容器拥有独立网络命名空间通过docker0网桥通信;Host模式容器直接使用宿主机网络栈,性能最佳但隔离性弱;Overlay模式实现跨主机的容器通信,是Swarm集群的基础;MacVLAN将容器直接连接到物理网络;None模式完全隔离不使用网络。
▶二、Bridge网络模式配置
# 创建自定义Bridge网络
docker network create --driver bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 --ip-range=172.20.10.0/24 --label=env=prod prod_network
# 查看网络列表
docker network ls
# 启动容器并连接到指定网络
docker run -d --name nginx --network prod_network -p 8080:80 nginx:alpine
# 容器连接到多个网络
docker network connect prod_network mysql
docker network connect monitoring_network mysql
# 网络内部DNS解析
# 在同一网络中,容器可直接通过容器名互相访问
docker run --rm --network prod_network alpine ping nginx
▶三、自定义Bridge高级配置
# 配置自定义网桥参数
# /etc/docker/daemon.json
{
"bip": "172.20.0.1/16",
"default-address-pools": [
{"base": "172.20.0.0/16", "size": 24},
{"base": "172.21.0.0/16", "size": 24}
],
"icc": true,
"iptables": true,
"ip-forward": true,
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64",
"mtu": 1500
}
# 重启Docker服务
systemctl restart docker
# 使用docker-compose配置自定义网络
networks:
app_network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
gateway: 172.20.0.1
driver_opts:
com.docker.network.bridge.name: br-app
com.docker.network.bridge.enable_icc: "true"
com.docker.network.driver.mtu: "1500"
▶四、Host网络模式
# Host模式:容器使用宿主机网络栈
docker run -d --name nginx-host --network host nginx:alpine
# 优势:零网络开销,性能最高
# 适用场景:对网络性能要求极高的应用
# 限制:端口不能单独映射,容器与宿主机端口完全共享
# 查看Host模式下的网络
docker exec nginx-host ip addr show
docker exec nginx-host ss -tuln
▶五、Overlay网络模式(Swarm集群)
# 初始化Docker Swarm
docker swarm init --advertise-addr 192.168.1.100
# 创建Overlay网络
docker network create --driver overlay --subnet=10.0.0.0/16 --gateway=10.0.0.1 --opt encrypted swarm_overlay
# 部署服务使用Overlay网络
docker service create --name web --network swarm_overlay --replicas 3 --publish 80:80 nginx:alpine
# Overlay网络内部服务发现
# 服务名自动解析为所有副本的VIP地址
docker service create --name whoami --network swarm_overlay alpine ping web
▶六、MacVLAN网络配置
# MacVLAN:容器直接使用物理网络IP
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 --ip-range=192.168.1.200/28 -o parent=eth0 macvlan_network
# 启动使用MacVLAN网络的容器
docker run -d --name web-macvlan --network macvlan_network --ip=192.168.1.200 nginx:alpine
# 注意:MacVLAN模式下宿主机与容器不能直接通信
# 解决方案:创建MacVLAN的同时将宿主机IP也加入
# IPvlan(MacVLAN的简化版)
docker network create -d ipvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 -o ipvlan_mode=l2 ipvlan_network
▶七、容器网络安全
# 网络隔离策略
# 创建仅内部通信的网络
docker network create --internal internal_net
# 启动容器仅连接内部网络
docker run -d --name db --network internal_net mysql:8.0
# 连接外部网络和内部网络
docker network connect bridge web
docker network connect internal_net web
# Docker网络防火墙规则
# 默认Docker修改iptables,可通过配置关闭
# /etc/docker/daemon.json
{
"iptables": false
}
# 自定义iptables规则保护Docker网络
iptables -I DOCKER-USER -i eth0 ! -s 192.168.1.0/24 -j DROP
iptables -I DOCKER-USER -p tcp --dport 80 -j ACCEPT
▶八、网络性能测试与调优
# 测试不同网络模式的性能差异
# 创建测试网络
docker network create --driver bridge test_bridge
# Bridge模式测试
docker run -d --name server-bridge --network test_bridge alpine sleep 3600
docker run -d --name client-bridge --network test_bridge alpine sleep 3600
iperf_result=$(docker exec client-bridge iperf -c server-bridge)
echo "Bridge: $iperf_result"
# Host模式测试
docker run -d --name server-host --network host alpine sleep 3600
docker run -d --name client-host --network host alpine sleep 3600
iperf_result=$(docker exec client-host iperf -c 127.0.0.1)
echo "Host: $iperf_result"
# MacVLAN模式测试
docker run -d --name server-macvlan --network macvlan_network alpine sleep 3600
docker run -d --name client-macvlan --network macvlan_network alpine sleep 3600
▶九、Docker Compose多服务网络
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
networks:
- frontend
- backend
depends_on:
- app
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
app:
image: node:18-alpine
networks:
- backend
environment:
- DB_HOST=db
depends_on:
- db
db:
image: mysql:8.0
networks:
- backend
volumes:
- db_data:/var/lib/mysql
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 后端网络不对外暴露
volumes:
db_data:
▶十、故障排除指南
Docker网络常见问题:容器无法访问外网(检查iptables规则和ip_forward)、跨主机容器通信失败(检查Overlay网络的VXLAN端口4789/udp是否开放、确认Swarm集群节点间连通性)、DNS解析失败(检查embedded DNS server 127.0.0.11是否可达、确认--dns配置是否正确)、MacVLAN宿主机无法访问容器(使用MacVLAN的trunk模式或创建子接口)。
▶十一、Kubernetes容器网络接口(CNI)配置
Kubernetes通过CNI插件实现容器网络,主流的CNI插件包括Calico、Flannel和Weave。Calico基于BGP协议实现高性能三层网络,支持网络策略(NetworkPolicy)实现微隔离。Flannel提供简单的Overlay网络,适合小规模集群。Cilium基于eBPF技术提供高性能的网络安全和可观测性。选择CNI插件时需要综合考虑性能、功能和安全需求。
▶十二、容器网络策略与微隔离
在容器化环境中,网络策略(NetworkPolicy)实现命名空间级别的网络隔离和安全控制。通过定义入站和出站规则,精确控制Pod之间的通信权限。配置默认拒绝所有入站流量的策略,然后按需开放业务端口。网络策略基于标签选择器而非IP地址,适应Kubernetes的动态调度特性。定期审计网络策略命中率,优化策略的精确性和最小权限原则。
▶十三、网络策略的安全合规审计
容器网络策略的合规审计是Kubernetes安全的重要环节。使用kube-bench和kube-hunter检查Kubernetes集群网络的安全配置是否符合CIS基准要求。NetworkPolicy的审计包括确认默认拒绝策略已配置、关键命名空间的网络隔离已启用、未使用的策略已及时清理。审计结果生成合规报告标记不符合安全要求的策略配置,及时整改以满足合规要求。
容器网络的可观测性也不可忽视,使用Cilium的Hubble组件实时监控服务间通信流量。Hubble提供Kubernetes级别的网络可视化展示,清晰呈现每个工作负载的网络连接关系。配合网络拓扑图快速发现异常的通信链路,网络策略调优和安全事件调查效率显著提升。
注册
登录控制台
