Docker容器與Windows保留埠
事件回顧:「同事反應,Docker 某個 Container 重新部署後,一直無法正常存取。而這群 Production Docker Host 我才剛剛在前一個週未進行 Docker Engine 升級與安裝作業系統 Service Pack 的維護。」
查詢過程的這張圖清楚可見有一筆 64255 Port,它就是此 Container 實際運作的 Port,這個 Container 此次升級與維護之前都是正常的。且怪異的事,一樣的 64255 Port Container 在測試區怎麼測都正常。本來很直覺往升級版本的 Docker Engine 查詢,是不是多了什麼限制等等。
過程也有試著把此 Port 移除,結果都無功而返。
腦袋中比較有印象的數字是 32767,老實說,實在鮮少見到超過這個數字的應用,後來念一轉,從 Windows 與 Port 的關係來瞭解看看,很快的在 Wiki:「TCP/UDP埠列表」看出的問題點。
從目錄1,2,3,4很快找到我想瞭解的「49152到65535號埠」,只有短短一句:根據定義,該段埠屬於「動態埠」範圍,沒有埠可以被正式地註冊占用。
由關鍵字「動態埠」又找到一篇 Wiki:「通訊埠」的文件。
一個合理的解釋是,這次的維護重開機後,某個服務取得 64255 Port 的使用權,而 Docker 可能沒有想到有人會去用此「動態或私有埠」,也就造成 Container 的建立與啟動正常,但服務無法接收正常的請求。
後來討論之後的解決非常簡單,將此服務的埠改為合理值,立馬有效。
後記
會想寫這篇,其實是看到以下兩篇文章,突然回憶起追 Port 這件事真的很麻煩:
發現之有留圖有印像,那就寫個短篇記錄一下,一樣的問題在 Docker 一樣也會碰到,因為最底層的 Host 最終還是有其限制存在。像這種教科書上沒教的限制,真的碰到才會知道。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。