【Docker】Docker的网络

Docker提供了多种内置的网络模式,用于在容器之间建立网络连接。这些网络模式,包括桥接网络、主机网络、无网络模式。我们将主要探讨每种网络模式的优缺点、适用场景。

桥接网络

桥接网络是Docker的默认网络模式。在桥接网络中,Docker会为每个容器创建一个虚拟网络接口,并为容器分配一个IP地址。容器可以通过桥接网络与主机和其他容器进行通信。


桥接网络适用于单主机上的多个容器之间的通信,例如微服务架构中的多个服务容器之间的通信。

优点

隔离性:每个容器都有独立的网络命名空间,相互之间隔离,不会互相干扰。
简单易用:桥接网络是默认的网络模式,无需额外配置,容器可以直接进行通信。
跨主机通信:可以通过端口映射实现容器与主机之间的通信,也可以使用Overlay网络实现跨主机通信。

缺点

性能损失:桥接网络需要进行网络地址转换(NAT),可能会引入一定的性能损失。
端口冲突:如果多个容器使用相同的端口号,可能会导致端口冲突。

使用默认网络

桥接网络是默认的网络模式,无需额外配置。通过docker run命令创建容器时,可以使用--network bridge参数指定使用桥接网络,当然因为是默认的,也可以选择不加。

创建两个容器,不指定网络名称:

$ docker container run -d --rm --name box1 busybox /bin/sh -c "while true; do sleep 3600; done"
688c366577417888ad3835fa87370003c163a2a9c31ab6e109e2114b5528be6d

$ docker container run -d --rm --name box2 busybox /bin/sh -c "while true; do sleep 3600; done"
141723898adb64074b223d8823a4b7c8712eb405d4c1542212e09c4f17682c18

$ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
141723898adb   busybox   "/bin/sh -c 'while t…"   12 seconds ago   Up 10 seconds             box2
688c36657741   busybox   "/bin/sh -c 'while t…"   59 seconds ago   Up 58 seconds             box1

查询容器使用的网络名称:

