Linux-Networking

同一主機上的 KVM 虛擬機和 docker 容器之間的網路連接

  • May 1, 2020

在 Debian-Stretch 主機(連接到物理 LAN)上,我有一個新的 docker 安裝(v18.09)和一個數據庫容器(埠映射到主機),我使用一些 Debian-Stretch VM 執行 KVM/libvirt。我可以從 LAN 訪問 docker 容器和虛擬機(取決於通過 SSH 隧道或直接的配置),但我很難從虛擬機訪問 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

在閱讀了幾天之後,我在這篇文章 Docker 和 KVM 中找到了一個非常引人注目的解決方案,其中有一個我沒有開始工作的橋原始)。該解決方案建議使用單行配置 daemon.json 程式碼啟動 docker 以使用 KVM“預設”橋。那該多好!有希望嗎?

我為 KVM 虛擬機之間的網路嘗試了兩種不同的配置。在這兩種情況下,虛擬機與 LAN+路由器+雲之間的通信都是完美無缺的,但我只是不知道如何越過柵欄 - 到更綠的草地…… :)

Conf 1 - 帶有 NAT 的 KVM 預設網橋:我可以通過 ssh 連接到 Debian 主機並訪問 docker 容器埠,但是是否有直接路由的設置?

Conf 2 - 以橋接模式連接到 LAN 的 macvtap 適配器:儘管兩者都連接到同一路由器,但我無法從 VM ping 主機 LAN IP。來自 VM 本身的響應是Destination Host Unreachable。有沒有想過為什麼?

在單獨的 VM 中而不是直接在 Debian 主機上執行 docker 守護程序會更好嗎?這樣,容器和 VM 都可以訪問 KVM 預設網橋。但我認為在 KVM 主機上的 VM 中執行 docker 有點奇怪。

任何明確的指導將不勝感激!

順便說一句,橋br-f9f3ccd64037是我用 docker 創建的使用者定義的橋,用於將來的容器間通信。它不被使用。

更新:

我剛剛意識到,通過第一個配置,我可以通過 VM 來賓的 IP 地址(172.17.0.2)簡單地連接到 docker 容器。

我的初始設置是第二個配置,因為我想 RDP 進入虛擬機,這更容易,因為 macvtap 驅動程序將虛擬機直接連接到 LAN 並且不需要 SSH 連結。那時我無法到達容器。

解決方案與連結文章中所述一樣簡單。我不確定為什麼我第一次重新啟動 docker 守護程序時我的配置沒有改變。

Docker 守護程序文件中找到 daemon.json 中 bridge 參數的證據後,我再次嘗試,docker 守護程序在啟動時選擇了 KVM 預設網橋。

首先,我/etc/docker/daemon.json按照文件中的建議創建了具有以下內容的配置文件(甚至可能不需要 iptables 行):

{
"bridge": "virbr0",
"iptables": false
}

所需要的只是:

docker stop mysql
systemctl stop docker
systemctl start docker
docker start mysql

現有的 docker 容器正在 KVM 橋上執行。可以通過以下方式檢查容器的 IP 地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql
192.168.122.2

我不確定我現在是否可以刪除 docker0 網橋,但容器與三個 VM 一起列在 virbr0 下。

brctl show
bridge name bridge id           STP enabled interfaces
docker0     8000.024241f39b89   no      
virbr0      8000.068ff2a4a56e   yes         veth2abcff1
                                           virbr0-nic
                                           vnet0
                                           vnet1
                                           vnet2

引用自:https://serverfault.com/questions/948339