从Docker容器访问网络中的KVM虚拟机

4
KVM用于托管网络192.168.2.1/24中的一些虚拟机。Docker在同一台机器上以192.168.3.1/24运行。我需要配置网络,以便Docker容器可以访问KVM虚拟机。为了测试连接,我有两台机器,每台机器都在运行一个Web服务器:

192.168.3.2上的Docker容器

192.168.2.2上的KVM虚拟机

在KVM中,我配置了一个虚拟网络,将所有物理网络重定向。这使得我可以从KVM虚拟机访问Docker容器。但是另外一个方向不起作用:无法从Docker容器(192.168.3.2)访问KVM虚拟机(192.168.2.2)。

docker network create --driver=bridge --subnet=192.168.3.1/24 my-network

容器的启动方式如下:
docker run --name=gogs --network=my-network --ip=192.168.3.2 -v /var/gogs:/data gogs/gogs

KVM虚拟网络向导在这里执行的操作,Docker缺少了什么?

/etc/sysctl.conf中启用了net.ipv4.ip_forward=1,并使用sysctl --system重新加载。

Docker网络接口

br-7b4175d9379d: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
    inet 192.168.3.1  netmask 255.255.255.0  broadcast 0.0.0.0
    inet6 fe80::42:9ff:fe6b:75dd  prefixlen 64  scopeid 0x20<link>
    ether 02:42:09:6b:75:dd  txqueuelen 0  (Ethernet)
    RX packets 90  bytes 41977 (41.9 KB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 116  bytes 18172 (18.1 KB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

KVM网络接口

virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.1  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 52:54:00:85:7f:95  txqueuelen 1000  (Ethernet)
        RX packets 1463  bytes 101054 (101.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1214  bytes 1490407 (1.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
2个回答

3
你可以在同一个网络桥上运行KVM/libvirt和Docker。假设你的KVM桥是virbr0。
首先,按照Docker文档的建议创建配置文件/etc/docker/daemon.json,并使用以下内容(甚至可能不需要iptables行):
{
"bridge": "virbr0",
"iptables": false
}

然后您停止容器并重新启动docker守护进程服务:

systemctl restart docker

Docker应该能够选择您的KVM桥接器,当您重新启动现有容器时,它们将在virbr0地址范围内获取IP地址,而不是默认的docker0地址。我不得不尝试两次才能使其正常工作,但运行docker v18.09非常简单。现在,我的虚拟机和容器在同一网络段上运行。

1

建立一个macvlan网络可能是最简单的方法(我就是这样做的,但我在网络方面不是天才)。

首先,您需要找出您的虚拟机正在使用的网络以及其设置(从主机上):

$ virsh net-list
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes

$ virsh net-info default
Name:           default
UUID:           46b9f715-39a2-4e83-bcd0-f07049f32ea5
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr0

如果您没有使用默认网络,则选择您要定位的任何一个网络。您只需要拥有正确的桥接/设备名称(在我的示例中为virbr0)。

现在,从虚拟机终端本身,您可以获取网关和子网信息:

$ ip route
default via 192.168.122.1 dev ens3 proto dhcp metric 100
192.168.122.0/24 dev ens3 proto kernel scope link src 192.168.122.49 metric 100

再次提醒,你的输出结果可能不同,但在这个例子中,网关是192.168.122.1,子网是192.168.122.0/24

现在你可以创建一个自定义的macvlan网络。

docker network create -d macvlan \
                    --subnet=192.168.122.0/24 \
                    --gateway=192.168.122.1 \
                    -o parent=virbr0 kvm_network

当您启动新容器时,请使用--net kvm_network选项。然后,您应该能够在容器内与虚拟机进行通信(反之亦然)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接