我在 Ubuntu Linux 22.04 上运行 Docker CE 25。我有许多 KVM VM 通过网桥路由 IPbr25和br50. 所有这些组件都驻留在同一个主机上。
Docker CE 26 中也重现了此问题。
br25: 192.168.25.0/24
br50: 192.168.50.0/24
docker/kvm host: 192.168.1.205
我最近遇到了一个问题,虚拟机来自br25无法连接到 Docker 主机上任何容器的公开端口。我发现定义桥接器是可以接受的/etc/docker/daemon.json
:
{
"bridge": "br25"
}
然而我现在已经到了这样的地步我还需要来自br50连接到 docker 主机上的容器,但不了解如何在其中定义多个网桥daemon.json
。
我目前知道有两种方法可以解决此问题。这两种方法都比较简单,但都不理想。
第一个是禁用 Docker 的 iptables 规则。这允许来自两个网桥的虚拟机连接到容器,但出于显而易见的原因,这是一个糟糕的长期解决方案:
{
"iptables": false
}
其次,network_mode: host
可以用于所讨论的容器,但这也破坏了使用 Docker 带来的特性。
我发现关于这个主题的讨论很多,但到目前为止还没有一个适合我的用例或我的知识水平的理想解决方案。我在下面留下了其中一些。我会继续审查这些项目,如果我找到令人满意的东西,我会发布更新。
我希望在这里得到一些帮助,以解释、解决方法或指导如何解决和更好地理解这个问题。
针对这个问题我想提出的更具体的问题是:
- 是否有一种明确的方法来定义多个桥梁,如我上面所示?
{ "bridge": "br25", "bridge": "br50" }
将通过验证,但仅适用于最后定义的桥梁(即 br50) - 我仍在研究高级 Docker 网络。macvlan 是一种明智的方法吗?我犹豫不决,因为它看起来很复杂,而且可能需要对我在此主机上运行的其他 16 个容器进行额外配置。
相关讨论:
启动 Docker 会破坏 KVM 桥接网络
https://wiki.archlinux.org/title/Docker#Starting_Docker_breaks_KVM_bridged_networkingDocker 破坏了 libvirt 桥接网络
Docker 破坏了 libvirt 桥接网络同一主机上的 KVM VM 与 docker 容器之间的网络
同一主机上的 KVM VM 与 docker 容器之间的网络从 Docker 容器通过网络访问 KVM VM
https://stackoverflow.com/questions/43820909/access-kvm-vm-over-the-network-from-a-docker-container