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 :
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 !
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
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
One of containers
Any other ways of having public IP's for multiple containers ?