在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”>&;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”>&;2.
fi
完成
docker rm-f nwtest_服务器_1