背景

这几天在研究Kubernetes, 遇到一个有意思的nodejs镜像:luksa/kubia

# 不带端口映射启动容器
docker  run  -it -d   luksa/kubia
# 连接到默认的Bridge网桥,容器IP是 172.17.0.2

之后,在宿主机使用容器IP和8080 端口可访问该容器nodejs服务

对此我有几个疑问,这几个疑问在我看来有点与我之前对docker 网络的认知相冲突。
Q1. 不是说如果容器没有端口映射,容器内外隔离吗,怎么在宿主机使用容器IP还可以访问?
Q2.  使用容器IP:8080可以访问nodejs服务,这个8080从哪里来?

头脑风暴

首先排除一些同事说法:这个容器是以host网络模型连到宿主机,所以可以在宿主机通过容器IP访问。这个新建容器肯定还是连接到默认的bridge网桥上。

  • All containers without a --network specified, are attached to the default bridge network.

  • In terms of Docker, a bridge network uses a software bridge which allows containers connected to the same bridge network to communicate, while providing isolation from containers which are not connected to that bridge network.

对于Q1,我有个误区:没有端口映射,容器内外网络隔离,宿主机是无法访问容器的。
A:  实际上,对于加入同一bridge网桥上的容器,网桥内外网络确实是隔离的,网桥上的容器都可以相互连接。
而我们的宿主机也在这个默认的bridge网桥设备上,其IP地址是网桥设备的网关(172.17.0.1)。

Q3.那端口映射到底起什么作用呢?
A:网桥模型确保了网桥内容器可相互访问,但除此网桥之外的网络均不能访问容器, 这也正是bridge网络隔离的效果。
端口映射-p表示容器绑定宿主机的网卡端口来实现转发访问,绑定的网卡决定了你对外暴露的程度。

  1. 绑定宿主机的回环地址127.0.0.1

 docker run -it  -d  -p 127.0.0.1:8080:8080 luksa/kubia

那么在宿主机内只能使用127.0.0.1:8080访问容器

  1. 绑定宿主机的物理地址 10.201.80.126

docker run -it  -d  -p 10.201.80.126:8080:8080 luksa/kubia

那么可使用宿主机物理IP10.201.80.126:8080访问容器,这样局域网机器就能访问到容器了 3. 不写IP,这样会绑定到0.0.0.0,也就是宿主机所有的网卡。

docker run -it  -d  -p 8080:8080 luksa/kubia

很显然,宿主机内回环地址和物理地址均可以访问该容器了。

再回到上面的Q2问题,通过容器IP:8080访问容器,8080是哪里来的?

8080是容器内nodejs进程的监听端口,我们在构建镜像时本就无所谓使用expose指令

The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.

所以在docekr ps时候,并不会在PORTS列显示任何内容,但是通过容器IP可直接连通容器内进程监听端口。

为啥访问容器IP:8080 就可以访问容器内nodejs提供的服务?

这是因为容器镜像在构建的时候,一般在0.0.0.0地址上监听请求,这意味着程序在所有地址的8080端口上监听请求。

这样就延伸出一个有趣的现象,让我们进入容器内部:

 docker exec -it 3cc9f428fc25 bashcurl 127.0.0.1:8080curl 127.0.0.2:8080curl 127.0.1:8080curl 172.17.0.2:8080curl 172.17.2:8080

几个看起来错误的IP竟然也可以访问nodejs服务, 这正是nodejs在http://0.0.0.0:8080地址监听请求的结果。

# 截取自该镜像构建源码:https://github.com/luksa/kubia-qps/blob/master/kubia-qps/app.js
var www = http.createServer(handler);
www.listen(8080);# nodejs: server.listen([port[, host[, backlog]]][, callback]) api
If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available, or the unspecified IPv4 address (0.0.0.0) otherwise.

猜想+ 验证+ 源码支持,回应了一开始的几个疑问,对容器Bridge的网络认知进一步加深。

总结输出

  1. bridge网桥内容器通过容器IP相互访问,外部网络隔离

  2. docker run -p 参数通过端口映射,让bridge网桥外网络可以访问容器

  3. 一般情况下,对外提供web服务的docker镜像会在0.0.0.0 地址上监听请求

  • https://en.wikipedia.org/wiki/0.0.0.0

  • https://github.com/luksa/kubia-qps/blob/master/kubia-qps/app.js

  • https://linuxize.com/post/check-listening-ports-linux/

推荐阅读

● 程序员应对浏览器同源策略的姿势

● 一文掌握Cookies前世今生

● ASP.NET Core跨平台技术内幕

● TPL Dataflow组件应对高并发,低延迟要求

● 实例解读Docker Swarm

● 基于docker-compose的Gitlab CI/CD实践&排坑指南

