Docker:认识Docker Bridge网络

news2024/9/22 19:24:59

文章目录

  • 为什么需要网络管理
  • Docker网络架构简介
  • CNM
  • LibNetwork
  • 驱动
  • Docker网络管理命令
  • 网络命令基本操作
  • 网络详解
    • docker Bridge网络
  • 容器之间的网络通信
  • DNS解析

为什么需要网络管理

容器的网络默认会与宿主机器以及其他的容器相互隔离,但是还需要考虑到下面的这些问题:

  1. 多个容器之间是如何进行通信的
  2. 容器和宿主机是如何进行通信的
  3. 容器和外界是如何进行通信的
  4. 容器要运行一些网络的服务,如果要让外部也能访问,那么该如何实现
  5. 容器不想让它的网络和宿主机,以及其他的容器隔离该如何实现
  6. 容器不需要网络该如何实现
  7. 容器需要定制化网络该如何实现

Docker网络架构简介

Docker容器网络是为了应用程序而创造的虚拟环境的一部分,它能让应用从宿主机器上操作系统的网络环境中独立出来,形成容器自有的网络设备,ip协议栈,端口套接字,等等模块,Docker为了实现出容器网络,因此主要采取的架构有三部分组成:CNM,Libnetwork和驱动组成,下面就一一对这些进行概述

CNM

Docker在最初的设计过程中,采用的设计规范就是这种模式,这种模式的全称是container network Model,在具体的Docker网络中的基础组成元素是,Sandbox,Endpoint,Network

在这里插入图片描述
下面对于上述的这些内容进行解释:

Sandbox:提供了容器的虚拟网络栈,就是所谓的端口,套接字,ip路由表,防火墙,dns等内容,主要是用来隔离容器网络和宿主机网络,也形成了完全独立的容器网络环境

Network:这是Docker内部的一个虚拟的子网,使得网络内的参与者可以进行通信

Endpoint:这是虚拟网络的接口,就想普通网络的接口一样,Endpoint的主要职责是负责创建链接,Endpoint类似于常见的网络适配器,这就意味着一个Endpoint只需要能接入到某一个网络,当容器需要接入多个网络,就需要多个Endpoint

如上所示,容器b中有两个Endpoint,那么它就可以接入到网络a和网络b,那么容器a和容器b是可以相互进行通信的,因为这两个都使用了网络a,但是a和c是不可以通信的,因为没有接入一个网络中

LibNetwork

这个模块是CNM的一个具体的标准实现,Libnetwork是一个开源库,在这个开源库中是使用Go语言进行编写的,也是Docker中使用的标准库,Docker网络架构的核心代码都在这里,这个库中实现了CNM中定义的三个组件,此外还实现了本地服务发现,基于容器的负载均衡,还有网络控制层和管理层等功能

驱动

驱动主要是负责进行实现数据层相关的内容,例如说对于网络的连通性和隔离性就是通过驱动来完成的,驱动主要是实现了特定网络类型的方式拓展了Docker的网络栈,例如有桥接网络和覆盖网络

Docker内部还内置了很多的驱动,驱动主要是负责进行它上面网络资源的创建和管理

Docker网络管理命令

命令清单:

  1. docker network create:创建网络
  2. docker network connect:连接网络
  3. docker network disconnect:断开网络
  4. docker network ls:列出网络
  5. docker network prune:删除不使用的网络
  6. docker network inspect:查看网络详情
  7. docker network rm:删除1个或者多个网络

网络命令基本操作

创建网络并制定ip地址段

root@VM-24-7-ubuntu:~# docker network create --subnet=172.18.0.0/16 mynetwork
a2d04989a501be9e76052a27bd3b65bcfbe6df05eab8cd4c951bc1e54f0198ef

查看创建的网络

root@VM-24-7-ubuntu:~# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
c649cc05be2c   bridge      bridge    local
d86cdfa38d43   host        host      local
a2d04989a501   mynetwork   bridge    local
ab94c63a107d   none        null      local

创建一个容器并加入网络

root@VM-24-7-ubuntu:~# docker run -itd --name mynginx --network mynetwork nginx
e0f24948938c88e563fc68405ef1caca2246280f84f6a8033314d18884316a74

查看容器网络信息

"Networks": {
                "mynetwork": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "MacAddress": "02:42:ac:12:00:02",
                    "NetworkID": "a2d04989a501be9e76052a27bd3b65bcfbe6df05eab8cd4c951bc1e54f0198ef",
                    "EndpointID": "43ad4323fe156a4670fcbad65d538d8d56bacbf6f1b4bfbff6f16a2a7043efed",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DriverOpts": null,
                    "DNSNames": [
                        "mynginx",
                        "e0f24948938c"
                    ]
                }

