• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > Docker容器通过独立IP暴露给局域网的方法

Docker容器通过独立IP暴露给局域网的方法

作者:lvshaorong 字体:[增加 减小] 来源:互联网

本文主要包含docker容器独立ip,docker,容器,局域网等服务器相关知识,lvshaorong 希望可以进行参考

Docker容器非常轻量,系统开销非常少,比VMware或者VirtualBox用起来方便,部署起来也非常容易。官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用。一般过程是:

1、Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器

2、宿主机可以打开防火墙让局域网其他设备通过访问宿主机的端口进而访问docker的端口

这里以CDNS为例,CDNS是一个用于避免DNS污染的程序,通过CDNS可以把你的计算机变成一个抗污染的DNS服务器提供给局域网使用。Docker镜像下载地址:https://hub.docker.com/r/alexzhuo/cdns/

原理是在Docker容器中启动CDNS,监听53端口,Docker容器的IP地址为172.12.0.2,宿主机把5053端口映射到Docker容器上,访问宿主机的127.0.0.1:5053就相当于访问Docker的53端口,所以Docker的启动方法是:

sudo docker run -itd -p 0.0.0.0:5053:53/udp --name=CureDNS alexzhuo/cdns cdns -c /etc/cdns.config.json 

这样我们使用dig工具通过5053端口查询DNS就是无污染的DNS了,过程如下:

alex@alex-Lenovo-U310:~$ dig www.facebook.com @127.0.0.1 -p 5053 
; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.facebook.com @127.0.0.1 -p 5053 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9522 
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 5 
;; OPT PSEUDOSECTION: 
; EDNS: version: 0, flags:; udp: 4096 
;; QUESTION SECTION: 
;www.facebook.com.  IN A 
;; ANSWER SECTION: 
www.facebook.com. 1550 IN CNAME star-mini.c10r.facebook.com. 
star-mini.c10r.facebook.com. 30 IN A 31.13.95.36 
;; AUTHORITY SECTION: 
c10r.facebook.com. 2010 IN NS a.ns.c10r.facebook.com. 
c10r.facebook.com. 2010 IN NS b.ns.c10r.facebook.com. 
;; ADDITIONAL SECTION: 
a.ns.c10r.facebook.com. 2439 IN A 69.171.239.11 
a.ns.c10r.facebook.com. 2439 IN AAAA 2a03:2880:fffe:b:face:b00c:0:99 
b.ns.c10r.facebook.com. 3351 IN A 69.171.255.11 
b.ns.c10r.facebook.com. 1253 IN AAAA 2a03:2880:ffff:b:face:b00c:0:99 
;; Query time: 47 msec 
;; SERVER: 127.0.0.1#5053(127.0.0.1) 
;; WHEN: Mon Apr 10 16:21:46 CST 2017 
;; MSG SIZE rcvd: 213 

这里假设我们的宿主机IP是192.168.12.107

如果现在出现另外一台局域网计算机,IP地址为192.168.12.113,它想把宿主机当成DNS服务器,那么我们就需要在192.168.12.113这台计算机上访问192.168.12.107:5053来查询DNS,dig命令如下

dig www.facebook.com @192.168.12.107 -p 5053 

这样做显然是很不方便的,我们现在希望不经过宿主机这一套NAT和代理,想要直接在局域网内的任意一台计算机上直接通过IP访问Docker容器,让Docker容器完整的暴露在局域网里而不是仅单单暴露一个53端口。那么应该如何做呢?

首先通过观察发现,Docker的默认启动方式中,会产生一块虚拟网卡,在这里我们可以理解这块网卡连接着一个虚拟交换机,然后每个Docker容器又会拥有自己单独的网卡和IP,而且所有Docker容器也连接在这个虚拟交换机的下面。我们可以在宿主机上通过ifconfig命令看到这个虚拟网卡。

alex@alex-Lenovo-U310:~$ ifconfig 
docker0 Link encap:以太网 硬件地址 02:42:cd:21:5c:81 
   inet 地址:172.17.0.1 广播:0.0.0.0 掩码:255.255.0.0 
   inet6 地址: fe80::42:cdff:fe21:5c81/64 Scope:Link 
   UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 
   接收数据包:2892 错误:0 丢弃:0 过载:0 帧数:0 
   发送数据包:3517 错误:0 丢弃:0 过载:0 载波:0 
   碰撞:0 发送队列长度:0 
   接收字节:187022 (187.0 KB) 发送字节:4771886 (4.7 MB) 
