双网卡Docker服务如何配置实现不同容器仅通过指定接口可访问
配置前常见疏漏说明
绝大多数类似多网络配置失效的核心原因是两点:
- 端口映射时未指定监听的物理网卡IP,Docker默认监听
0.0.0.0,导致所有网卡都能访问对应端口- 未配置策略路由,两个Docker网桥的流量默认都走主机的默认路由,无法实现出口绑定
方案1:自定义网桥绑定出口(低难度,无需macvlan)
该方案不需要修改现有网络架构,仅需新增路由规则和调整Docker配置即可实现需求:
- 步骤1:创建两个专属Docker网桥
分别规划两个网桥的独立网段,执行以下命令创建,网段可根据自身需求调整,不要和现有LAN、VPN网段冲突即可:# 创建LAN侧网桥,对应物理网卡eth0 docker network create --driver bridge --subnet 172.20.0.0/16 --opt com.docker.network.bridge.name=docker-lan lan_net # 创建VPN侧网桥,对应物理网卡eth1 docker network create --driver bridge --subnet 172.30.0.0/16 --opt com.docker.network.bridge.name=docker-vpn vpn_net - 步骤2:配置策略路由绑定出口
首先在/etc/iproute2/rt_tables文件末尾新增两行路由表标识:
执行以下命令添加路由规则,替换中括号内容为你实际的网关地址,若需要规则开机自动生效,可将路由规则写入开机启动脚本:100 lanrt 200 vpnrt# 配置LAN侧网桥流量走eth0 ip rule add from 172.20.0.0/16 table lanrt ip route add default via [LAN网关IP] dev eth0 table lanrt # 配置VPN侧网桥流量走eth1 ip rule add from 172.30.0.0/16 table vpnrt ip route add default via [VPN隧道网关IP] dev eth1 table vpnrt # 刷新路由缓存生效 ip route flush cache - 步骤3:调整docker-compose配置
给需要走指定网卡的容器分配对应网桥,同时端口映射时指定对应物理网卡的IP,避免全网卡监听:version: '3' networks: lan_net: external: true vpn_net: external: true services: # 仅LAN可访问的服务 lan-service: image: nginx networks: - lan_net # 仅在eth0的LAN IP上监听80端口 ports: - "[eth0的LAN IP]:80:80" # 仅VPN可访问的服务 vpn-service: image: nginx networks: - vpn_net # 仅在eth1的VPN IP上监听80端口 ports: - "[eth1的VPN IP]:80:80"
方案2:macvlan配置指南(最优场景为容器需和物理网络同网段)
如果需要容器直接获取LAN/VPN网段的原生IP、无需端口映射,可使用该方案:
- 步骤1:开启物理网卡混杂模式
ip link set eth0 promisc on ip link set eth1 promisc on - 步骤2:创建macvlan网络
替换中括号的网段、网关参数为你的实际值:# LAN侧macvlan网络 docker network create -d macvlan --subnet=[LAN网段,如192.168.1.0/24] --gateway=[LAN网关IP] -o parent=eth0 macvlan_lan # VPN侧macvlan网络 docker network create -d macvlan --subnet=[VPN网段] --gateway=[VPN网关IP] -o parent=eth1 macvlan_vpn - 步骤3:docker-compose配置示例
配置完成后容器可直接通过分配的固定IP从对应网段访问,无需端口映射。如果需要宿主机和macvlan容器通信,可额外创建宿主机端的macvlan子接口配置同网段IP即可。version: '3' networks: macvlan_lan: external: true macvlan_vpn: external: true services: lan-service: image: nginx networks: macvlan_lan: # 指定LAN网段内的固定IP ipv4_address: 192.168.1.200 vpn-service: image: nginx networks: macvlan_vpn: # 指定VPN网段内的固定IP ipv4_address: [VPN网段内的IP]
内容的提问来源于stack exchange,提问作者bas.cmd
相关产品推荐
相关产品推荐

