[头脑风暴] 解读Docker Bridge网络模型

背景

这几天在研究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实践&排坑指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kodi pvr 不能安装_「家庭影音串流」电视最强播放器KODI使用方法

本文作者:空翻的帕兹文章适用电脑手机等全平台设备,在用户没有nas的情况下如何使用串流电视最强播放器KODIKodi是由XBMC基金會開發的開源媒體播放器,原名XBMC(最後一個以XBMC命名的版本是13.2「Gotham」,14.0 「Helix」是第一個以…

docker部署flask项目

项目本地运行 1.到github或者自己创建一个flask项目,确保在本地是可以运行成功的 2.上传到自己的代码仓库 服务器部署 1.安装docker yum install docker -y2.配置加速器 DaoCloud加速器采用自主研发的智能路由及缓存技术,并引入了现金的协议层优化…

.NET Core开发实战(第24课:文件提供程序:让你可以将文件放在任何地方)--学习笔记...

24 | 文件提供程序:让你可以将文件放在任何地方文件提供程序核心类型:1、IFileProvider2、IFileInfo3、IDirectoryContentsIFileProvider 是访问各种各样文件提供程序的接口通过这样子抽象的定义,让我们与具体的抽象文件的读取的代码进行了隔…

连接mysql数据库_解决Navicat连接MySQL数据库报错问题

今天在用Navicat连接另外一台主机上的MySQL时报错:Host is not allowed to connect to this MySQL server默认安装的mysql无法远程连接是因为MySQL默认配置了不支持远程连接引起的。解决方法:一、本地主机上登录root用户找到mysql.exe所在路径&#xff0…

洛谷T172098 子串-substr

代码如下&#xff1a; #include <iostream> #include <cstring> using namespace std;int main() {int cnt;cin >> cnt;string a, b;while (cnt--) {int n, m;cin >> n >> m;cin >> a;cin >> b;int ans 0 ;for (int i 0; i < …

在Ocelot中使用自定义的中间件(二)

在上文中《在Ocelot中使用自定义的中间件&#xff08;一&#xff09;》&#xff0c;我介绍了如何在Ocelot中使用自定义的中间件来修改下游服务的response body。今天&#xff0c;我们再扩展一下设计&#xff0c;让我们自己设计的中间件变得更为通用&#xff0c;使其能够应用在不…

机器学习理论引导 电子版_机器学习理论篇1:机器学习的数学基础(2)

本节主要就是讲述的机器学习的数学基础&#xff0c;提到数学基础&#xff0c;可能一眼就会是满眼的枯燥、没意思&#xff0c;但是成就英雄的路上注定了孤独&#xff0c;要想要真正的在学术上有所突破就必须挨得住寂寞&#xff0c;受得住孤独&#xff0c;才能真正的走进熟悉直到…

洛谷T172100 商店-贪心

解题思路&#xff1a; 贪心 代码如下&#xff1a; #include <iostream> #include <algorithm> using namespace std; const int N 100010; int a[N], w[N]; int ans;int main() {int n, m;cin >> n >> m;for (int i 1; i < n; i)cin >> a…

终结“永恒之蓝”后,再战“永恒之黑”

引子&#xff1a;2003年的“抗击非典”&#xff0c;17年后的2020年“抗击新冠”。2017年的“永恒之蓝”&#xff0c;3年后的2020年“永恒之黑”。历史&#xff1a;2017年5月13日&#xff0c;在“胖哥技术堂”中发布了《截杀“WannaCrypt”&#xff0c;终结“永恒之蓝”》。三年…

使用.Net Core编写命令行工具(CLI)

使用.Net Core编写命令行工具(CLI)命令行工具(CLI)命令行工具(CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面&#xff0c;它通常不支持鼠标&#xff0c;用户通过键盘输入指令&#xff0c;计算机接收到指令后&#xff0c;予以执行。通常认为&#xff0c;命令行工具(C…

与php有区别_php://output和php://stdout的区别

php中文网最新课程每日17点准时技术干货分享PHP包含了以php://开头的一系列输出输出流&#xff0c;如php://stdin, php://stdout等。今天查看代码时&#xff0c;忽然想到一个问题&#xff1a;php://output和php://stdout有什么区别&#xff1f;从PHP的官方文献中找答案&#xf…

浅谈 Kubernetes Scheduling-Framework 插件的实现

最近几个月一直在研究 kubernetes 的 scheduling-framework 调度框架&#xff0c;发现还是十分有意思的&#xff0c;我自己也实现了一个基于 scheduling-framework 调度框架的自定义调度器&#xff0c;希望感兴趣的同学一起学习&#xff1a;https://github.com/NJUPT-ISL/Yoda-…

C++实现线段树(lazy-tag方法)-区间修改,区间查询

代码如下&#xff1a; #include <iostream> using namespace std; const int N 10010; typedef long long LL; LL input[N];struct node {int l, r;LL sum;LL add; } tree[4 * N];void build(int l, int r, int u) {tree[u].l l;tree[u].r r;if (l r) {tree[u].sum …

.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...

25 | 路由与终结点&#xff1a;如何规划好你的Web API路由系统在 ASP.NET MVC 框架里面就已经存在了&#xff0c;在 ASP.NET Core 框架里面进行了改进路由系统的核心作用是指 URL 和 应用程序 Controller 的对应关系的一种映射这个映射关系实际上有两种作用&#xff1a;1、把 U…

Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)

好吧&#xff0c;这个题目我也想了很久&#xff0c;不知道如何用最简单的几个字来概括这篇文章&#xff0c;原本打算取名《Angular单页面应用基于Ocelot API网关与IdentityServer4ASP.NET Identity实现身份认证与授权》&#xff0c;然而如你所见&#xff0c;这样的名字实在是太…

【翻译】.NET 5 Preview 1 发布

.NET 5 Preview 1 发布去年年底,我们发布了.NET Core 3.0和3.1.这些版本添加了桌面应用程序模型Windows Forms(WinForms)和WPF,ASP.NET Blazor用于构建SPA应用程序和用于构建分布式应用和服务的gRPC模板、用于与gRPC对话丰富的客户端代码生成、REST API服务等等.我们很高兴看到…

Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)

上文已经介绍了Identity Service的实现过程。今天我们继续&#xff0c;实现一个简单的Weather API和一个基于Ocelot的API网关。回顾《Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权&#xff08;一&#xff09;》Weather APIWeather API实现非常简单&#xf…

编程 音量键_盘点市面上那些千元级高逼格的键盘 灯光炫酷 多宏编程

随着科技的变化&#xff0c;以及电竞被更多人熟知&#xff0c;也带动了电竞外设的进步&#xff0c;现在更多的人喜欢选择机械键盘。首先机械键盘可以给我们带来超棒的敲击感&#xff0c;无论是玩游戏还是日常办公打字&#xff0c;都绝对是一等一的好。再者机械键盘在高强度使用…

DotNetCore Web应用程序中的Cookie管理

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。限于译者的能力有限&#xff0c;个别语句翻译略显生硬&#xff0c;还请见谅。作者简介&#xff1a;Jon&#xff08;Jonathan&#x…

逆向so_记一次APP的so层算法逆向(七)

“ 前言&#xff1a;初学逆向 请多多指教 好累 感觉每天这样肝 人有点受不了了...”学习到的内容—1、新学习到IDA的一些分析时候的小技巧2、算法还原代码实现的练习(有个参数没有分析出来&#xff0c;后面知道了会补上的)3、在Frida中使用命令行调试的方便方法分析过程—APP登…