參考連接:https://www.cnblogs.com/brock0624/p/9788710.html
Docker官方推薦我們通過端口映射的方式把Docker容器的服務提供給宿主機或者局域網其他容器使用。一般過程是:
1、Docker進程通過監聽宿主機的某個端口,將該端口的數據包發送給Docker容器
2、宿主機可以打開防火牆讓局域網其他設備通過訪問宿主機的端口進而訪問docker的端口
今天在本地機器上搭建了一套redis docker環境用於測試。通過docker inspect 服務名
可以看到,redis 的docker 鏡像地址為:
可是,如果直接在windows 的宿主機上ping這個地址:172.17.0.3,會發現無法ping通。
為什麼呢? 原因是,docker 會在我們的宿主機上安裝一塊虛擬網卡,它的地址可以通過在宿主機上執行ipconfig命令查看:
而這個地址是在我們的docker 網絡設置中配置的,可以修改。具體是:
也就是說,docker 會根據我們的網絡設置,動態生成一塊虛擬網卡,docker 服務就可以通過這個虛擬網卡和外網進行通信。但是,由於當前虛擬網卡和主機不在同一個網段,所以無法ping通。解決的辦法如前文2所述,通過在宿主機上添加路由策略解決(需要管理員權限)。
具體命令如下:
<code>route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2/<code>
其中,-p表示添加永久路由,他會隨著tcpIp的初始化而自動生成
add 表示添加路由策略。相應的,delete表示刪除
參數1 172.17.0.0 表示的docker 容器內部的網絡,代表目的網絡
參數2: 255.255.255.0 表示目的網絡的子網掩碼,與docker的設置相同
參數3:10.0.75.2 表示網關地址
設置後,再次ping docker內網地址,發現可以正常ping通了。至此,問題得以解決。
執行route print 命令,可以看到,在已經添加了一條永久的路由,我們新增的這條路由也開始工作了。如下所示:
後記: 這裡有一個問題:不是10.0.75.1 才是網關,而且10.0.75.1也在活動路由中,為什麼不管用呢?另外,即使將在route -p add 命令中,將網關地址設置為10.0.75.1也不行?
在是因為我們根據此時如果將網關設置為10.0.75.1,則我們的路由表將會是:
因為172.17.0.1已經是作為網關的入口地址佔用了,所以在活動路由表中,網關這一項仍然顯示為“在鏈路上”,其含義是到“電腦訪問網絡的鏈路中存在多個網關,可能是您的路由表有緩存”。也就是說仍然無法通。那為何設置為大於172.17.0.4及以後都不行呢?則可能是docker內部做了安全策略限制或者動態分配的ip只有1-3,所以只能將路由設置為172.17.0.2.
這裡順帶記錄下route print 各個字段的具體含義:
destination 目的網段
mask 子網掩碼
gateway 下一跳路由器入口的ip,路由器通過interface和gateway定義一調到下一個路由器的鏈路,通常情況下,interface和gateway是同一網段的
interface 到達該目的地的本路由器的出口ip
metric 跳數,該條路由記錄的質量,一般情況下,如果有多條到達相同目的地的路由記錄,路由器會採用metric值小的那條路由
閱讀更多 青梅煮酒快意江湖 的文章