Docker 编写网络 - 忽略优先级 属性

Docker compose networking - Priority property ignored

我编写了 docker-compose.yaml 文件,其中包含 4 个网络接口,这些接口在挂载到 docker 容器时需要按特定顺序排列。

Docker 引擎版本:19.03

Docker-撰写版本:2.4.1

我们正在使用 macvlan 驱动程序作为我们系统的一部分,以便在主机接口之间传输 L2 数据包。 我们用来托管所有内容的 docker 容器基于 ubuntu:18.04

networks:
    sim1:
       name: sim1
       driver: macvlan
       driver_opts:
           parent: ens20
           macvlan_mode: bridge
       ipam:
           config:
           - subnet: 192.3.0.0/16
             ip_range: 192.3.1.0/24
    sim2:
       name: sim2
       driver: macvlan
       driver_opts:
           parent: ens21
           macvlan_mode: bridge
       ipam:
           config:
           - subnet: 192.4.0.0/16
             ip_range: 192.4.1.0/24
    sim3:
       name: sim1
       driver: macvlan
       driver_opts:
           parent: ens20
           macvlan_mode: bridge
       ipam:
           config:
           - subnet: 192.5.0.0/16
             ip_range: 192.5.1.0/24
    sim4:
       name: sim1
       driver: macvlan
       driver_opts:
           parent: ens20
           macvlan_mode: bridge
       ipam:
           config:
           - subnet: 192.6.0.0/16
             ip_range: 192.6.1.0/24

我看到有一个名为:priority 的 属性,这个 属性 允许根据您在 compose.yaml 文件中指定的指标组织网络接口。

priority indicates in which order Compose implementation SHOULD connect the service’s containers to its networks. If unspecified, the default value is 0.

Docker-compose priority

尝试在 yaml 文件上应用此优先级功能时,我没有收到任何错误和警告,只是在 docker 端被忽略了,在执行 ifconfig 时,我发现接口出错了订单。

这是 ifconfig 的输出(过滤结果后)

eth0: sim1
eth1: sim4
eth2: sim3
eth3: sim2
services:
   app1:
       image: nginx:latest
       command: "tail -f /dev/null"
       networks:
          sim1:
              priority: 1000
          sim2:
              priority: 900
          sim3:
              priority: 800
          sim4:
              priority: 700

我在网上搜索了一下,发现有很多人都遇到了这个问题。

Github Issue

网络应按字母顺序连接。您可以在 this gist 中看到此行为的演示。我认为问题出在您的撰写文件中。在 networks: 部分下,您有:

sim3:
  name: sim1

sim4:
  name: sim1

注意 sim3sim4 如何将它们的名称设置为 sim1

如果您以正确的顺序使所有这些都独一无二并摆脱优先级设置,那么它应该会按预期工作。

services:
  app1:
    image: nginx:latest
    command: "tail -f /dev/null"
    networks:
      - sim1
      - sim2
      - sim3
      - sim4

networks:
  sim1:
    name: sim1
    driver: macvlan
    driver_opts:
      parent: ens20
      macvlan_mode: bridge
    ipam:
      config:
        - subnet: 192.3.0.0/16
        ip_range: 192.3.1.0/24
  sim2:
    name: sim2
    driver: macvlan
    driver_opts:
      parent: ens21
      macvlan_mode: bridge
    ipam:
      config:
        - subnet: 192.4.0.0/16
        ip_range: 192.4.1.0/24
  sim3:
    name: sim3
    driver: macvlan
    driver_opts:
      parent: ens20
      macvlan_mode: bridge
    ipam:
      config:
        - subnet: 192.5.0.0/16
        ip_range: 192.5.1.0/24
  sim4:
    name: sim4
    driver: macvlan
    driver_opts:
      parent: ens20
      macvlan_mode: bridge
    ipam:
      config:
        - subnet: 192.6.0.0/16
        ip_range: 192.6.1.0/24