使用宿主機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網絡,通用性好,但帶來了暴露宿主網絡的風險
