使用宿主機IP
在安裝Docker的時候,會在宿主機安裝一個虛擬網關docker0
,我們可以使用宿主機在docker0
上的IP地址來代替localhost
。
首先,使用如下命令查詢宿主機IP地址:
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
,不能跨環境通用。
使用host網絡
Docker容器運行的時候有host
、bridge
、none
三種網絡可供配置。默認是bridge
,即橋接網絡,以橋接模式連接到宿主機;host
是宿主網絡,即與宿主機共用網絡;none
則表示無網絡,容器將無法聯網。
當容器使用host
網絡時,容器與宿主共用網絡,這樣就能在容器中訪問宿主機網絡,那么容器的localhost
就是宿主機的localhost
。
在docker中使用--network host
來為容器配置host
網絡:
docker run -d --name nginx --network host nginx
上面的命令中,沒有必要像前面一樣使用-p 80:80 -p 443:443
來映射端口,是因為本身與宿主機共用了網絡,容器中暴露端口等同於宿主機暴露端口。
使用host網絡不需要修改nginx.conf
,仍然可以使用localhost
,因而通用性比上一種方法好。但是,由於host
網絡沒有bridge
網絡的隔離性好,使用host
網絡安全性不如bridge
高。
總結
本文提出了使用宿主機IP和使用host網絡兩種方法,來實現從容器中訪問宿主機的網絡。兩種方法各有優劣,使用宿主機IP隔離性更好,但通用性不好;使用host網絡,通用性好,但帶來了暴露宿主網絡的風險