在安裝Docker的時候,會在宿主機安裝一個虛擬網關docker0
,咱們可使用宿主機在docker0
上的IP地址來代替localhost
。nginx
首先,使用以下命令查詢宿主機IP地址:docker
ifconfig安全
能夠發現宿主機的IP是172.17.0.1
,那麼將proxy_pass http://localhost:1234
改成proxy_pass http://172.17.0.1:1234
就能夠解決502 Bad Gateway
錯誤。網絡
可是,不一樣系統下宿主機的IP是不一樣的,例如Linux下通常是172.17.0.1
, macOS下通常是192.168.65.1
,而且這個IP還能夠更改。因此使用IP配置nginx.conf
,不能跨環境通用。spa
Docker容器運行的時候有host
、bridge
、none
三種網絡可供配置。默認是bridge
,即橋接網絡,以橋接模式鏈接到宿主機;host
是宿主網絡,即與宿主機共用網絡;none
則表示無網絡,容器將沒法聯網。code
當容器使用host
網絡時,容器與宿主共用網絡,這樣就能在容器中訪問宿主機網絡,那麼容器的localhost
就是宿主機的localhost
。網絡安全
在docker中使用--network host
來爲容器配置host
網絡:容器
docker run -d --name nginx --network host nginxproxy_pass
上面的命令中,沒有必要像前面同樣使用-p 80:80 -p 443:443
來映射端口,是由於自己與宿主機共用了網絡,容器中暴露端口等同於宿主機暴露端口。配置
使用host網絡不須要修改nginx.conf
,仍然可使用localhost
,於是通用性比上一種方法好。可是,因爲host
網絡沒有bridge
網絡的隔離性好,使用host
網絡安全性不如bridge
高。
本文提出了使用宿主機IP和使用host網絡兩種方法,來實現從容器中訪問宿主機的網絡。兩種方法各有優劣,使用宿主機IP隔離性更好,但通用性很差;使用host網絡,通用性好,但帶來了暴露宿主網絡的風險