$ docker container inspect box3
[
    {
        "Id": "688c366577417888ad3835fa87370003c163a2a9c31ab6e109e2114b5528be6d",
        。。。 。。。
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "28e45b9b8f4b19c29f07c732883ccfeab6640dc37a0824b2790f6ea0b7a0ef6a",
                    "EndpointID": "21781c6badbb0beb33320c6e9cb307582e60ed02050d5102f9dd21d579d1b5d9",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

可以看到容器默认使用的网络为bridge。

使用自定义网络

创建一个网络名称为mynetwork的网络:

$ docker network create mynetwork

$ docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
28e45b9b8f4b   bridge      bridge    local
29c08e905dab   host        host      local
975a764ee90c   mynetwork   bridge    local
d466db2f54a1   none        null      local

创建容器时指定网络名称:

$ docker container run -d --rm --name box3 --network=mynetwork busybox /bin/sh -c "while true; do sleep 3600; do
ne"
25ab55282fb9c132e33b67d01f14f870c0ab6cfa2c4b11245a2f865267607d05

$ docker container run -d --rm --name box4 --network=mynetwork busybox /bin/sh -c "while true; do sleep 3600; do
ne"
a8e936928386993b701c7669eb5cdfc4759749d22ab750ebdee5e6970dec2946

查询容器使用的网络名称:

[
    {
        "Id": "25ab55282fb9c132e33b67d01f14f870c0ab6cfa2c4b11245a2f865267607d05",
        。。。。。。
        "Networks": {
                "mynetwork": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "25ab55282fb9"
                    ],
                    "NetworkID": "975a764ee90c7184df5e1dccec3dd0e9b61d4277f0f64b5a7dd12d5d3bdba31c",
                    "EndpointID": "f11f396221cab0a09565175b87bf5c492dc127d11231f6c098ca7a3be018d592",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

使用自定义网络的容器之间可以使用容器的名称进行通讯,而使用默认网络的容器之间不能使用容器的名称进行通讯:

$ docker container exec -it box3 ping box4
PING box4 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.780 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.069 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.123 ms
^C
--- box4 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.069/0.324/0.780 ms

从Docker 1.10版本开始,docker daemon实现了一个内嵌的DNS server,使容器可以直接通过容器名称通信。这样,容器1和容器2可以通过它们的容器名称 “container1” 和 “container2” 进行通信,而不必记住它们的IP地址。

容器间通信的原理

查看网络的详细信息:

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "28e45b9b8f4b19c29f07c732883ccfeab6640dc37a0824b2790f6ea0b7a0ef6a",
        "Created": "2023-10-07T10:05:47.8123729+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "141723898adb64074b223d8823a4b7c8712eb405d4c1542212e09c4f17682c18": {
                "Name": "box2",
                "EndpointID": "ba6e4d32c3346cdeff733f1cb3dea2b1693db5212f8fb3c66ed9c83ea5bb0656",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "688c366577417888ad3835fa87370003c163a2a9c31ab6e109e2114b5528be6d": {
                "Name": "box1",
                "EndpointID": "21781c6badbb0beb33320c6e9cb307582e60ed02050d5102f9dd21d579d1b5d9",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

可以看到这个网络的网关地址、网段、子网掩码,以及哪些容器使用了这个网络,连接在同一个网络的容器具有相同的网段和相同的网关地址,他们之间可以通过网关地址互相通信。

可以使用命令brctl来查看操作系统中bridge的名称:

$ brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242af8acacd       no              veth4bdfd60
                                                        vethe5ed0e4

brctl使用前需要安装, 对于CentOS, 可以通过sudo yum install -y bridge-utils安装。对于Ubuntu, 可以通过sudo apt-get install -y bridge-utils

容器对外通信的原理

查看容器内的路由:

$ docker container exec -it box3 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.18.0.1      0.0.0.0         UG    0      0        0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

查看主机的路由:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.32.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.17.32.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-975a764ee90c

主机网络

在主机网络模式下,容器与主机共享网络命名空间,直接使用主机的网络接口和IP地址。容器可以通过主机网络与主机和其他容器进行通信。

主机网络模式适用于对网络性能要求较高的场景,例如需要直接访问主机上的网络资源或与主机进行高性能通信的容器。

优点

性能优势:与桥接网络相比,主机网络模式可以提供更高的网络性能,因为容器直接使用主机的网络接口,无需进行额外的网络地址转换。
简化网络配置:容器与主机共享网络命名空间,无需进行端口映射或网络转发配置。

缺点

安全性降低:容器与主机共享网络命名空间,容器可以直接访问主机上的网络资源,可能会增加安全风险。
端口冲突:如果多个容器使用相同的端口号,可能会导致端口冲突。

使用主机网络

在创建容器时,可以使用–network host参数指定使用主机网络模式。

$ docker container run --rm -it -d --name nginx --network=host nginx
121043d8367c0be214d5ac459b2890601e1013faf581b5a2ff9a9c9842c5f085

$ curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

可以看到容器内的IP和主机的IP是一致的:

$ hostname -I
172.17.35.208 172.17.0.1 172.18.0.1

$ docker container exec -it tomcat hostname -I
172.17.35.208 172.17.0.1 172.18.0.1

注意端口冲突:由于容器与主机共享网络命名空间,需要确保容器使用的端口号在主机上是唯一的。

考虑安全性:主机网络模式可能会降低容器的安全性,需要谨慎使用,并确保适当的安全措施。

无网络

在无网络模式下,容器没有网络接口,与外部网络完全隔离。这种模式适用于不需要网络连接的容器,例如批处理任务或与网络无关的应用。

注意容器需求:确保选择无网络模式的容器真正不需要进行网络通信,以避免功能受限或无法满足业务需求。

优点

安全性增强:无网络模式下的容器与外部网络完全隔离,可以提供更高的安全性。
资源节省:无网络模式下的容器不需要网络接口和IP地址,可以节省网络资源。

缺点

无法进行网络通信:容器无法与外部网络或其他容器进行通信。

使用无网络模式

在创建容器时,可以使用–network none参数指定使用无网络模式。

$ docker container run --rm -it --network=none centos bash
[root@0550683ce170 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0

可以看到容器只有一个本地回环地址。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node编写重置用户密码接口

目录 前言 定义路由和处理函数 验证表单数据 实现重置密码功能 前言 接前面文章&#xff0c;本文介绍如何编写重置用户密码接口 定义路由和处理函数 路由 // 重置密码的路由 router.post(/updatepwd, userinfo_handler.updatePassword) 处理函数 exports.updatePasswo…

网络协议--IGMP:Internet组管理协议

13.1 引言 12.4节概述了IP多播给出&#xff0c;并介绍了D类IP地址到以太网地址的映射方式。也简要说明了在单个物理网络中的多播过程&#xff0c;但当涉及多个网络并且多播数据必须通过路由器转发时&#xff0c;情况会复杂得多。 本章将介绍用于支持主机和路由器进行多播的In…

软件测试工程师怎么样面试上好的公司?

首先卖个关子&#xff0c;如果你是面试官&#xff0c;你希望招一个什么样的人进来&#xff1f; 如果这个问题搞明白了&#xff0c;那么可以说测试岗位的面试&#xff0c;就变得非常轻松了。 按照一般的惯例&#xff0c;面试官都会让你自我介绍&#xff0c;介绍你的项目经验&a…

【JAVA核心知识】深度了解MySql的innodb引擎

关键词InnoDB架构图表空间数据页顺序下数据页的存储页分裂页合并高水位排序索引构建img_v2_455d98d3-a67a-47ef-b15a-c1798de6f56g.jpg 索引优化模糊查询打断最左匹配&#xff1f;-索引下推仅能使用一个索引&#xff1f;-索引合并自适应Hash索引 AUTO_INCREMENT计数器新增语句的…

正点原子嵌入式linux驱动开发——Linux LCD驱动

LCD是很常用的一个外设&#xff0c;通过LCD可以显示绚丽的图片、界面等&#xff0c;提交人机交互的效率。STM32MP1提供了一个LTDC接口用于连接RGB接口的液晶屏。本章就来学校一下如何在Linux下驱动LCD屏。 LCD和LTDC简介 LCD简介 这里在当时学习stm32裸机开发的时候就学过了…

C++文件和流

到目前为止&#xff0c;我们已经使用了 iostream 标准库&#xff0c;它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream&#xff0c;它定义了三个新的数据类型&#x…

JavaWeb——IDEA相关配置(Maven配置以及创建自己的第一个Maven项目)

写在前面&#xff1a; 笔者根据狂神说的javaweb视频&#xff0c;一步一步跟着配置IDEA中的Maven&#xff0c;在后面&#xff0c;笔者将讲述自己如何从0配置Maven以及创建自己的第一个Maven项目&#xff0c;笔者将自己的心路历程&#xff0c;包括配置的过程&#xff0c;都以文字…

【TGRS 2023】RingMo: A Remote Sensing Foundation ModelWith Masked Image Modeling

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling, TGRS 2023 论文&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9844015 代码&#xff1a;https://github.com/comeony/RingMo MindSpore/RingMo-Framework (gitee.com) …

汽车4S店如何在数字化管理下,提高市场竞争力

在所有人都认为疫情过后&#xff0c;经济形势会一路向阳&#xff0c;但是&#xff0c;实际情况出乎所有人的意料&#xff0c;各行各业举步维艰。 新闻爆出的各大房地产&#xff0c;恒大的2.4万亿让人瞠目结舌&#xff0c;还有碧桂园和融创&#xff0c;也是债台高筑了&#xff…

嵌入式 Tomcat 调校

SpringBoot 嵌入了 Web 容器如 Tomcat/Jetty/Undertow&#xff0c;——这是怎么做到的&#xff1f;我们以 Tomcat 为例子&#xff0c;尝试调用嵌入式 Tomcat。 调用嵌入式 Tomcat&#xff0c;如果按照默认去启动&#xff0c;一个 main 函数就可以了。 简单的例子 下面是启动…

Power BI 傻瓜入门 9. 设计和部署数据模型

本章内容包含&#xff1a; 详细说明设计数据模型的技术要求Power BI Desktop中基本数据模型的设计将数据模型从Power BI Desktop发布到Power BI Services 在数据进入Power BI后对其进行操作既是一门艺术&#xff0c;也是一门科学。导入到任何应用程序中的数据不仅需要注意数据…

从力扣[203]理解递归思想

本文旨在通过使用递归方法的使用来进一步了解递归思想 class Solution {public ListNode removeElements(ListNode head, int val) {if (head null) {return head;}head.next removeElements(head.next, val);return head.val val ? head.next : head;} }既然要使用递归算法…

【golang】Go中的切片slice和操作笔记,垃圾回收机制,重组 reslice ,复制和追加,内存结构

切片 文章目录 切片将切片传递给函数make() 创建一个切片new() 和 make()的区别多维切片bytes包for-range切片重组 reslice切片的复制和追加 字符串、数组和切片的应用获取字符串的某一部分字符串和切片的内存结构修改字符串中的某个字符字节数组对比函数搜索及排序切片和数组a…

一、PHP环境搭建[phpstorm]

一、安装 1.php编写工具 地址&#xff1a;https://www.jetbrains.com/phpstorm/download/#sectionwindows 图示&#xff1a; 2.php环境 解释&#xff1a;建议使用phpstudy进行安装&#xff0c;安装较为简单 链接&#xff1a;https://www.xp.cn/ 图示&#xff1a; 二、第…

微信小程序投票管理系统:打造智能、便捷的投票体验

前言 随着社交网络的兴起和移动互联网的普及&#xff0c;人们对于参与和表达意见的需求越来越强烈。在这个背景下&#xff0c;微信小程序投票管理系统应运而生。它为用户提供了一个智能、便捷的投票平台&#xff0c;使用户可以轻松创建和参与各种类型的投票活动。本文将详细介…

【德哥说库系列】-PostgreSQL跨版本升级

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

STM32-LCD中英文显示及应用

目录 字符编码 ASCII码&#xff08;8位&#xff09; 中文编码&#xff08;16位&#xff09; GB2312标准 GBK编码 GB18030标准&#xff08;32位&#xff09; Big5编码 Unicode字符集和编码 UTF-32&#xff08;32位&#xff09; UTF-16&#xff08;16位/32位&#xff0…

[AutoSar NVM] 存储架构

依AutoSAR及公开知识辛苦整理&#xff0c;禁止转载。 专栏 《深入浅出AutoSAR》&#xff0c; 全文 2900 字. 图片来源&#xff1a; 知乎 汽车的ECU内存中有很多不同类型的变量&#xff0c;这些变量包括了车辆各个系统和功能所需的数据。大部分变量在ECU掉电后就会丢失&#x…

AI的Prompt是什么

一.AI的Prompt的作用 在人工智能&#xff08;AI&#xff09;中&#xff0c;"Prompt"通常指的是向AI系统提供的输入或指令&#xff0c;用于引导AI进行特定的操作或生成特定的输出。例如&#xff0c;在一个对话型AI系统中&#xff0c;用户输入的问题就是一个prompt&…

高校教务系统登录页面JS分析——西安科技大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…