docker-py:在IPvlan网络中创建具有特定IP的容器

时间:2018-08-24 11:37:51

标签: docker dockerpy docker-network

我创建了一个带有驱动程序的网络:ipvlan和其中包含特定网关的几个子网。 (大约20)

现在,我想创建具有特定IP的容器,以便仅将它们分配给ipvlan网络的正确子网!

     dockernetwork = client.networks.get('ipvlan172')
     print "create container with ip "+targetIP
     client.containers.run('myalpine',auto_remove=True,command='ping 192.168.11.11',detach=True,name=targetName)
     dockernetwork.connect(container,ipv4_address=targetIP)
     container.start()

这里发生的是, client.containers.run 为容器提供了Docker桥接器网络的ip以及通往docker桥接器的默认网关。 然后 dockernetwork.connect 为容器的接口提供第二个IP(目标IP)。

如果我在命令中添加参数network ='ipvlan172'

client.containers.run('myalpine',network='ipvlan172',auto_remove=True,command='ping 192.168.11.11',detach=True,name=targetName)

创建的容器没有获得我打算的docker bridge网络的ip,但是命令的targetIP

dockernetwork.connect(container,ipv4_address=targetIP)

将被忽略。这样创建的容器具有ipvlan网络的随机子网的IP

解决此问题的一种方法是创建一个脚本,该脚本将在容器启动后执行,并删除dockerhost ip并更改默认网关。

还有其他解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,我发现了在这种情况下您需要做什么。

首先,您创建不带参数 network = ipvlanXX 的容器,以便该容器获得与Docker桥的连接。

然后将容器连接到您选择的网络,在我的情况下为ipvlan172。

dockernetwork.connect(container,ipv4_address=targetIP)

之后,您断开Docker桥网络的容器的连接。

network_dockerbridge.disconnect(container,force=True)

最后启动容器。

container.start()

现在创建的容器具有正确的ip,并使用ipvlan网络的正确子网的网关。

最好在dockerpy模块的运行/创建实现中使用ipv4 / ipv6参数。