1. 程式人生 > >記錄win7安裝Docker for Windows(DockerToolbox)的一記大坑:wating for an ip....卡死

記錄win7安裝Docker for Windows(DockerToolbox)的一記大坑:wating for an ip....卡死

作業系統:windows7 x64
軟體:Docker For Windows的DockerToolbox

問題

按照提示安裝完成後,首次執行Docker Quickstart Terminal即畫面永久定格在了wating for an ip....這一步
中斷後發現名為“default”虛擬機器已經在virtual box中成功建立且在執行中,但是docker-machine的ls、start、stop、ssh命令都無法正常完成

解決過程(本段為了讓遇到同樣問題的人能更容易搜尋到,時間緊可直接跳到解決方案

起初一直停留在“wating for an ip....”這一表象上,以為是DHCP相關的問題,按此關鍵詞Google查了N多資料無果

於是查閱help命令後開啟了docker-machine的debug功能,及在每一條docker-machine命令後加上“--debug”引數

發現所有出錯的地方都是SSH環節,錯誤資訊:“SSH cmd err, output: exit status 255”

於是本機裝了openssh,配置了環境變數,查了很多關於此條錯誤資訊的資料,發現網上至今根本沒有有效方案:

目光轉向ip埠轉發環節,檢視virtual box的"default"虛擬機器網路配置發現virtual box試圖轉發宿主機的50335埠(隨機埠)到docker機的22埠,如圖:

所以從virtual box直接雙擊登入“default”虛擬機器,然後命令#ifconfig,記下虛擬機器IP:192.168.99.100

宿主機(即windows)使用命令:ssh 192.168.99.100,發現可以正常連線並要求輸密碼,此處達到了目的所以直接中斷命令

繼續:ssh 127.0.0.1 -p 50335,提示錯誤:“ssh: connect to host 127.0.0.1 port 50335: Bad file number”。

至此高度懷疑是virtual box的埠轉發在本系統中沒有生效導致的問題,為了進一步驗證這一猜想,利用windows自帶的netsh手動配置埠轉發:

netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=50335 connectaddress=192.168.99.100 connectport=22

可以使用如下命令來確認設定生效:

netsh interface portproxy show all

最後執行:

docker-machine ssh default

發現終於看到了夢寐以求的開始介面,同時所有其餘命令全部可用了:

至此問題成因確鑿無疑,簡單搜尋就解決了Virtual Box轉發不生效的問題:

首先撤銷我們剛剛手動配置的轉發:

netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=50335

最終解決方案

依次執行以下command然後重啟電腦:

netsh winsock reset all
netsh int 6to4 reset all
netsh int ipv4 reset all
netsh int ipv6 reset all
netsh int httpstunnel reset all
netsh int isatap reset all
netsh int portproxy reset all
netsh int tcp reset all
netsh int teredo reset all

重啟後一不注意又是一大坑:virtual box的轉發只在管理員模式下生效,所以必須用管理員模式執行docker-machine命令,如果要用virtual box軟體管理、檢視docker虛擬機器,virtual box也必須由管理員啟動。

至此一切正常,大功告成!

WTF!兩天的歲月就這麼過去了,碼這麼多字一是為了記錄,二是為了留下儘可能多的資訊幫助遇到同樣困惑的人搜尋到此解決方案,坑多路長,各位同仁共勉。