[头脑风暴] 解读Docker Bridge网络模型相关推荐

  1. Docker系列 头脑风暴专用手绘图应用excalidraw

    转自我的个人博客https://blognas.hwb0307.com.欢迎关注! 前言 前段时间逛Github的时候偶然发现了一个叫excalidraw的应用,Github Repo有30.8k的S ...

  2. 学习Docker容器网络模型 - 搭建分布式Zookeeper集群

    ZooKeeper是一个流行的分布式协调服务.它提供了两种不同的部署方式:单机模式和分布式模式.其中单机模式的部署非常简单,网上也有很多资料,我们今天会利用Docker搭建分布式Zookeeper集群 ...

  3. Interview:算法岗位面试—10.15上午—上海某公司算法岗位(偏图像算法,制造行业)技术面试考点之AI算法与实际场景结合产生商业价值的头脑风暴

    Interview:算法岗位面试-10.15上午-上海某公司算法岗位(偏图像算法,制造行业)技术面试考点之AI算法与实际场景结合产生商业价值的头脑风暴 导读:一心想去互联网,未必能够发挥自己最大价值, ...

  4. 实例解读Docker Swarm

    背景 回顾docker-compose vs docker stack差异: ① docker-compose是docker引擎之外的容器编排工具(Python实现),需要单独安装:docker st ...

  5. 刘韧:写作是自我的头脑风暴

    1.写作是自我的头脑风暴:多个自我.多种主义.一堆概念.多套方法论,在不同层次.维度.角度.时间上,碰撞.打架,作者既要稳住全局,又要淋漓酣畅地展示冲突,还要激荡出事先没有意识到的新意. 2.写作第一 ...

  6. 头脑风暴是如何毁掉创意的?

    2019独角兽企业重金招聘Python工程师标准>>> 设 想以下场景:你在思考公司下一步的发展战略.为了集思广益得到最好的方案,你召集了团队里面的人一起开会.原本你是这样想的,一次 ...

  7. 【沟通之道】头脑风暴-女人的心思你别猜

    作者:范军 (Frank Fan)新浪微博:@frankfan7   微信:GetToCloud   一位大叔在海边低着头没精打采的走着,远处天空的黑云慢慢压了过来,他也是一脸愁云惨雾.他想发泄一下, ...

  8. dijkstra算法matlab代码_头脑风暴优化(BSO)算法(附MATLAB代码)

    BSO讲解https://www.zhihu.com/video/1252605855767736320 B站搜索:随心390,同步观看视频 各位小伙伴可在闲鱼搜索 优化算法交流地,即可搜索到官方闲鱼 ...

  9. MATLAB实战系列(二十九)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)-交叉算子

    前言 代码明细可参见 MATLAB实战系列(八)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)(附MATLAB代码) 交叉算子的实现机制 我们还是以求解TSP问题为例,8个城市的坐标如下所示. ...

最新文章

  1. AI时代龙争虎战 什么是传统安企“护城河”?
  2. DynamicPropertyAccessor Expression lambda
  3. 算法导轮之B树的学习
  4. C#中实现计时器功能(定时任务和计时多长时间后执行某方法)
  5. List - Map 工具类,list转为map
  6. html溢出左右滚动,html-选项卡溢出时水平滚动
  7. matlab中循环读入文件内容,[转载]Matlab利用load循环读入数据文件
  8. Ubuntu13.04配置优化(四)转贴
  9. (转)Linux查看CPU,硬盘,内存的大小
  10. java连接mysql-8.0.11且成功读写
  11. mina框架CumulativeProtocolDecoder.doDecode方法浅析
  12. 保险精算--第五周作业
  13. 搭建hexo博客与yilia主题优化
  14. 基于java的学生学籍管理系统(含源文件)
  15. ubuntu16.04无线网卡rtl8723be驱动问题
  16. 批处理修改计算机名为ip,批处理修改计算机名和IP地址
  17. 题目 1224: 整除的尾数
  18. 电源服务器原理,破坏性拆解一个HP服务器1300W的电源 【精华】
  19. java 接口校验接收参数_java接口参数校验
  20. 程序员表白,不光需要“技术”,更需要勇气!

热门文章

  1. ArcGis融合小多边形到相邻多边形
  2. Teams中的快捷键让沟通协作更加高效
  3. 移动应用ios和网页应用_如何在iOS上一次移动多个应用
  4. safari 获取视频流_如何在Safari中将RSS feed和社交媒体合并为一个流
  5. 正在创建系统还原点_如何使Windows在启动时自动创建系统还原点
  6. BZOJ 3434 时空穿梭
  7. CentOS 6.9通过RPM安装EPEL源(http://dl.fedoraproject.org)
  8. SAP的SqlAnyWhere中数据库日志文件删除后如何新建
  9. Android ContentProvider支持跨进程数据共享与互斥、同步 杂谈
  10. cookies,sessionStorage 和 localStorage 的区别?