2024-03-24

[Windows] docker desktop 4.26.0 開始會遇到 container 在啟動後維持了一定時間(大概30分鐘)時,外部host就無法對該容器進行操作

先說明,這有可能只是在下自己遇到的情況…

就是,某天在下 Windows 11 當時使用的 docker desktop 是在 4.25.0 然後更新到 4.26.0 時發生了一些奇怪的問題…

先說明在未更新前的環境

os: win11

cpu: amd ryzen 2700x

ram: 2 * 16G

app: docker desktop 4.25.0

containers: ubuntu 20.04 lts(內裝了 apache, php, mysql, phpmyadmin)

因為我大部份進行開發都是在公司上班時用工作機(筆電),當時工作機的 docker desktop 是更新到 4.25.2,家裡的桌機主要是為了在家工作時可以拿來開發,所以平時 docker desktop 我是不太會去更新

然後就有天看到有提醒有新版本 4.26.0 可以更新,我也沒想太多,就進行動作,然後更新完就把 docker desktop 關掉了,也沒去留意。

直到有天是公司 pm 告知客戶有反應前次更新有一些狀況,問我能不能先在家更新,更新完再來上班,我想說也行,就在30分鐘內完成了修正然後 hotfix 到客戶端去,正準備結束時就不知道為啥就按到了系統頁面的重新整理,結果發現一直在 loading…

在確認客端和公司端的測試機沒有這個情況時,確定了是自己 local 的狀況,但當時沒有細抓問題,就直接把 docker desktop restart 後再測試就正常了,也沒細究。

但後來陸續有幾次在家用 docker 玩一些東西時有發現,無論是舊有存在的容器,或後來新增的,都有一樣的情況,就是容器中開發 nat 對外部 host 的網路 port 都大概在該容器啟用後大約30分鐘左右就會出現連不到的狀況(不過也不是所有容器都有這個狀況,只是有這狀況的容器比例較高)。

而且,不單單是連不到,連直接用「docker exec -it {container} bash」或用 docker desktop 點擊容器後的「exec」頁籤,如果下指令是跟網路層有關的(像 netstat -tlunp),都會在指令 key 完按下 enter 後,該指令只運行了一下就卡住了。

而且在發生這些狀況時,要透過 docker 指令或 docker desktop 去停止或重啟容器都會異常,就無法正常動作。

後來 google 了不少文章,大概知道這應該跟 docker 和 hyper-v 之前有關網路層的問題,但…在未更新到 4.26.0 時是沒有這個問題的。

但因為在家開發的次數不多,所以這狀況我就沒去理到,直到2024的農曆過完年後我又想到這件事,所以就想說乾脆把 docker 打掉重裝,我還把 hyper-v 由 windows 功能那邊去做移除然後再重裝,之後安裝 docker desktop 4.28.0…但結果還是一樣

就用 WSL2 的話沒這問題,但只要不用 WSL 的方式,這狀況就依舊…但在下又不想用 WSL2 ,因為 WSL2 因為機制的關係,如果有特別要指定 volume 是外部 host path 要 mount 到容器內,這個位置的讀寫會很慢,除非是直接用在 WSL distros 中的 path ,不然都不會改善這個狀況。

所以,我只好…把 docker desktop 給降版(downgrade)到 4.25.2。

可以到 docker 官網的 release note 去找 4.25.2 的安裝檔,然後以管理員身份執行「命令提示字元」,切換到安裝檔的路徑,以下列的命令進行降版安裝

"Docker Desktop Installer_4.25.2.exe" --disable-version-check

這樣就可以進行降版安裝(註: 理論上安裝程式還是會問你是否確認要由舊版本蓋過當前版本,按下「是(或確定)」即可)

如此一來,以 4.25.2 的環境再故意等超過30分鐘或 1小時,都不會再遇到會無回應的狀況了。

至於在下為什麼會確定 4.25.2 就可以正常,主要是因為我用過 4.26.0 跟 4.28.0 都一樣狀況,然後公司工作機的版本是在 4.25.2 且沒這情況,更早之前我桌機還是用 4.25.0 也沒那狀況,所以,就選用了 4.25.2 了。

註: 不過我想之後應該就乾脆用 WSL2 的環境好了,我記得 vscode 是可以直接連通到 WSL2 的樣子 

沒有留言: