前言
在使用Docker部署應用時,Docker推薦的方式是將應用及其所依賴的服務(MySQL,Redis等)均使用Docker部署,並通過 link 或自定義網絡相連接。但是,當應用所依賴的服務被安裝在宿主機上時,我們需要讓容器中的應用能夠訪問到部署在宿主機上的服務。本文將介紹實現這一目的的幾種方案,並分析其優缺點。
關於Docker網絡的知識請查看:Docker網絡詳解。
方案
方案一:使用host模式
Docker容器運行的時候有 host 、 bridge 、 none 三種網絡可供配置。默認是 bridge ,即橋接網絡,以橋接模式連接到宿主機; host 是宿主網絡,即與宿主機共用網絡; none 則表示無網絡,容器將無法聯網。
當容器使用 host 網絡時,容器與宿主共用網絡,這樣就能在容器中訪問宿主機網絡,那么容器的 localhost 就是宿主機的 localhost 。
通過 docker run 啟動容器時加入 --net=host 參數,或在 docker-compose 文件中指定 network_mode: "host"
該參數指定該容器使用host網絡模式,因此也無需映射端口。
優點
- 最簡單粗暴的解決方案,方便快捷
缺點
- host網絡沒有與宿主機網絡隔離,可能引發安全隱患或端口沖突
- 僅適用於Linux
方案二:使用宿主機IP
在安裝Docker的時候,會在宿主機安裝一個虛擬網關 docker0 ,我們可以使用宿主機在 docker0 上的IP地址來代替 localhost 。
在默認的bridge模式下,docker0網絡的默認網關即是宿主機。在Linux下,docker0網絡通常會分配一個172.17.0.0/16的網段,其網關通常為172.17.0.1;macOS下的網段則為192.168.65.0/24,網關為192.168.65.1。在容器中使用該IP地址即可訪問宿主機上的各種服務。
優點
- 避免了方案1的缺點
缺點
- 此IP並不一定完全固定,可能會因系統及配置而發生變化
- 容器經由docker0網橋無法訪問到監聽地址是127.0.0.1的應用。需要將MySQL等配置為監聽0.0.0.0