同一主机上的 KVM VM 和 docker 容器之间的网络

sdi*_*mar 9 libvirt linux-networking kvm-virtualization docker debian-stretch

在 Debian-Stretch 主机(连接到物理 LAN)上,我有一个新的 docker 安装(v18.09)和一个数据库容器(端口映射到主机),我运行 KVM/libvirt 和一些 Debian-Stretch VM。我可以从 LAN 访问 docker 容器和 VM(取决于通过 SSH 隧道或直接配置的配置),但我很难从 VM 访问 docker 容器。

在此处输入图片说明

# brctl show
bridge name         bridge id           STP enabled interfaces
br-f9f3ccd64037     8000.0242b3ebe3a0   no      
docker0             8000.024241f39b89   no      veth35454ac
virbr0              8000.525400566522   yes     virbr0-nic
Run Code Online (Sandbox Code Playgroud)

在阅读了几天之后,我在这篇文章中找到了一个非常引人注目的解决方案Docker 和 KVM 带有一个我没有开始工作的桥原始)。该解决方案建议使用一行配置 daemon.json 代码启动 docker 以使用 KVM“默认”网桥。那该有多好!有希望吗?

我在 KVM 虚拟机之间尝试了两种不同的网络配置。在这两种情况下,VM 与 LAN+路由器+云之间的通信都完美无缺,但我只是不知道如何越过围栏 - 到更绿的草地...... :)

Conf 1 - KVM 默认桥接与 NAT:我可以通过 ssh 连接到 Debian 主机并访问 docker 容器端口,但是否有直接路由的设置?

会议 2 - macvtap 适配器在桥接模式下连接到 LAN:尽管两者都连接到同一路由器,但我无法从 VM ping 主机 LAN IP。来自 VM 本身的响应是Destination Host Unreachable. 有什么想法吗?

在单独的 VM 中运行 docker 守护进程会比直接在 Debian 主机上运行更好吗?这样,容器和 VM 都可以访问 KVM 默认桥接器。但我认为在 KVM 主机上的 VM 中运行 docker 有点奇怪。

任何明确的指导将不胜感激!

顺便说一句,桥br-f9f3ccd64037是我用 docker 创建的用户定义桥,用于未来的容器间通信。它没有被使用。

更新:

我刚刚意识到,通过第一个配置,我可以通过 VM 来宾的 IP 地址 (172.17.0.2) 简单地连接到 docker 容器。

我的初始设置是第二个配置,因为我想将 RDP 连接到 VM,这更容易,因为 macvtap 驱动程序将 VM 直接连接到 LAN,并且不需要 SSH 链接。那是我无法够到容器的时候。

sdi*_*mar 6

解决方案就像链接文章中所述的那样简单。我不确定为什么我的配置在第一次重新启动 docker 守护程序时没有更改。

在我在Docker 守护进程文档中找到daemon.json 中的网桥参数的证据后,我再次尝试,docker 守护进程在启动时选择了 KVM 默认网桥。

首先,我按照文档中的建议创建了配置文件,/etc/docker/daemon.json其中包含以下内容(甚至可能不需要 iptables 行):

{
"bridge": "virbr0",
"iptables": false
}
Run Code Online (Sandbox Code Playgroud)

所需要的只是:

docker stop mysql
systemctl stop docker
systemctl start docker
docker start mysql
Run Code Online (Sandbox Code Playgroud)

现有的 docker 容器正在 KVM 桥上运行。可以通过以下方式检查容器的 IP 地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql
192.168.122.2
Run Code Online (Sandbox Code Playgroud)

我不确定现在是否可以删除 docker0 桥,但该容器与三个虚拟机一起列在 virbr0 下。

brctl show
bridge name bridge id           STP enabled interfaces
docker0     8000.024241f39b89   no      
virbr0      8000.068ff2a4a56e   yes         veth2abcff1
                                            virbr0-nic
                                            vnet0
                                            vnet1
                                            vnet2
Run Code Online (Sandbox Code Playgroud)