Linux

Docker bridge network shadows SSH客戶端的IP,如何優雅恢復?

  • June 16, 2021

我們正在執行帶有 Docker 的 RHEL 7 VM 來託管幾個內部服務。上次我跑去docker-compose up啟動一個新的 Docker 容器時,我失去了與伺服器的 SSH 連接,也無法重新建立它。

一位同事能夠診斷出罪魁禍首是一個新的 Docker 網路,該網路是作為執行docker-compose命令的一部分而創建的,其 IP 範圍恰好與我連接的機器所在的那個重疊。我的同事能夠通過關閉 Docker 守護程序並刪除由 Docker 創建的指向相關 docker 網路網橋的靜態路由來重新獲得我的訪問權限。他之所以能夠做到這一點,是因為他在同一子網中擁有另一台機器,他可以通過該機器進行連接。

現在我遇到的問題是,雖然能夠再次連接到伺服器,但我無法啟動 Docker 守護程序,除非它還恢復了行為不端的網路並再次切斷我的連接。但是,我也不能先使用docker network rmdocker network prune刪除網路,因為這些命令僅在 Docker 守護程序正在執行時才有效。我無權訪問 IP 與所述 IP 範圍不衝突且具有訪問我要恢復的機器所需的防火牆規則的機器。

有什麼方法可以優雅地解決這種情況並讓 Docker 守護程序再次執行而不會失去對機器的訪問權限?如有必要,刪除與所述網路相關的容器是沒有問題的。如果我能首先讓機器恢復工作狀態,我會很高興。

我從這篇文章中了解到,可以配置 Docker 允許使用的 IP 範圍,一旦事情重新啟動並執行,我肯定會這樣做。這可能已經自行解決了問題,還是只會影響 Docker 未來創建的網路?

我找到了一個可以說是非正統的解決方案,但它確實有效:我編寫了一個腳本來啟動 Docker 守護程序,刪除有問題的網路,記錄哪些網路被刪除,然後再次停止 Docker 守護程序,以防萬一它不起作用。這樣,即使我的 SSH 會話斷開,我也可以讓該腳本在後台執行並執行必要的命令。這樣我就可以回來,檢查日誌以查看有問題的網路是否消失,最後再次啟動 docker Daemon 而不會被踢出。

這不是最優雅的腳本,所以我需要做一些清理工作,但 Docker 又開始工作了。

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