docker compose:指定将连接到每个网络的接口(当有多个网络时)

在docker compose.yaml中,我定义了4个不同的网络:

网络:
vpp西北:
vpp客户端:
vpp服务器:
vpp数据库:

它们分别使用以下网络地址:

172.20.0.x
172.21.0.x
172.22.0.x
172.23.0.x

我使用的其中一个容器连接到所有4个网络(顺序相同):

docker-compose.yaml的一部分
服务:
我的工具:
构建:./myu工具
图:tgogos/my_工具
容器名称:我的工具码头工人公司
主机名:我的工具
特权:真的
链接:
-我的
网络:
-vpp西北
-vpp客户端
-vpp服务器
-vpp数据库
端口:
– “8888:8888”

有没有办法定义哪个接口将连接到每个网络?例如,我想:

  • eth0连接到第一个(vpp nw)
  • eth1连接到第二个(vpp客户端)
  • eth2连接到第三台(vpp服务器)
  • eth3连接到第四个(vpp db)

下面您可以看到此容器的ifconfig输出。每次我docker compose down|docker compose up,NIC似乎都以任意方式连接到每个网络

eth0链路封装:以太网HWaddr 02:42:ac:15:00:03
inet地址:172.21.0.3 Bcast:0.0.0掩码:255.255.0.0
eth1链路封装:以太网HWaddr 02:42:ac:17:00:03
inet地址:172.23.0.3 Bcast:0.0.0掩码:255.255.0.0
eth2链路封装:以太网HWaddr 02:42:ac:14:00:02
inet地址:172.20.0.2 Bcast:0.0.0掩码:255.255.0.0
eth3链路封装:以太网HWaddr 02:42:ac:16:00:03
inet地址:172.22.0.3 Bcast:0.0.0掩码:255.255.0.0

编辑:

进一步阅读,github问题:

  • 网络分配给接口的顺序与组合文件#4645中列出的顺序不匹配
  • 17.06 L4入口网络不可访问#34003
  • docker多网络中的控制接口名称#25181

这不是答案,但它是对您报告的行为的确认,以及可用于提交错误报告的完整复制器

我能模仿你的行为。我认为这是docker compose中的一个bug,因为您服务上的网络键是一个有序列表。我希望网络按照文件中列出的顺序分配给接口

使用此docker compose.yml(在名为nwtest的目录中):

版本:“2”
服务:
服务器:
图片:阿尔卑斯山
命令:睡眠999
网络:
-nw0
-nw1
-nw2
-nw3
网络:
nw0:
nw1:
nw2:
nw3:

这个shell脚本:

#/垃圾箱/垃圾箱
docker compose up-d
西北方向为0123;做
nw_cidr=$(docker网络检查-f'{(index.IPAM.Config 0.Subnet}}'\
nwtest_nw${nw})
if_cidr=$(docker exec-it nwtest_server_1 ip addr show eth${nw}|
awk'$1==“inet”{print$2}')
nw_净=$(ipcalc-n$nw_cidr | cut-f2-d=)
if_net=$(ipcalc-n$if_cidr | cut-f2-d=)
echo“nw${nw}$nw_net eth${nw}${if_net}”
如果[“$if_net”!=“$nw_net”];然后
echo“不匹配:nw${nw}=$nw_-net,eth${nw}=$if_-net”&gt&2.
fi
完成
码头工人站

您可以快速验证问题:

$sh runtest.sh
正在启动nwtest_服务器\u 1
nw0 192.168.32.0 eth0 192.168.32.0
nw1 192.168.48.0 eth1 192.168.48.0
nw2 192.168.64.0 eth2 192.168.80.0
不匹配:nw2=192.168.64.0,eth2=192.168.80.0
nw3 192.168.80.0 eth3 192.168.64.0
不匹配:nw3=192.168.80.0,eth3=192.168.64.0
正在停止nwtest\u服务器\u 1。。。

此外,这个问题似乎是特定于docker compose;如果使用Docker run创建Docker容器,然后连接多个网络,则它们总是按预期顺序分配给接口。这方面的测试脚本是:

#/垃圾箱/垃圾箱
docker rm-f nwtest_服务器_1
docker run-d--名称nwtest\u服务器\u 1--网络nwtest\u nw0\
高山睡眠999
西北方向为1 2 3;做
docker网络连接nwtest_nw${nw}nwtest_服务器\u 1
完成
西北方向为0123;做
nw_cidr=$(docker网络检查-f'{(index.IPAM.Config 0.Subnet}}'\
nwtest_nw${nw})
if_cidr=$(docker exec-it nwtest_server_1 ip addr show eth${nw}|
awk'$1==“inet”{print$2}')
nw_净=$(ipcalc-n$nw_cidr | cut-f2-d=)
if_net=$(ipcalc-n$if_cidr | cut-f2-d=)
echo“nw${nw}$nw_net eth${nw}${if_net}”
如果[“$if_net”!=“$nw_net”];然后
echo“不匹配:nw${nw}=$nw_-net,eth${nw}=$if_-net”&gt&2.
fi
完成
docker rm-f nwtest_服务器_1

发表评论