在安装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网络,通用性好,但带来了暴露宿主网络的风险