Docker容器访问宿主机网络的方法

作者:jingsam 时间:2022-10-24 13:36:53 

最近部署一套系统,使用nginx作反向代理,其中nginx是使用docker方式运行:


$ docker run -d --name nginx $PWD:/etc/nginx -p 80:80 -p 443:443 nginx:1.15

需要代理的API服务运行在宿主机的 1234 端口, nginx.conf 相关配置如下:


server {
...

location /api {
 proxy_pass http://localhost:1234
}
...
}

结果访问的时候发现老是报 502 Bad Gateway 错误,错误日志显示无法连接到upstream。

仔细想一想, nginx.conf 中的 localhost 似乎有问题。由于nginx是运行在docker容器中的,这个 localhost 是容器的localhost,而不是宿主机的localhost。

到这里,就出现了本文要解决的问题:如何从容器中访问到宿主机的网络?通过搜索网络,有如下几种方法:

使用宿主机IP

在安装Docker的时候,会在宿主机安装一个虚拟网关 docker0 ,我们可以使用宿主机在 docker0 上的IP地址来代替 localhost 。

首先,使用如下命令查询宿主机IP地址:


$ ip addr show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
 link/ether 02:42:d5:4c:f2:1e brd ff:ff:ff:ff:ff:ff
 inet 172.17.0.1/16 scope global docker0
   valid_lft forever preferred_lft forever
 inet6 fe80::42:d5ff:fe4c:f21e/64 scope link
   valid_lft forever preferred_lft forever

可以发现宿主机的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网络,通用性好,但带来了暴露宿主网络的风险。

来源:https://jingsam.github.io/2018/10/16/host-in-docker.html

标签:docker,容器,访问,宿主机
0
投稿

猜你喜欢

  • 说说最新最赚钱的网赚项目

    2010-05-16 13:36:00
  • linux主机,404页面设置

    2009-09-08 12:51:00
  • 服务器安全升级必须注意的三个细节

    2012-02-25 19:41:05
  • 单页面网站如何优化

    2009-03-15 13:18:00
  • apache的access.log和error.log减肥

    2022-03-01 07:29:48
  • “称霸赛场”3连冠 载入《商业大亨》名人册

    2009-10-22 10:47:00
  • Google Adsense如何屏蔽低价的广告

    2009-03-21 12:25:00
  • 从百度的搜索结果看 链接锚文字的重要性

    2009-02-24 16:36:00
  • AdSense政策:什么是修改广告行为或定位

    2008-01-04 11:37:00
  • 陆晓东:解密如何让你的文章更受编辑青睐

    2009-06-16 12:47:00
  • 怎样去推广图片类的网站

    2008-05-04 19:15:00
  • 教你六招处理服务器数据意外丢失

    2009-01-23 15:13:00
  • 详解微软Office 2010的八大版本

    2010-05-27 16:09:00
  • Vmware下CentOS7最小化安装方式

    2022-08-02 09:08:32
  • 大型Java Web系统服务器选型问题探讨

    2010-05-02 18:28:00
  • 2009牛年就要你最红 论坛炒作的三个秘籍

    2009-02-11 09:25:00
  • Google +1按钮:应该注意的31项

    2011-06-07 14:18:00
  • Windows服务器安全维护注意八要点

    2009-09-11 12:57:00
  • 借用SSL验证,让IIS信息访问更安全(3)

    2007-03-27 09:46:00
  • 网站主题就象一架马车 如何对其四轮定位

    2008-11-21 22:16:00
  • asp之家 网站运营 m.aspxhome.com