首页 > 解决方案 > docker-py:在 IPvlan 网络中创建具有特定 IP 的容器

问题描述

我创建了一个带有驱动程序的网络: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 bridge 网络的 ip 和 docker bridge 的默认网关。然后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)

将被忽略。使创建的Container拥有ipvlan网络的一个随机子网的IP

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

还有其他解决方案吗?

谢谢!

标签: dockerdockerpydocker-network

解决方案


好的,我发现在这种情况下你需要做什么。

首先你创建不带参数network=ipvlanXX的容器,这样容器就可以连接到 docker 网桥。

然后你将容器连接到你选择的网络,在我的例子中是 ipvlan172。

dockernetwork.connect(container,ipv4_address=targetIP)

之后你断开 docker bridge 网络的容器。

network_dockerbridge.disconnect(container,force=True)

最后启动容器。

container.start()

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

在 dockerpy 模块的运行/创建实现中有一个 ipv4/ipv6 参数会很好。


推荐阅读