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



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

networks:
vpp-nw:
vpp-client:
vpp-server:
vpp-db:

分别使用以下网络地址:

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

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

# part of docker-compose.yaml
services:
my_tool:
build: ./my_tool
image: tgogos/my_tool
container_name: my_tool_docker_comp
hostname: my_tool
privileged: true
links:
- my_db
networks:
- vpp-nw
- vpp-client
- vpp-server
- vpp-db
ports:
- "8888:8888"

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

  • 连接到第一个 (VPP-NW) 的eth0
  • eth1连接到第二个(VPP 客户端)
  • eth2连接到第三个(VPP服务器)
  • 连接到第四个 (VPP-db) 的eth3

您可以在下面看到此容器的ifconfig输出。每次我docker-compose down|docker-compose up......

eth0  Link encap:Ethernet  HWaddr 02:42:ac:15:00:03  
inet addr:172.21.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
eth1  Link encap:Ethernet  HWaddr 02:42:ac:17:00:03  
inet addr:172.23.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
eth2  Link encap:Ethernet  HWaddr 02:42:ac:14:00:02  
inet addr:172.20.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
eth3  Link encap:Ethernet  HWaddr 02:42:ac:16:00:03  
inet addr:172.22.0.3  Bcast:0.0.0.0  Mask:255.255.0.0

编辑:

延伸阅读,github问题:

  • 网络分配给接口的顺序与它们在撰写文件 #4645 中列出的顺序不匹配
  • 17.06 L4 入口网络无法访问 #34003
  • docker 多网络中的控制接口名称 #25181

这不是答案,但它是您报告的行为以及可用于提交错误报告的完整重现的确认。

我能够重现你的行为。 我认为这是docker-compose中的一个错误,因为您服务上的networks键是一个有序列表。 我希望网络按照它们在文件中列出的顺序分配给接口。

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

version: "2"
services:
server:
image: alpine
command: sleep 999
networks:
- nw0
- nw1
- nw2
- nw3
networks:
nw0:
nw1:
nw2:
nw3:

而这个 shell 脚本:

#!/bin/sh
docker-compose up -d
for nw in 0 1 2 3; do
nw_cidr=$(docker network inspect -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_net=$(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 [ "$if_net" != "$nw_net" ]; then
echo "MISMATCH: nw${nw} = $nw_net, eth${nw} = $if_net" >&2
fi
done
docker-compose stop

您可以快速验证问题:

$ sh runtest.sh 
Starting nwtest_server_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
MISMATCH: nw2 = 192.168.64.0, eth2 = 192.168.80.0
nw3 192.168.80.0 eth3 192.168.64.0
MISMATCH: nw3 = 192.168.80.0, eth3 = 192.168.64.0
Stopping nwtest_server_1 ... 

此外,这个问题似乎是特定于docker-compose的;如果你创建一个带有docker run的Docker容器,然后连接多个网络,它们总是按照你的预期顺序分配给接口。 其测试脚本为:

#!/bin/sh
docker rm -f nwtest_server_1
docker run -d --name nwtest_server_1 --network nwtest_nw0 
alpine sleep 999
for nw in 1 2 3; do
docker network connect nwtest_nw${nw} nwtest_server_1
done
for nw in 0 1 2 3; do
nw_cidr=$(docker network inspect -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_net=$(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 [ "$if_net" != "$nw_net" ]; then
echo "MISMATCH: nw${nw} = $nw_net, eth${nw} = $if_net" >&2
fi
done
docker rm -f nwtest_server_1

可以使用 Docker 撰写引用中的优先级属性来指定将网络附加到容器的顺序。

https://docs.docker.com/compose/compose-file/compose-file-v2/#priority

...
services:
foo:
image: foo:latest
restart: always
networks:
network1:
priority: 1000 # eth0
network2:
priority: 900 # eth1
network3: # Default priority is 0, eth2
...

您可以尝试挂载配置文件

即对于基于 RH 的图像:

/etc/sysconfig/network-scripts/ifcfg-eth0

因此,您的 yml 文件如下所示:

# part of docker-compose.yaml
services:
my_tool:
build: ./my_tool
image: tgogos/my_tool
container_name: my_tool_docker_comp
hostname: my_tool
privileged: true
links:
- my_db
networks:
- vpp-nw
- vpp-client
- vpp-server
- vpp-db
volumes:
- ./conf/eth0:/etc/sysconfig/network-scripts/ifcfg-eth0
- ./conf/eth1:/etc/sysconfig/network-scripts/ifcfg-eth1
- ./conf/eth2:/etc/sysconfig/network-scripts/ifcfg-eth2
- ./conf/eth3:/etc/sysconfig/network-scripts/ifcfg-eth3
ports:
- "8888:8888"

相关内容

  • 没有找到相关文章

最新更新