Docker容器怎么通过独立IP暴露给局域网


这篇“Docker容器怎么通过独立IP暴露给局域网”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Docker容器怎么通过独立IP暴露给局域网”文章吧。docker容器非常轻量,系统开销非常少,比vmware或者virtualbox用起来方便,部署起来也非常容易。官方推荐我们通过端口映射的方式把docker容器的服务提供给宿主机或者局域网其他容器使用。一般过程是:1、docker进程通过监听宿主机的某个端口,将该端口的数据包发送给docker容器2、宿主机可以打开防火墙让局域网其他设备通过访问宿主机的端口进而访问docker的端口这里以cdns为例,cdns是一个用于避免dns污染的程序,通过cdns可以把你的计算机变成一个抗污染的dns服务器提供给局域网使用。docker镜像下载地址:原理是在docker容器中启动cdns,监听53端口,docker容器的ip地址为172.12.0.2,宿主机把5053端口映射到docker容器上,访问宿主机的127.0.0.1:5053就相当于访问docker的53端口,所以docker的启动方法是:这样我们使用dig工具通过5053端口查询dns就是无污染的dns了,过程如下:这里假设我们的宿主机ip是192.168.12.107
如果现在出现另外一台局域网计算机,ip地址为192.168.12.113,它想把宿主机当成dns服务器,那么我们就需要在192.168.12.113这台计算机上访问192.168.12.107:5053来查询dns,dig命令如下这样做显然是很不方便的,我们现在希望不经过宿主机这一套nat和代理,想要直接在局域网内的任意一台计算机上直接通过ip访问docker容器,让docker容器完整的暴露在局域网里而不是仅单单暴露一个53端口。那么应该如何做呢?首先通过观察发现,docker的默认启动方式中,会产生一块虚拟网卡,在这里我们可以理解这块网卡连接着一个虚拟交换机,然后每个docker容器又会拥有自己单独的网卡和ip,而且所有docker容器也连接在这个虚拟交换机的下面。我们可以在宿主机上通过ifconfig命令看到这个虚拟网卡。上面的docker0这块网卡就是虚拟网卡,它的ip地址是172.17.0.1,它和其他的docker容器都连接在一个虚拟交换机上,网段为172.17.0.0/16,下面我们登录到docker容器里面,查看一下容器的网卡和ip可以看到这个容器的ip地址为172.17.0.2,现在我们到宿主机里看看ping 172.17.0.2能不能ping通。答案当然是能ping通,能ping通的原因就是我们的宿主机里知道目标地址为172.17.0.1/16的路由信息,不信我们可以查看一下从上面可以看出来,172.17.0.0/16这个网段的数据包可以通过docker0这块网卡发送出去。也就是说,目前宿主机有两个ip,一个是192.168.12.107,用于连接实体的局域网,一个是172.17.0.1,用来和docker容器通信,从这可以看出宿主机和路由器的作用是一致的。而docker容器只有一个ip就是172.17.0.2。如果docker容器想要访问外网,那么它就会把数据包发送到网关172.17.0.1,然后由宿主机做nat发送到192.168.12.1/24这个网段的网关上。
不光宿主机可以ping通容器,而且由于在docker容器中默认路由(网关)是172.17.0.1,所以docker容器不光可以ping主机的172.17.0.1,还能ping通主机的另一个ip: 香港云主机192.168.12.107
此时我们的网络拓扑其实就变成了192.168.12.0/24这个网段里有个宿主机,为了方便理解,我们把这个宿主机看成一个路由器,路由器下面是172.17.0.1/16这个网段。我们把docker容器看成实实在在的机器设备,连接在宿主机这个路由器的下面。这样docker的拓扑结构就非常清晰了。我们可以发现这个拓扑结构其实非常的简单。就像家里上网的路由器一样。打个比方:我家里有两个路由器,一个路由器通过pppoe拨号连接公网,内网地址为192.168.12.1,另一个路由器连接在第一个路由器上面,wan口ip是192.168.12.107,lan口地址是172.17.0.1,我们的docker容器看成一个个的电脑接在第二个路由器lan上面,所以docker容器的ip为172.17.0.2。第二个路由器(宿主机)通过nat让我们的电脑们(docker容器)可以访问互联网。电脑们(docker容器们)可以互相ping通,也能ping通全部两个路由器。第二个路由器可以ping通电脑们,但是第一个路由器ping不同电脑们。如果还是不理解拓扑结构,可以自己在家里买两个路由器一前一后放上试试。现在问题来了,如果有一个电脑连接在第一个路由器的下面,和第二个路由器(宿主机)平级,其ip为192.168.12.113,现在它想ping通172.17.0.2这个docker容器,发现是ping不通的。同样第一台路由器自己也是ping不通docker容器的原因很简单,这台新计算机只能ping通同网段的设备,比如路由器2,因为他们同属于192.168.12.1/24这个网段。而172.17.0.2/16这个网段它并不知道怎么路由过去,只能把目标地址为172.17.0.1/16的数据包发给路由器一,可惜就连第一个路由器也不知道怎么个路由法。所以我们就ping不通了。所以现在问题就很好解决了,我们只需要告诉这台新电脑或者第一个路由器到172.17.0.2/16这个网段的路径就可以了。于是我们可以在新电脑或者路由器一中这样写或者是普通路由器可以像这样设置现在新电脑访问172.17.0.2的数据包就会先被发送到宿主机(第二个路由器)上,然后宿主机再转发到docker容器上,我们就把docker容器暴露到局域网里了。但此时你会发现你在新计算机上还是ping不通,这是为什么呢。因为路由器二(宿主机)对它的内网机器也就是docker容器们全部开启了nat,源ip为172.17.0.2/16的数据包不会出现在宿主机以外的网络中,因为他们被nat了。这个nat是docker进程默认自动帮我们实现的,我们先看一下注意那句masquerade all — 172.17.0.0/16 0.0.0.0/0会导致所有172.17.0.0/16的数据包都不能到达docker以外的网络,所以我们要关掉这个nat,关掉很容易,我们只需删掉这一条iptables规则就可以了。然后源ip为172.17.0.2的数据包就可以出现在192.168.12.1/24的网络中了。但是把nat关掉了以后,虽然内网可以互ping了,但是docker容器可能上不去网呀。第一个路由器如果自动nat 了172.17.0.2还好,但要是没有人给docker容器做nat,docker容器就不能上网了,那我们的cdns也就没法用了。那么如何既保证docker容器访问外网的数据包被nat,又保证内网通信不被nat呢?只要稍微修改一下iptables规则就好了,如下上面的iptables规则通过对内外网流量的分离实现区别的nat对待,就可以既保证docker容器正常上网,也可以被内网其他主机访问了。可能会有这么一种情况,上面所说的第一台路由器不是什么智能路由器,或者你没有权限在那个路由器上配置路由条目,让目标为172.17.0.0/16的数据包通过路由器进行路由。同时你的局域网其他电脑是xp系统的,也没法手动配置路由规则,这该怎么办呢?现在以要访问docker容器的局域网主机为windows xp系统为例,虽然winxp不能手动配置路由规则,但是我们可以配置网关,只要我们把网关设置为192.168.0.107也就是我们的宿主机,目标地址为172.17.0.0/16的ip包就会发送到宿主机上,而宿主机不同于第一个路由器,它是知道如何路由这些ip包的。于是我们就可以在winxp上ping通docker容器了以上就是关于“Docker容器怎么通过独立IP暴露给局域网”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注开发云行业资讯频道。

相关推荐: 怎么给DPVS加上SESSION同步功能

怎么给DPVS加上SESSION同步功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。DPVS是一款爱奇艺开源的基于DPDK的优秀软件(https://github.com/iqiyi/dpvs)…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 11/13 10:51
Next 11/13 10:53

相关推荐