Libnetwork: [macvlan] Same parent and gateway for multiple networks

Created on 28 May 2019  路  2Comments  路  Source: moby/libnetwork

Hi,

We are struggling with an issue with macvlan driver.

We wonder why we can't have multiple macvlan docker network with the same parent ?

This check forbids it in libnetwork/drivers/macvlan/macvlan_network.go :

 func (d *driver) createNetwork(config *configuration) error {
       networkList := d.getNetworks()
       for _, nw := range networkList {
               if config.Parent == nw.config.Parent {
                       return fmt.Errorf("network %s is already using parent interface %s",
                               getDummyName(stringid.TruncateID(nw.config.ID)), config.Parent)
               }
       }

And, also, why we can't have the same gateway for multiple macvlan docker networks ?

// Convert IP ordinal for this subnet into IP address
               return generateAddress(ordinal, base), nil
        case bitseq.ErrBitAllocated:
               return nil, ipamapi.ErrIPAlreadyAllocated

Our use case is the following :

  • 3 dockers nodes in Swarm mode
  • A public /28 RIPE routed to a private virtual network on each node
  • Mount public IP directly in containers

Our problem :

  • We want to specify the public IP of a container.
    -> IPAM in Swarm does not allow to specify ipv4_address param in compose file (normal behaviour with --scale)

    -> So we thought about creating one macvlan network with same parent interface, same gateway, and an --ip-range with the /32 we want.

We made some patch on the two files specified, and it works.

Is it a viable solution, and could we remove safely those checks?

Thank you !

Most helpful comment

I have same issue. My workaround is to create macvlan network with multiple subnet's and then force ip for each container.

dummy docker-compose to create network

version: '2'
services:
 test:
  image: 'testenv:latest'
  networks:
   - public
  command: /bin/true
networks:
 public:
   driver: macvlan
   driver_opts:
     parent: br0
   ipam:
    config:
     - subnet: aaa.aaa.aaa.aaa/24
       gateway: aaa.aaa.aaa.254
       ip_range: aaa.aaa.aaa.aaa/32
     - subnet: bbb.bbb.bbb.bbb/24
       gateway: bbb.bbb.bbb.254
       ip_range: bbb.bbb.bbb.bbb/32

One of containers

version: '2'
services:
 test:
  image: 'testenv:latest'
  mac_address: xx:xx:xx:xx:xx:xx
  networks:
   somenet:
    ipv4_address: aaa.aaa.aaa.aaa
  command: curl https://ipinfo.io/ip
networks:
 somenet:
  external:
      name: testnet_public

Any other ways of having public IP's for multiple containers ?

All 2 comments

I have same issue. My workaround is to create macvlan network with multiple subnet's and then force ip for each container.

dummy docker-compose to create network

version: '2'
services:
 test:
  image: 'testenv:latest'
  networks:
   - public
  command: /bin/true
networks:
 public:
   driver: macvlan
   driver_opts:
     parent: br0
   ipam:
    config:
     - subnet: aaa.aaa.aaa.aaa/24
       gateway: aaa.aaa.aaa.254
       ip_range: aaa.aaa.aaa.aaa/32
     - subnet: bbb.bbb.bbb.bbb/24
       gateway: bbb.bbb.bbb.254
       ip_range: bbb.bbb.bbb.bbb/32

One of containers

version: '2'
services:
 test:
  image: 'testenv:latest'
  mac_address: xx:xx:xx:xx:xx:xx
  networks:
   somenet:
    ipv4_address: aaa.aaa.aaa.aaa
  command: curl https://ipinfo.io/ip
networks:
 somenet:
  external:
      name: testnet_public

Any other ways of having public IP's for multiple containers ?

The check preventing multiple networks with the same parent interface only makes sense if Docker automatically created the parent interface. I think the check should be kept, but only be enforced if config.CreatedSlaveLink = true

Was this page helpful?
0 / 5 - 0 ratings