同一主機上的 KVM 虛擬機和 docker 容器之間的網路連接
在 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