这是一个非常实用的运维问题。Docker 提供了多种网络模式来满足不同场景的需求。下面我从网络模式、配置方法、实战案例三个维度详细介绍。一、Docker 网络模式概览Docker 有五种核心网络模式网络模式命令参数特点适用场景bridge--network bridge默认模式容器独立网络栈单机多容器通信host--network host共享宿主机网络性能要求高none--network none无网络安全隔离container--network container:其他容器名共享另一个容器的网络栈容器间紧密通信overlay--network overlay跨主机通信Swarm 集群二、详细配置方法2.1 Bridge 模式默认原理每个容器有自己的网络命名空间通过 Docker 创建的虚拟网桥docker0通信。# 查看默认 bridge 网络dockernetwork inspect bridge# 运行容器默认就是 bridgedockerrun-d--nameapp1 nginx# 指定使用 bridge 网络dockerrun-d--nameapp2--networkbridge nginx# 容器之间可以通过 IP 通信dockerexecapp1ping172.17.0.3# 需要知道 IP自定义 bridge 网络推荐# 创建自定义 bridge 网络dockernetwork create--driverbridge--subnet172.20.0.0/16 mynet# 运行容器并连接到自定义网络dockerrun-d--nameapp1--networkmynet nginxdockerrun-d--nameapp2--networkmynet nginx# 容器间可以通过容器名直接通信自动 DNS 解析dockerexecapp1pingapp2# ✅ 可以通自定义网络支持容器名解析2.2 Host 模式原理容器直接使用宿主机的网络栈没有网络隔离。# 运行容器使用 host 网络dockerrun-d--namenginx-host--networkhostnginx# 直接访问宿主机的 80 端口即可curlhttp://localhost:80# 查看网络配置和宿主机一样dockerexecnginx-hostipaddr特点✅ 性能最好没有 NAT 转换✅ 端口自动映射不用 -p 参数❌ 端口冲突风险❌ 隔离性差2.3 None 模式原理容器只有 loopback 接口没有网络。# 运行无网络的容器dockerrun-d--nameisolated--networknone alpinesleep3600# 进入容器查看dockerexec-itisolatedsh# 只有 lo 接口没有 eth0ipaddr# 1: lo: LOOPBACK,UP,LOWER_UP ...# 无法 ping 通外网适用场景安全要求极高的容器只需要本地计算的作业测试环境2.4 Container 模式原理新容器共享另一个容器的网络栈。# 先运行一个容器dockerrun-d--nameweb--networkmynet nginx# 第二个容器共享 web 的网络dockerrun-d--namesidecar--networkcontainer:web alpinesleep3600# 查看网络配置两者一样dockerexecwebipaddrdockerexecsidecaripaddr适用场景监控容器共享目标容器的网络网络调试工具sidecar 模式2.5 Overlay 模式跨主机通信原理在 Swarm 集群中创建虚拟网络跨多台宿主机。# 1. 初始化 Swarmdockerswarm init# 2. 创建 overlay 网络dockernetwork create-doverlay--attachablemy-overlay# 3. 在不同主机上部署服务dockerservicecreate--nameapp1--networkmy-overlay--replicas2nginx三、端口映射3.1 基本端口映射# 随机端口映射宿主机会随机分配一个高端口dockerrun-d-p80nginx# 查看映射的端口dockerport容器80# 指定端口映射dockerrun-d-p8080:80 nginx# 指定 IP 和端口dockerrun-d-p127.0.0.1:8080:80 nginx# 多个端口映射dockerrun-d\-p8080:80\-p8443:443\nginx3.2 UDP 端口映射# 映射 UDP 端口dockerrun-d-p53:53/udp dns-server3.3 查看端口映射# 查看容器端口映射dockerport容器# 查看所有容器的端口映射dockerps--formattable {{.Names}}\t{{.Ports}}四、Docker Compose 网络配置4.1 基础网络配置version:3.8services:web:image:nginx ports:-8080:80networks:-frontend-backend app:image:myapp networks:-backend environment:-DB_HOSTmysql mysql:image:mysql:8.0networks:-backend volumes:-mysql-data:/var/lib/mysqlnetworks:frontend:driver:bridge backend:driver:bridge ipam:config:-subnet:172.20.0.0/16volumes:mysql-data:4.2 网络别名services:web:image:nginx networks:frontend:aliases:-webserver# 可以通过 webserver 访问redis:image:redis networks:backend:aliases:-cache-session-store4.3 固定 IPservices:mysql:image:mysql:8.0networks:backend:ipv4_address:172.20.0.10networks:backend:ipam:config:-subnet:172.20.0.0/24五、高级网络配置5.1 连接已有容器# 将正在运行的容器连接到网络dockernetwork connect mynet app1# 断开连接dockernetwork disconnect mynet app1# 指定 IP 连接dockernetwork connect--ip172.20.0.100 mynet app25.2 网络别名# 在网络中给容器起别名dockernetwork connect--aliasdb--aliasdatabase mynet mysql# 其他容器可以通过 db 或 database 访问 mysql5.3 自定义 DNS# 指定 DNS 服务器dockerrun-d--dns8.8.8.8--dns114.114.114.114 nginx# 在 docker-compose 中services: app: dns: -8.8.8.8 -114.114.114.114 dns_search: example.com5.4 Macvlan 网络直接使用物理网络# 创建 macvlan 网络dockernetwork create-dmacvlan\--subnet192.168.1.0/24\--gateway192.168.1.1\-oparenteth0\macnet# 容器直接获取局域网 IPdockerrun-d--networkmacnet--ip192.168.1.100 nginx六、网络故障排查6.1 常用调试命令# 查看所有网络dockernetworkls# 查看网络详情dockernetwork inspect bridge# 查看容器网络dockerinspect容器|grep-A20Networks# 进入容器测试网络dockerexec-it容器ping其他容器dockerexec-it容器curlhttp://service:port# 查看容器内的网络配置dockerexec容器ipaddrdockerexec容器route-ndockerexec容器cat/etc/hostsdockerexec容器cat/etc/resolv.conf6.2 常见问题排查# 问题1容器之间无法通信# 检查是否在同一网络dockernetwork inspect网络名|grep-A10Containers# 问题2端口映射不生效# 检查端口是否被占用netstat-tlnp|grep8080# 检查防火墙iptables-L-n|grep8080# 问题3DNS 解析失败dockerexec容器cat/etc/resolv.confdockerexec容器nslookup服务名七、网络性能优化7.1 使用 host 网络提升性能# 对性能要求高的服务dockerrun-d--networkhostnginx7.2 调整 bridge 网络参数// /etc/docker/daemon.json{bip:172.17.0.1/16,// 自定义 bridge IPfixed-cidr:172.17.0.0/16,// 容器 IP 范围mtu:1450,// 调整 MTUdefault-address-pools:[{base:172.80.0.0/16,size:24}]}7.3 使用 iptables 优化# 查看 Docker 创建的 iptables 规则iptables-tnat-L-niptables-tfilter-L-n八、安全配置8.1 网络隔离# 创建隔离的网络dockernetwork create--internalisolated-net# 不能访问外网# 使用 --iccfalse 禁止容器间通信dockerrun-d--labelcom.docker.network.bridge.enable_iccfalse nginx8.2 限制网络访问# 只允许特定 IP 访问iptables-IDOCKER-USER-ieth0-s192.168.1.0/24-jACCEPT iptables-IDOCKER-USER-ieth0!-s192.168.1.0/24-jDROP九、最佳实践总结9.1 选择指南场景推荐网络模式单机多容器通信自定义 bridge 网络需要容器名解析自定义 bridge 网络性能极致要求host 网络安全隔离none 网络sidecar 模式container 模式跨主机通信overlay 网络需要固定 IP自定义 bridge 固定 IP9.2 开发环境配置version:3.8services:frontend:image:nginx ports:-8080:80networks:-app-net backend:build:. environment:-REDIS_HOSTredis-DB_HOSTmysql networks:-app-net redis:image:redis networks:app-net:aliases:-cache mysql:image:mysql networks:-app-netnetworks:app-net:driver:bridge9.3 生产环境配置version:3.8services:app:image:myapp networks:-frontend-backend deploy:replicas:3nginx:image:nginx ports:-80:80networks:-frontend configs:-source:nginx.conf target:/etc/nginx/nginx.conf redis:image:redis networks:-backend volumes:-redis-data:/datanetworks:frontend:driver:overlay external:true# 使用外部网络backend:driver:overlay internal:true# 内部网络不可访问外网volumes:redis-data:十、常用命令速查操作命令列出网络docker network ls创建网络docker network create mynet删除网络docker network rm mynet查看网络docker network inspect mynet连接容器docker network connect mynet container断开连接docker network disconnect mynet container清理未用docker network prune端口映射docker run -p 8080:80 nginx指定网络docker run --network mynet nginx固定 IPdocker run --ip 172.20.0.100 nginxDNS 配置docker run --dns 8.8.8.8 nginx一句话总结Docker 网络配置的核心是选择合适的网络模式合理规划网络拓扑做好网络隔离和监控。