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

简介: bridge网桥内容器通过容器IP相互访问,外部网络隔离docker run -p 参数通过端口映射,让bridge网桥外网络可以访问容器一般情况下,对外提供web服务的docker镜像会在0.0.0.0 地址上监听请

背景

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


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


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


    ab5a48e7a0b75c04d14020098d44873a.png


    对此我有几个疑问,这几个疑问在我看来有点与我之前对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)。


    9d77a326ba45b0532eb4a713c5e4b2ec.png


    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访问容器


      077d3b237a85f72a7b4caab0bebb41db.png


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


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


        那么可使用宿主机物理IP10.201.80.126:8080访问容器,这样局域网机器就能访问到容器了


        733e679c4bf5ce8f94be347ce1d482bb.png


        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 bash curl 127.0.0.1:8080 curl 127.0.0.2:8080 curl 127.0.1:8080 curl 172.17.0.2:8080 curl 172.17.2:8080


            9cea80d2db5c5102260be7850eeaf3f5.png


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


            c16245e2a99d69373888f3b7d8d49e55.png


              # 截取自该镜像构建源码:https://github.com/luksa/kubia-qps/blob/master/kubia-qps/app.jsvar www = http.createServer(handler);www.listen(8080);
              # nodejs: server.listen([port[, host[, backlog]]][, callback]) apiIf 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相互访问,外部网络隔离


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


              1. 一般情况下,对外提供web服务的docker镜像会在0.0.0.0 地址上监听请求
              相关文章
              |
              22天前
              |
              NoSQL 关系型数据库 MySQL
              《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
              《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
              143 56
              《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
              |
              16天前
              |
              网络协议 安全 网络安全
              探索网络模型与协议:从OSI到HTTPs的原理解析
              OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
              68 1
              |
              20天前
              |
              监控 安全 BI
              什么是零信任模型?如何实施以保证网络安全?
              随着数字化转型,网络边界不断变化,组织需采用新的安全方法。零信任基于“永不信任,永远验证”原则,强调无论内外部,任何用户、设备或网络都不可信任。该模型包括微分段、多因素身份验证、单点登录、最小特权原则、持续监控和审核用户活动、监控设备等核心准则,以实现强大的网络安全态势。
              |
              1月前
              |
              安全 Docker 容器
              docker的默认网络模式有哪些
              Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
              40 6
              |
              1月前
              |
              存储 缓存 监控
              Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
              本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
              113 7
              |
              2月前
              |
              安全 网络安全 数据安全/隐私保护
              利用Docker的网络安全功能来保护容器化应用
              通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
              51 5
              |
              2月前
              |
              存储 网络协议 安全
              30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
              本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
              111 2
              |
              2月前
              |
              运维 网络协议 算法
              7 层 OSI 参考模型:详解网络通信的层次结构
              7 层 OSI 参考模型:详解网络通信的层次结构
              364 1
              |
              2月前
              |
              Docker 容器
              【赵渝强老师】Docker的None网络模式
              Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
              |
              2月前
              |
              Docker 容器
              【赵渝强老师】Docker的Host网络模式
              Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。