网络详解

再回到前面列举出的网络,下面一一解释在docker中存在的网络信息:

NETWORK ID     NAME        DRIVER    SCOPE
c649cc05be2c   bridge      bridge    local
d86cdfa38d43   host        host      local
a2d04989a501   mynetwork   bridge    local
ab94c63a107d   none        null      local

docker Bridge网络

在Docker Bridge网络中采用内置的Bridge驱动,这个驱动的底层使用的是Linux内核中的一个Linux Bridge技术,对于网路来说,Bridge网络是在网络段之间进行转发流量的链路蹭设备,而网桥是可以在主机内核中运行的硬件设备或者软件设备

对于Docker来说,桥接网络使用的软件网桥Docker0,它允许连接到同一个网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离

Docker container的Bridge桥接模式可以参考下面的图片:

在这里插入图片描述
正常来说,当在创建的容器中如果没有使用–network参数制定要加入的Docker网络的时候,默认使用的就是Docker默认的单机桥接网络,就是这个Bridge的网络

而默认的Bridge网络也会背映射到内核中为Docker0的网络上

Docker默认的Bridge网络和Linux内核中的Docker0网桥也是一一对应的关系,Bridge是Docker对于网络的命名,而Docker0是内核中网桥的名字

在这里插入图片描述

容器之间的网络通信

多台主机之间是如何通过网络进行通信的?

如果是两台主机可以直接连接网线的两段进行通信,那么多个主机之间的通信?需要用到的是路由器交换机进行通信

那么对于Docker容器来说,其实也是这个基本原理,容器之间的通信也和上面主机通信的方式如出一辙,之前提到了安装Docker的时候默认会使用docker0这个网桥软件设备,这个docker0设备可以类比成上图的交换机和路由器设备,当创建好容器之后,如果不手动指定网络模式,默认会使用Bridge网络,容器也会连接到docker0这个网桥设备,然后通过这个网桥来进行容器之间的通信

做个实验

现在用Busybox创建两个容器

root@VM-24-7-ubuntu:~# docker container run -itd --name c1 busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
ec562eabd705: Pull complete 
Digest: sha256:9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7
Status: Downloaded newer image for busybox:latest
0debb05244d3b60d555c68da54693b3f5610c8046a6024104e20d39f87625a8e
root@VM-24-7-ubuntu:~# docker container run -itd --name c2 busybox
ea71679200c98e065d43e300eeb4faace2ba204ea76892a8bf7cc69668f9c84b
root@VM-24-7-ubuntu:~# docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
ea71679200c9   busybox   "sh"                     6 seconds ago    Up 6 seconds              c2
0debb05244d3   busybox   "sh"                     14 seconds ago   Up 14 seconds             c1

查看两个容器的通信现象

先查看一下网路信息:

root@VM-24-7-ubuntu:~# docker container exec -it c1 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1086 (1.0 KiB)  TX bytes:0 (0.0 B)

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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@VM-24-7-ubuntu:~# docker container exec -it c2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03  
          inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:11 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:866 (866.0 B)  TX bytes:0 (0.0 B)

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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

然后在c1容器中去ping一下c2容器的ip地址:

此时会发现是可以正常通信的:

root@VM-24-7-ubuntu:~# docker container exec -it c1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.321 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.063 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.070 ms
64 bytes from 172.17.0.3: seq=3 ttl=64 time=0.097 ms
64 bytes from 172.17.0.3: seq=4 ttl=64 time=0.063 ms
^C
--- 172.17.0.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.063/0.122/0.321 ms

