及其主要类型。)
Docker 的网络模型是其隔离和通信的核心。Docker 通过一套灵活的网络模型让容器之间、容器与宿主机、容器与外部世界能够以各种方式进行通信。下面我来详细拆解 Docker 的网络模型及其主要类型。一、Docker 网络模型的核心原理1.1 网络模型基础Docker 的网络模型基于 Linux 内核的几个关键技术技术作用类比Network Namespace网络隔离每个容器有自己的网络栈每个房间有独立的电话线Veth Pair虚拟网线连接两个网络空间一根网线插在两个设备之间Bridge虚拟交换机连接多个容器房间里的交换机Iptables网络规则NAT、防火墙门卫和路由规则1.2 默认网络模型图解渲染错误:Mermaid 渲染失败: Parse error on line 9: ...aph 容器1 C1[eth0容器内] ----------------------^ Expecting SEMI, NEWLINE, SPACE, EOF, subgraph, end, acc_title, acc_descr, acc_descr_multiline_value, AMP, COLON, STYLE, LINKSTYLE, CLASSDEF, CLASS, CLICK, DOWN, DEFAULT, NUM, COMMA, NODE_STRING, BRKT, MINUS, MULT, UNICODE_TEXT, direction_tb, direction_bt, direction_rl, direction_lr, direction_td, got LINK_ID二、Docker 的五大网络模式2.1 Bridge 网络默认模式原理Docker 创建一个虚拟网桥docker0容器连接到这个网桥获得私有 IP。# 查看默认 bridge 网络dockernetwork inspect bridge# 运行容器默认就是 bridgedockerrun-d--nameweb nginx# 查看容器 IPdockerinspect web|grepIPAddress# IPAddress: 172.17.0.2# 容器之间通过 IP 通信dockerexecwebping172.17.0.3# 创建自定义 bridge 网络推荐dockernetwork create--driverbridge--subnet172.20.0.0/16 mynet# 在自定义网络中容器名自动解析dockerrun-d--nameapp1--networkmynet nginxdockerrun-d--nameapp2--networkmynet nginxdockerexecapp1pingapp2# ✅ 可以 ping 通特点✅ 容器有独立 IP✅ 容器间可以通信默认允许✅ 通过端口映射对外服务✅ 自定义网络支持 DNS 解析适用场景单机多容器应用2.2 Host 网络原理容器直接使用宿主机的网络栈没有网络隔离。# 使用 host 网络dockerrun-d--namenginx-host--networkhostnginx# 直接访问宿主机端口curlhttp://localhost:80# 容器直接监听宿主机的 80 端口# 查看网络配置和宿主机一样dockerexecnginx-hostipaddr特点✅ 性能最好无 NAT 开销✅ 端口自动映射不用 -p 参数❌ 端口冲突风险❌ 隔离性差适用场景性能敏感型应用需要大量端口的应用监控容器需要看宿主机的网络2.3 None 网络原理容器只有 loopback 接口没有网络。# 运行无网络的容器dockerrun-d--nameisolated--networknone alpinesleep3600# 进入容器查看dockerexec-itisolatedshipaddr# 1: lo: LOOPBACK,UP,LOWER_UP ...只有 lo 接口# 无法访问外网ping8.8.8.8# 不通特点✅ 完全隔离✅ 最安全❌ 无法联网适用场景安全要求极高的容器离线计算任务只需要本地处理的作业2.4 Container 网络原理新容器共享另一个容器的网络栈。# 先运行一个容器dockerrun-d--nameweb--networkmynet nginx# 第二个容器共享 web 的网络dockerrun-d--namesidecar--networkcontainer:web alpinesleep3600# 查看网络两者完全一样dockerexecwebipaddrdockerexecsidecaripaddr# 通过 localhost 通信dockerexecsidecarcurlhttp://localhost:80# ✅ 可以访问 web 的 nginx特点✅ 网络完全共享✅ 可以通过 localhost 通信❌ 端口冲突不能监听相同端口适用场景Sidecar 模式监控、日志收集调试容器需要共享网络配置2.5 Overlay 网络跨主机原理在 Docker Swarm 集群中创建跨主机的虚拟网络。# 1. 初始化 Swarmdockerswarm init# 2. 创建 overlay 网络dockernetwork create-doverlay--attachablemy-overlay# 3. 在不同主机上运行容器# 主机1dockerrun-d--nameapp1--networkmy-overlay nginx# 主机2dockerrun-d--nameapp2--networkmy-overlay alpine# 4. 跨主机通信dockerexecapp2pingapp1# ✅ 可以 ping 通特点✅ 跨主机通信✅ 支持服务发现✅ 支持负载均衡❌ 配置稍复杂适用场景Swarm 集群跨主机微服务需要分布式部署三、网络类型对比网络模式命令隔离性通信范围性能适用场景Bridge--network bridge中同主机中默认单机应用Host--network host低宿主机高性能敏感None--network none高无-安全隔离Container--network container:xxx共享共享容器高SidecarOverlay--network overlay中跨主机中低Swarm 集群四、实际操作示例4.1 创建和管理网络# 列出所有网络dockernetworklsNETWORK ID NAME DRIVER SCOPE abc123def456 bridge bridgelocaldef456abc123hosthostlocal789abc123def none nulllocal# 创建网络dockernetwork create--driverbridge\--subnet172.18.0.0/16\--gateway172.18.0.1\--ip-range172.18.5.0/24\mynet# 查看网络详情dockernetwork inspect mynet# 连接容器到网络dockernetwork connect mynet container1dockernetwork connect--ip172.18.5.100 mynet container2# 断开连接dockernetwork disconnect mynet container1# 删除网络dockernetworkrmmynet4.2 端口映射详解# 基本端口映射dockerrun-d-p8080:80 nginx# 宿主机 8080 → 容器 80# 指定 IPdockerrun-d-p127.0.0.1:8080:80 nginx# 只能通过 localhost 访问# 随机端口dockerrun-d-p80nginxdockerport容器80# 查看随机分配的端口# UDP 端口dockerrun-d-p53:53/udp dns-server# 多个端口dockerrun-d\-p8080:80\-p8443:443\-p3306:3306\myapp4.3 DNS 配置# 指定 DNS 服务器dockerrun-d--dns8.8.8.8--dns114.114.114.114 nginx# 自定义 hostsdockerrun-d--add-host mydb:192.168.1.100 nginx# 在容器内查看dockerexec容器cat/etc/hostsdockerexec容器cat/etc/resolv.conf五、Docker Compose 网络配置5.1 基础配置version:3.8services:web:image:nginx networks:-frontend-backend ports:-80:80app:build:. networks:-backend environment:-DB_HOSTmysql mysql:image:mysql:8.0networks:-backendnetworks:frontend:driver:bridge backend:driver:bridge internal:true# 内部网络不能访问外网5.2 固定 IP 配置version:3.8services:mysql:image:mysql:8.0networks:backend:ipv4_address:172.20.0.10networks:backend:ipam:config:-subnet:172.20.0.0/24 gateway:172.20.0.1六、网络故障排查6.1 常用命令# 查看容器网络dockerinspect容器|grep-A20Networks# 进入容器测试dockerexec-it容器bashipaddr route-npinggoogle.comcurlhttp://other-container# 查看端口映射dockerport容器# 查看网络规则iptables-tnat-L-niptables-tfilter-L-n6.2 常见问题解决问题1容器间无法通信# 检查是否在同一网络dockernetwork inspect网络名|grep-A10Containers# 检查防火墙iptables-L-n|grepDOCKER问题2无法访问外网# 检查 DNSdockerexec容器cat/etc/resolv.conf# 检查路由dockerexec容器route-n# 宿主机上检查sysctlnet.ipv4.ip_forward# 应该为 1问题3端口映射不生效# 检查端口是否被占用netstat-tlnp|grep8080# 检查容器是否监听正确端口dockerexec容器netstat-tlnp七、最佳实践总结7.1 网络选择指南场景推荐网络原因单机多容器自定义 Bridge有 DNS 解析方便需要高性能Host无 NAT 开销安全隔离None完全隔离Sidecar 模式Container共享网络栈跨主机通信OverlaySwarm 集群必备开发环境Bridge Compose简单易用7.2 安全建议# 创建内部网络不能访问外网dockernetwork create--internalsecure-net# 使用自定义网络而不是默认 bridgedockernetwork create--optencrypted mynet# 加密# 限制容器间通信dockernetwork create\-ocom.docker.network.bridge.enable_iccfalse\isolated-net八、总结网络模式核心特点适用场景Bridge默认模式容器有独立 IP通过网桥连接大多数单机应用Host共享宿主机网络性能最好性能敏感型应用None无网络完全隔离安全敏感任务Container共享其他容器网络Sidecar 模式Overlay跨主机通信Swarm 集群一句话理解Docker 网络模型就是通过 Linux 内核技术实现的各种容器互联方案从最简单的单机通信到复杂的跨主机集群为不同场景提供了灵活的选择。