Docker容器网络隔离本质是利用Linux内核网络命名空间与veth pair协同实现:每个容器独享网络栈(含lo、eth0、路由表、IP等),veth pair一端在容器命名空间作为eth0,另一端挂载宿主机网桥或物理网卡,完成数据转发。

配置 Docker 容器的网络命名空间(Net Namespace)以实现独立虚拟网卡与 IP 分配,本质是利用 Linux 内核的隔离机制,配合 veth pair 和桥接设备完成网络栈初始化。Docker 默认已在容器启动时自动创建 Net Namespace 并完成基础配置,但若需精细控制(如指定 IP、绕过 NAT、绑定物理网卡),需理解底层逻辑并选择合适网络模式。
理解 Net Namespace 与 veth pair 的协同作用
每个容器启动时,Docker 会为其分配一个独立的 Net Namespace——它包含专属的:
- 回环接口(lo)和虚拟网卡(如 eth0)
- 路由表、ARP 表、iptables 规则
- IP 地址、子网掩码、默认网关
veth pair 是连接容器与宿主机的关键桥梁:一端在容器 Net Namespace 内(如 eth0),另一端在宿主机根命名空间中(如 vethabcd12),并挂载到 docker0 桥或物理网卡上。数据包经此“虚拟网线”进出容器,实现通信隔离与转发。
使用 bridge 网络实现自动 IP 分配
这是最常用且无需手动干预 Net Namespace 的方式。Docker 会自动为容器创建 Net Namespace,并通过内置桥接器 docker0 分配私有 IP:
- 创建自定义桥接网络(推荐替代默认 docker0):
docker network create --driver bridge --subnet=192.168.50.0/24 mybridge - 启动容器并指定静态 IP(必须在子网内且未被占用):
docker run -d --network=mybridge --ip=192.168.50.10 nginx - 验证:进入容器执行 ip addr show eth0,可见已分配对应 IP;宿主机可通过该 IP 直接访问容器服务(同网段内)
用 macvlan 实现局域网级独立 IP
当需要容器像物理机一样直接获取局域网 IP(跳过 NAT、不共享宿主机 IP),应使用 macvlan 驱动。它让容器的虚拟网卡“直连”物理网卡,拥有真实 MAC 和局域网 IP:
- 确认物理网卡(如 enp0s3)及所在子网(如 192.168.1.0/24),并确保交换机支持混杂模式或 VLAN trunk
- 创建 macvlan 网络(绑定物理网卡,设置网关):
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=enp0s3 macvlan-net - 启动容器并指定局域网 IP:
docker run -it --network=macvlan-net --ip=192.168.1.200 alpine ping 8.8.8.8 - 注意:宿主机原网络连接不受影响,但需预留 IP 范围避免冲突(如加 --ip-range=192.168.1.128/25)
手动介入 Net Namespace(高级场景)
适用于调试、定制化网络或 none 模式容器。需直接操作命名空间与 veth 设备:
- 启动容器时不配置网络:
docker run -it --net=none --name=test-centos centos:7 /bin/bash - 创建 veth pair 并挂载一端到容器命名空间:
pipework br0 test-centos 192.168.50.50/24@192.168.50.1(需提前安装 pipework) - 或使用 ip 命令手动注入(需容器 PID):
ip link add veth0 type veth peer name veth1
ip link set veth1 netns $(docker inspect -f '{{.State.Pid}}' test-centos)
ip netns exec $(docker inspect -f '{{.State.Pid}}' test-centos) ip addr add 192.168.50.50/24 dev veth1


















