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

前端之家收集整理的这篇文章主要介绍了网络 – docker-compose:指定哪个接口将连接到每个网络(当有多个网络时)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在docker-compose.yaml里面我定义了4个不同的网络:

  1. networks:
  2. vpp-nw:
  3. vpp-client:
  4. vpp-server:
  5. vpp-db:

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

  1. 172.20.0.x
  2. 172.21.0.x
  3. 172.22.0.x
  4. 172.23.0.x

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

  1. # part of docker-compose.yaml
  2. services:
  3. my_tool:
  4. build: ./my_tool
  5. image: tgogos/my_tool
  6. container_name: my_tool_docker_comp
  7. hostname: my_tool
  8. privileged: true
  9. links:
  10. - my_db
  11. networks:
  12. - vpp-nw
  13. - vpp-client
  14. - vpp-server
  15. - vpp-db
  16. ports:
  17. - "8888:8888"

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

> eth0连接到第一个(vpp-nw)
> eth1连接到第二个(vpp-client)
> eth2连接到第三个(vpp-server)
> eth3连接到第四个(vpp-db)

您可以在下面看到此容器的ifconfig输出.每次我在docker-compose down时,NIC似乎都以任意方式连接到每个网络码头工人组成…

  1. eth0 Link encap:Ethernet HWaddr 02:42:ac:15:00:03
  2. inet addr:172.21.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
  3. eth1 Link encap:Ethernet HWaddr 02:42:ac:17:00:03
  4. inet addr:172.23.0.3 Bcast:0.0.0.0 Mask:255.255.0.0
  5. eth2 Link encap:Ethernet HWaddr 02:42:ac:14:00:02
  6. inet addr:172.20.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
  7. eth3 Link encap:Ethernet HWaddr 02:42:ac:16:00:03
  8. inet addr:172.22.0.3 Bcast:0.0.0.0 Mask:255.255.0.0

编辑:

进一步阅读,github问题:

> The order in which networks are assigned to interfaces does not match the order they are listed in compose file #4645
> 17.06 L4 ingress network not accessable #34003
> Control interface name in docker multiple networking #25181

最佳答案
这不是一个答案,但它确认了您报告的行为以及可用于提交错误报告的完整复制品.

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

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

  1. version: "2"
  2. services:
  3. server:
  4. image: alpine
  5. command: sleep 999
  6. networks:
  7. - nw0
  8. - nw1
  9. - nw2
  10. - nw3
  11. networks:
  12. nw0:
  13. nw1:
  14. nw2:
  15. nw3:

而这个shell脚本:

  1. #!/bin/sh
  2. docker-compose up -d
  3. for nw in 0 1 2 3; do
  4. nw_cidr=$(docker network inspect -f '{{ (index .IPAM.Config 0).Subnet }}' \
  5. nwtest_nw${nw})
  6. if_cidr=$(docker exec -it nwtest_server_1 ip addr show eth${nw} |
  7. awk '$1 == "inet" {print $2}')
  8. nw_net=$(ipcalc -n $nw_cidr | cut -f2 -d=)
  9. if_net=$(ipcalc -n $if_cidr | cut -f2 -d=)
  10. echo "nw${nw} $nw_net eth${nw} ${if_net}"
  11. if [ "$if_net" != "$nw_net" ]; then
  12. echo "MISMATCH: nw${nw} = $nw_net,eth${nw} = $if_net" >&2
  13. fi
  14. done
  15. docker-compose stop

您可以快速验证问题:

  1. $sh runtest.sh
  2. Starting nwtest_server_1
  3. nw0 192.168.32.0 eth0 192.168.32.0
  4. nw1 192.168.48.0 eth1 192.168.48.0
  5. nw2 192.168.64.0 eth2 192.168.80.0
  6. MISMATCH: nw2 = 192.168.64.0,eth2 = 192.168.80.0
  7. nw3 192.168.80.0 eth3 192.168.64.0
  8. MISMATCH: nw3 = 192.168.80.0,eth3 = 192.168.64.0
  9. Stopping nwtest_server_1 ...

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

  1. #!/bin/sh
  2. docker rm -f nwtest_server_1
  3. docker run -d --name nwtest_server_1 --network nwtest_nw0 \
  4. alpine sleep 999
  5. for nw in 1 2 3; do
  6. docker network connect nwtest_nw${nw} nwtest_server_1
  7. done
  8. for nw in 0 1 2 3; do
  9. nw_cidr=$(docker network inspect -f '{{ (index .IPAM.Config 0).Subnet }}' \
  10. nwtest_nw${nw})
  11. if_cidr=$(docker exec -it nwtest_server_1 ip addr show eth${nw} |
  12. awk '$1 == "inet" {print $2}')
  13. nw_net=$(ipcalc -n $nw_cidr | cut -f2 -d=)
  14. if_net=$(ipcalc -n $if_cidr | cut -f2 -d=)
  15. echo "nw${nw} $nw_net eth${nw} ${if_net}"
  16. if [ "$if_net" != "$nw_net" ]; then
  17. echo "MISMATCH: nw${nw} = $nw_net,eth${nw} = $if_net" >&2
  18. fi
  19. done
  20. docker rm -f nwtest_server_1

猜你在找的Docker相关文章