然后查看Bridge网络的信息

        "Containers": {
            "0debb05244d3b60d555c68da54693b3f5610c8046a6024104e20d39f87625a8e": {
                "Name": "c1",
                "EndpointID": "0c44305f7aff7af74f90e6d60a30089317cdb22256d0fef1409d141c2580f626",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "ea71679200c98e065d43e300eeb4faace2ba204ea76892a8bf7cc69668f9c84b": {
                "Name": "c2",
                "EndpointID": "5d92cf8664f80abbebbb508b8f3f5749f7f4d087cab080ef084d1c1c505e4d22",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },

可以看出,这个网络中现在接入了两个容器,c1和c2,而此时,这两个容器就是通过docker0这个网桥来进行通信的,当我们停止或者删除一个容器的时候,就会和这个docker0断开:

暂停一个容器

在这里插入图片描述
创建自定义Bridge

在默认情况下,创建的容器都会连接在docker0这个Bridge上,我们也可以自己定义一些Bridge,让运行的容器借助这个Bridge来进行通信

DNS解析

Docker自定义桥接网络是支持通过Docker的DNS服务来进行域名解析的,也就是说可以直接用容器名来进行通信,因为DNS可以解析容器名到ip地址的映射,但是默认的Bridge网络是不支持DNS的

下面创建四个容器

两个使用默认的Bridge,两个使用自定义Bridge

root@VM-24-7-ubuntu:~# docker container run -itd --name c1 busybox
321e39278a0f8a5182fea4ab1cf1eba6a58fd57907e8fe02331402212703c182
root@VM-24-7-ubuntu:~# docker container run -itd --name c2 busybox
cd8d20f25c867e58d59b47facdf8ada0ad74c97c96c533c34c1ee0b507746fe9
root@VM-24-7-ubuntu:~# docker network create new-bridge
da9aba174a732e9ff7eb267427d6aa7a20686bd11ce361c72c4344b0a689d573
root@VM-24-7-ubuntu:~# docker container run -itd --name c3 --network new-bridge busybox
48fab956ab181239c3525afa307b90aca56277418eb7def2f8c8fc7986336aa2
root@VM-24-7-ubuntu:~# docker container run -itd --name c4 --network new-bridge busybox
ac589f4b66f5aa2ee3eaff299e764484b1fd34fb051a430d84cd0f7e296f2101

查看现在的容器列表

CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES
ac589f4b66f5   busybox   "sh"      30 seconds ago       Up 29 seconds                 c4
48fab956ab18   busybox   "sh"      35 seconds ago       Up 33 seconds                 c3
cd8d20f25c86   busybox   "sh"      About a minute ago   Up About a minute             c2
321e39278a0f   busybox   "sh"      About a minute ago   Up About a minute             c1

看c1和c2是否可以使用DNS解析服务

尝试用c1去ping一下c2的ip地址

root@VM-24-7-ubuntu:~# docker container exec -it c1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.347 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.082 ms
^C
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.082/0.214/0.347 ms

看出结论是可以的

尝试用c1去ping一下c2:

root@VM-24-7-ubuntu:~# docker container exec -it c1 ping c2
ping: bad address 'c2'

从而确定,默认的Bridge是不支持进行DNS解析的

验证c3和c4是否可以进行DNS解析

root@VM-24-7-ubuntu:~# docker container exec -it c3 ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=1.732 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.084 ms
^C
--- 172.18.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.084/0.908/1.732 ms
root@VM-24-7-ubuntu:~# docker container exec -it c3 ping c4
PING c4 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.091 ms
^C
--- c4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.080/0.091 ms

这两个都ping成功了,说明自定义的Bridge是支持DNS解析的

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

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

相关文章

2024年大数据、区块链与物联网国际会议(ICBDBLT 2024)

2024 International Conference on Big Data, Blockchain, and Internet of Things 【1】大会信息 会议简称:ICBDBLT 2024 大会地点:中国青岛 审稿通知:投稿后2-3日内通知 会议官网:www.icbdblt.com 【2】会议简介 即将召开的…

Linux内网数据代理与数据映射实验

背景介绍 有两台主机,其中一台可以联网,而另一台只能与联网主机,尝试通过配置,使该主机也能正常上网,这常应用于企业内部不联网的服务器,需要安全可靠或临时上网的场景,借助另一台可以上网的内…

Docker:认识Bind Mounts绑定卷

文章目录 绑定卷bind mount创建卷操作案例使用mount创建绑定卷 使用场景管理卷和绑定卷的区别? 绑定卷bind mount -v和-mount都可以进行绑定卷的创建 创建卷 功能:完成卷映射 语法: docker run -v name:directory[:options]...参数&…

python数据分析--- ch1-2 python初识入门

python数据分析--- ch1-2 python初识入门 1. 安装并启动jupyter2. 打印变量print()练一练 3. 变量与赋值 input()3.1 示例--饮料交换3.2 饮料交换完整code3.3 jupyter中写入code到py文件中3.4 在终端运行.py文件 : python 文件名3.5练一练1:简易版2&…

[leetcode]删除链表中倒数第k个结点

. - 力扣(LeetCode) class Solution { public:ListNode* trainningPlan(ListNode* head, int cnt) {int n 0;ListNode* node nullptr;for (node head; node; node node->next) {n;}for (node head; n > cnt; n--) {node node->next;}retu…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第38课-密室逃脱-3D互动剧情

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第38课-密室逃脱 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

基于VLC可见光通信的室内光通信信道信噪比分析matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................... % 接收功率计算Pr …

周一美股集体低开后转涨,早盘仅道指小幅下跌,英伟达跌超3%后转涨超1%

美国非农就业报告发布“次日”,三大股指低开,但早盘均成功转涨。美股七姐妹涨跌各异,苹果WWDC大会今晚开幕,但早盘转跌,一度跌超1%;1拆10股正式生效的英伟达盘初曾跌超3.2%,开盘1.5小时内首次转…

纷享销客常见问题FAQ

运维和安全职责边界 应用专属是部署在客户私有云或者客户公有云租户的IT环境中的,由纷享销客与客户共同维护系统的稳定性。一般来说客户主要负责维护IT基础环境和账号权限的管理而纷享销客则负责在客户环境中进行应用系统的部署、优化和日常运维工作。在安全方面&am…

如何实现办公终端安全

在网络安全日益严峻的当下,可信白名单作为一种高效的终端安全防护手段,正在逐渐受到业界的广泛关注和应用。本文将简要探讨可信白名单如何实现终端安全的原理、方法及其在实际应用中的优势与挑战。 首先,我们需要了解可信白名单的基本原理。可…

深度探讨:为何训练精度不高却在测试中表现优异?

深度探讨:为何训练精度不高却在测试中表现优异? 在深度学习领域,我们经常遇到这样一个看似矛盾的现象:模型在训练集上的精度不是特别高,但在测试集上却能达到出色的表现。这种情况虽然不是常规,但其背后的…

2024第十六届亚洲水技术展览会Aquatech China

Aquatech China 2024第十六届亚洲水技术展览会 专注水行业覆盖全领域—荷兰阿姆斯特丹水展中国展 2024.12.11-13 上海新国际博览中心 展会背景 Aquatech品牌创立于1968年。作为水处理行业历史悠久 的展览会,荷兰国际水处理展览会(Aquatech Amsterdam)至今已有近55…

机器学习实验------PCA

目录 一、介绍 二、算法流程 (1)数据中心化 (2)计算协方差矩阵 (3)特征值分解 (4)选择特征 三、运行结果展示 四、实验中遇到的问题 五、PCA的优缺点 优点: 缺点…

基于MDS的波士顿房价数据集降维

文章目录 1. 作者介绍2. 多维尺度分析(Multi-Dimensional Scaling, MDS)介绍2.1 MDS介绍2.2 MDS的类别2.2.1度量MDS2.2.2非度量MDS 2.3 目标函数2.4 MDS降维计算步骤2.4.1计算流程2.4.2 算法示例 3.实验过程3.1数据集介绍3.2算法思路3.3算法评…

【LLM】快速了解Dify 0.6.10的核心功能:知识库检索、Agent创建和工作流编排(二)

【LLM】快速了解Dify 0.6.10的核心功能:知识库检索、Agent创建和工作流编排(二) 文章目录 【LLM】快速了解Dify 0.6.10的核心功能:知识库检索、Agent创建和工作流编排(二)一、创建一个简单的聊天助手&#…

奥英特技公园开业盛典 点燃文旅商业融合新引擎

(通讯员 赵霞)2024年6月9日,奥英汽车特技表演公园盛大开幕。这座集汽车特技、文化艺术、旅游体验于一体的全新综合性主题公园,不仅为游客带来了精彩刺激的视觉盛宴,更通过“以体促旅、以旅带文”的深度融合,助推了文旅产业与商业经济的深度融…

Redis集群(5)

集群原理 节点通信 通信流程 在分布式存储系统中,维护节点元数据(如节点负责的数据、节点的故障状态等)是关键任务。常见的元数据维护方式分为集中式和P2P方式。Redis集群采用P2P的Gossip协议,这种协议的工作原理是节点之间不断…

使用lombok帮我们生成 getter、setter、无参构造器、全参构造器、equals、hashcode

文章目录 为什么要使用lombok?lombok的使用步骤1.检查 idea 是否安装 lombok 插件2.检查是否勾选了 enable annotation processing3.导入 lombok.jar 并加入到模块中4.在实体类添加注解 测试 为什么要使用lombok? lombok可以帮我们生成 getter、setter、…

独立游戏之路:Tap篇 -- 获取OAID提升广告收益

Unity 之 获取手机:OAID、ClientId、GUID 前言一、Oaid 介绍1.1 Oaid 说明1.2 移动安全联盟(MSA)二、站在巨人的肩膀上2.1 本文实现参考2.2 本文实现效果2.3 本文相关插件三、Unity 中获取Oaid3.1 查看实现源码3.2 工程配置3.3 代码实现3.4 场景搭建四、总结前言 在当今的移动…

SpringCloud 网关Gateway配置并使用

目录 1 什么是网关? 2 Gateway的使用 2.1 在其pom文件中引入依赖 2.2 然后gateway配置文件中配置信息 2.3 启动网关微服务 3 网关处理流程 4 前端-网关-微服务-微服务间实现信息共享传递 1 什么是网关? 网关:就是网络的关口&#xff…