lo  Link encap:本地环回 
   inet 地址:127.0.0.1 掩码:255.0.0.0 
   inet6 地址: ::1/128 Scope:Host 
   UP LOOPBACK RUNNING MTU:65536 跃点数:1 
   接收数据包:9993 错误:0 丢弃:0 过载:0 帧数:0 
   发送数据包:9993 错误:0 丢弃:0 过载:0 载波:0 
   碰撞:0 发送队列长度:1 
   接收字节:934304 (934.3 KB) 发送字节:934304 (934.3 KB) 
wlp3s0 Link encap:以太网 硬件地址 74:e5:43:b0:dd:b0 
   inet 地址:192.168.12.107 广播:192.168.12.255 掩码:255.255.255.0 
   inet6 地址: fe80::8adf:28f7:5ec:3a5d/64 Scope:Link 
   UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 
   接收数据包:69760 错误:0 丢弃:0 过载:0 帧数:0 
   发送数据包:64718 错误:0 丢弃:0 过载:0 载波:0 
   碰撞:0 发送队列长度:1000 
   接收字节:41517057 (41.5 MB) 发送字节:9971762 (9.9 MB) 

上面的docker0这块网卡就是虚拟网卡,它的IP地址是172.17.0.1,它和其他的docker容器都连接在一个虚拟交换机上,网段为172.17.0.0/16,下面我们登录到Docker容器里面,查看一下容器的网卡和IP

# ifconfig 
eth0  Link encap:Ethernet HWaddr 02:42:ac:11:00:02 
   inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 
   inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link 
   UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
   RX packets:3449 errors:0 dropped:0 overruns:0 frame:0 
   TX packets:2811 errors:0 dropped:0 overruns:0 carrier:0 
   collisions:0 txqueuelen:0 
   RX bytes:4763490 (4.7 MB) TX bytes:219998 (219.9 KB) 
lo  Link encap:Local Loopback 
   inet addr:127.0.0.1 Mask:255.0.0.0 
   inet6 addr: ::1/128 Scope:Host 
   UP LOOPBACK RUNNING MTU:65536 Metric:1 
   RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
   TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
   collisions:0 txqueuelen:1 
   RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

可以看到这个容器的IP地址为172.17.0.2,现在我们到宿主机里看看ping 172.17.0.2能不能ping通。

答案当然是能ping通,能ping通的原因就是我们的宿主机里知道目标地址为172.17.0.1/16的路由信息,不信我们可以查看一下

alex@alex-Lenovo-U310:~$ ip route 
default via 192.168.12.1 dev wlp3s0 proto static metric 600 
169.254.0.0/16 dev docker0 scope link metric 1000 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.12.0/24 dev wlp3s0 proto kernel scope link src 192.168.12.107 metric 600 

从上面可以看出来,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这个网段的路径就可以了。

于是我们可以在新电脑或者路由器一中这样写

route add -net 172.17.0.1/16 gw 192.168.12.107 

或者是

ip route add 172.17.0.1/16 via 192.168.1
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Docker容器通过独立IP暴露给局域网的方法

相关文章

  • 某集团任意文件下载到虚拟主机getshell的方法
  • Docker高级教程之智能添加与修改防火墙规则
  • 走进青岛中集 看IT轻盈之道
  • virtualbox下osx系统盘扩容方法
  • 详解从 0 开始使用 Docker 快速搭建 Hadoop 集群环境
  • Docker-Compose的使用示例详解
  • 购买虚拟服务器的8大注意事项
  • 详解Ubuntu Docker Registry 搭建私有仓库
  • Docker容器通过独立IP暴露给局域网的方法
  • 手把手教你使用 virtualBox 让虚拟机连接网络的教程

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • 使用Docker部署 spring-boot maven应用的方法
    • 应用集成之痛:云时代也不能止痛
    • 详解基于docker搭建lanproxy内网穿透服务
    • centos7 安装docker步骤详细介绍
    • Docker设置代理的方法教程
    • 虚拟机实现静态IP登录和无线上网
    • 解决VMWARE桥接模式虚拟机无法上网的问题
    • Ubuntu 18.04 LTS安装KVM虚拟机的方法步骤
    • Docker 实现在线集成开发环境实例详解
    • Hadoop Streaming 获取mapreduce_map_input_file遇到的版本问题,hadoopmapreduce

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有