docker - 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 并更改默认网关。
还有其他解决方案吗?
谢谢!
解决方案
好的,我发现在这种情况下你需要做什么。
首先你创建不带参数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 参数会很好。
推荐阅读
- docker - Flink 消费者作业无法从 Docker 连接到 Kafka
- virtual-machine - 有两个带 NAT 但与主机 IP 不同的 VirtualBox 虚拟机?
- python - 使用 python 在特定位置读取文本
- ios - 未找到 -lPods- 的 XCode 库
- javascript - 提交表单后清除formik错误
- javascript - 发送到视图的模型无法在 ajax get 中读取
- reactjs - React Material UI 单选按钮看起来杂乱无章
- reactjs - MapBox html 标记
- python - Reportlab:修复标题使其无法向上?
- three.js - 从 gltf 加载模型时如何增加对比度和色彩饱和度