15.6.1 Docker网络驱动与模型概述

Docker网络驱动与模型概述#

Docker 网络由“网络命名空间 + veth pair + Linux 网桥/隧道 + iptables 规则”构成,通过不同网络驱动实现隔离与互通。容器默认运行在独立 network namespace 中,拥有各自的 IP、路由表与端口,借助 veth pair 与宿主机网络栈连接。

原理草图(默认 bridge)#

文章图片

网络驱动类型与适用场景(含示例)#

  • bridge(默认):单宿主机容器互通,NAT 访问外网
    示例:创建 bridge 网络并运行容器
    bash docker network create -d bridge app-net docker run -d --name web --network app-net nginx:1.25 docker run -it --rm --network app-net busybox:1.36 ping -c 2 web # 预期:busybox 能解析并 ping 通 web

  • host:共享宿主机网络命名空间,性能高、隔离弱
    bash docker run -d --name host-nginx --network host nginx:1.25 ss -lntp | grep 80 # 预期:直接看到宿主机 80 端口被 nginx 占用

  • none:不配置网络,仅 loopback
    bash docker run -it --rm --network none busybox:1.36 ip a # 预期:只看到 lo

  • overlay:跨主机通信(需 Swarm/K8s),适合多节点
    bash docker swarm init docker network create -d overlay ov-net # 预期:overlay 网络创建成功,可用于多节点服务

  • macvlan:容器直接接入二层网络
    bash docker network create -d macvlan \ --subnet=192.168.10.0/24 --gateway=192.168.10.1 \ -o parent=eth0 macvlan-net docker run -d --name macvlan-nginx --network macvlan-net nginx:1.25 # 预期:容器获取 192.168.10.0/24 地址

核心概念与命令解释#

  • 网络命名空间(netns):隔离容器网络栈
    bash # 查看容器进程对应的网络命名空间 PID=$(docker inspect -f '{{.State.Pid}}' web) ls -l /proc/$PID/ns/net

  • veth pair:成对虚拟网卡将容器与宿主机桥接
    bash ip link | grep veth # 预期:看到 vethxxxx@ifY 形式设备

  • Linux Bridge(docker0):默认桥接
    bash ip addr show docker0 bridge link

  • iptables/NAT:端口映射与出站访问
    bash iptables -t nat -L -n | sed -n '1,80p' # 关注 DOCKER 链与 DNAT/SNAT 规则

数据流路径示例#

  • 容器内访问外网
    bash docker run -it --rm busybox:1.36 sh -c "ip r; ping -c 2 8.8.8.8" # 预期:默认路由指向 docker0 网关

  • 外部访问容器端口(端口映射)
    bash docker run -d --name webp -p 8080:80 nginx:1.25 curl -I http://127.0.0.1:8080 # 预期:返回 HTTP/1.1 200 OK

安装与验证(网络工具补齐)#

# Debian/Ubuntu
apt-get update && apt-get install -y iproute2 iptables bridge-utils
# CentOS/RHEL
yum install -y iproute iptables-services bridge-utils

排错与诊断清单(含命令)#

  1. 容器无法出网
    - 检查 NAT 规则
    bash iptables -t nat -S | grep -E 'MASQUERADE|DOCKER'
    - 检查宿主机转发
    bash sysctl net.ipv4.ip_forward # 需为 1

  2. 容器间无法互通(同网络)
    - 检查容器网络
    bash docker network inspect app-net
    - 检查防火墙拦截
    bash iptables -L -n | sed -n '1,80p'

  3. 端口映射不通
    - 检查容器内服务监听
    bash docker exec webp ss -lntp
    - 检查宿主机端口占用
    bash ss -lntp | grep 8080

小结与运维关注点#

  • 驱动选型要匹配部署规模与性能目标(单机选 bridge,多主机选 overlay)。
  • NAT 与端口映射应纳入安全策略与审计。
  • 多网络并存时需确认容器默认路由与 DNS 解析逻辑。

练习#

  1. 在同一宿主机创建自定义 bridge 网络,让两个容器互通并互相 ping。
  2. --network host 运行 Nginx,比较端口监听与 bridge 模式差异。
  3. 通过 docker network inspect 输出解析容器 IP、网关与连接列表。
  4. 关闭 net.ipv4.ip_forward 后验证容器出网失败,并恢复。