我创建了一个带有驱动程序的网络: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并更改默认网关。
还有其他解决方案吗?
谢谢!
答案 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参数。