网站运营
位置:首页>> 网站运营>> Docker容器访问宿主机网络的方法

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

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

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

最近部署一套系统,使用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

0
投稿

猜你喜欢

  • Windows Server 2008的一个特性在于,操作系统的许多方面的功能都可以通过命令行方式进行管理。如果我们在一台带GUI界面的电脑
  • 3月3日消息,今年的两会将于今天下午拉开序幕,经向出席两会的电信、IT、家电业两会人大代表、政协委员咨询,除个别人员外,绝大多数上述行业人大
  • 前言:我一直把一个网站当作一个活生生的生命体来看待,而不是一行行枯燥无味的代码,而养站就像养孩子!我们如何培养起一个有用的&ldqu
  • 本文描述了如何在Windows XP中通过配置TCP/IP协议的方式使用域名服务(DNS)。DNS是一种用以将域名转换为IP地址的Inter
  • 就目前国内的广告联盟来说。做cpc的主要就3家。百度联盟 阿里妈妈和google adsense。那么究竟那家联盟更适合我们这些小站长呢?下
  • 游戏团队月薪3500雇人玩魔兽(腾讯科技配图)通过完成游戏中的终极任务 争取厂商的测评订单一个喜爱《魔兽世界》的游戏团队,在获得百万赞助后,
  • 这样, root 就可以直接进入 Linux 主机了。不过,建议不要这样做。也可以在普通用户进入后,切换到root用户,拥有root的权限。
  • 关于网络数据库里一些商业数据被盗窃后公布于网上;公司商业网站的产品价格数据又被恶意修改……类似这样的案例,在网上搜索了一下,实在不少。其原因
  • linux下的C\C++多进程多线程编程实例详解1、多进程编程#include <stdlib.h> #include <
  • 摘要:这篇文章主要针对初学编程和初建网站的爱好者提供一个个人观点,希望大家不要盲信现在诸多的所谓流行技术。近来,有很多网友问我的深度学习(a
  • 对邮件服务器的攻击形式多种多样:有利用缓冲区溢出漏洞进行的攻击,还有拒绝服务攻击和目录收集攻击等等。加固邮件服务器、使用邮件过滤工具、采用被
  • 本文主要对Linux下的多线程进行一个入门的介绍,虽然是入门,但是十分详细,希望大家通过本文所述,对Linux多线程编程的概念有一定的了解。
  • DHCP是用于动态分配IP地址的服务,当一个局域网中计算机比较多的时候,我们需要为每个客户端手动设置IP地址,子网掩码,DNS及网关等地址,
  • 由host $ export DVSDK="${HOME}/ti-dvsdk_dm368-evm_xx_xx_xx_xx"
  • 一个系统管理员可能会同时管理着多台服务器,这些服务器也许会放在不同的地方。要亲自一台一台的去访问来管理它们显然不是最好的方法,通过远程控制的
  • 对于技术,我只是了解皮毛;对于SEO,也只能算个菜鸟,但是菜鸟对于SEO也有自己的看法,我的第一SEO案例是做自己公司的网站,从这之后又做了
  • DHCP 是 Dynamic Host Configuration Protocol 之缩写,它的前身是 BOOTP。BOOTP 原本是用于
  • ansibleansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、f
  • 一、操作系统的选择FTP服务器首先是基于操作系统而运作的,因而操作系统本身的安全性就决定了FTP服务器安全性的级别。虽然Windows 98
  • Linux远程控制技术概念和起源远程控制是在网络上由一台计算机(主控端Remote/客户端)远距离去控制另一台计算机(被控端Host/服务器
手机版 网站运营 asp之家 www.aspxhome.com