当前位置: 首页 > news >正文

速通Docker === 网络

目录

Docker网络详解

容器之间直接通信的弊端

(一)启动容器

(二)进入容器并发起请求 

(三)请求流程

(四) 弊端分析

一、Docker网络基础

(一)容器IP分配

(二)默认网络docker0

二、自定义网络机制

(一)创建自定义网络

(二)查看Docker网络

(三)容器启动时指定自定义网络

(四)使用容器名称作为域名进行访问

三、总结



Docker网络详解

在当今的软件开发与部署领域,Docker凭借其强大的容器化技术,已成为众多开发者的得力助手。而Docker网络作为连接容器与外部世界的关键桥梁,更是至关重要。本文将深入讲解Docker网络的相关知识,帮助你更好地理解和运用这一技术。


容器之间直接通信的弊端

(一)启动容器

首先,通过以下两条命令启动了两个Nginx容器:

 docker run -d -p 88:80 --name app1 nginxdocker run -d -p 99:80 --name app2 nginx

(二)进入容器并发起请求 

接着,执行以下命令进入app1容器,并发起对http://xxx:99/的请求:(容器二)

docker exec -it app1 bash
  • docker exec 是在运行的容器中执行命令的指令。

  • -it 参数使我们能够与容器的终端进行交互。

  • bash 是要执行的命令,即启动一个bash shell。

进入容器后,执行以下命令发起请求:

curl http://xxx:99/
  • curl 是一个常用的命令行工具,用于发起网络请求。

  • http://xxx:99/ 是请求的URL,指向宿主机的99端口,即app2容器中的Nginx服务。

(三)请求流程

  1. 本地网络解析:当在app1容器中执行curl命令时,首先会通过容器内部的网络配置(如DNS设置等)对目标URL进行解析,确定目标IP地址和端口。

  2. 容器间通信:由于app1和app2都运行在同一台宿主机上,且通过Docker网络连接,请求会从app1容器的网络栈发出,经过Docker的网络桥接设备,到达app2容器。

  3. Nginx处理请求:app2容器中的Nginx服务接收到请求后,会根据其配置文件(通常位于/etc/nginx/nginx.conf)进行处理。对于默认的Nginx配置,它会返回一个欢迎页面,表明Nginx服务已成功安装并运行。

  4. 响应返回:处理完请求后,Nginx将响应数据发送回app1容器,app1容器的curl命令会接收到响应内容并显示在终端上。

(四) 弊端分析

  • 跨容器通信:虽然app1和app2容器运行在同一台宿主机上,但它们之间的通信需要经过Docker的网络桥接设备。这相比直接在宿主机上进行进程间通信,会增加一定的网络性能开销。数据需要在容器的虚拟网络接口之间传输,经过网络协议栈的处理,这可能会导致延迟增加和吞吐量降低。

  • 端口映射:通过宿主机的端口映射访问容器服务时,Docker需要在宿主机的网络栈中进行端口转发。这个过程会增加网络数据包的处理时间,尤其是在高并发请求场景下,可能会成为性能瓶颈。

  • IP地址变化:Docker容器的IP地址可能会发生变化。如果在容器之间通过IP地址进行通信,每次IP地址变化时,都需要更新相关的配置文件或代码,这会增加维护成本。例如,如果app2容器的IP地址发生变化,app1容器中的请求URL也需要相应地进行修改,否则会导致请求失败。

一、Docker网络基础

(一)容器IP分配

Docker为每个容器分配了唯一的IP地址,使得容器之间可以通过IP地址加端口的方式进行互相访问。例如,当我们在同一台宿主机上运行多个容器时,每个容器都会获得一个独立的IP,如172.17.0.2、172.17.0.3等。这种IP分配机制使得容器之间的通信变得更加直观和便捷。然而,需要注意的是,由于容器的动态性以及Docker网络的配置变化等原因,这些IP地址可能会发生变化,这就给容器之间的稳定通信带来了一定的挑战。

(二)默认网络docker0

当每个应用启动时,Docker会自动将其加入到一个名为docker0的默认网络中。docker0是一个虚拟的以太网桥,它在宿主机上创建了一个网络接口,并为连接到它的容器提供网络连接服务。我们可以通过执行ip addr命令来查看docker0的相关信息,如下所示:

6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:63:90:8e:52 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:63ff:fe90:8e52/64 scope link

IPv4 vs IPv6

IPv4

  • 格式:由4组数字组成,每组数字范围是0-255,用点号隔开,比如“192.168.1.1”。就像一个4位的“数字密码锁”,每一位有256种可能的数字。

  • 数量:总共大约有43亿个地址。可以想象成一个有43亿个房间的大楼,每个房间有一个独特的房间号(即IP地址),早期互联网设备较少时够用,但随着设备越来越多,房间就不够住了。

IPv6

  • 格式:由8组数字或字母组成,每组有4个字符,用冒号隔开,比如“2001:0db8:85a3:0000:0000:8a2e:0370:7334”。它就像一个8位的“密码锁”,每一位可以是数字0-9或字母a-f,组合方式更多。

  • 数量:地址数量极其庞大,理论上可以提供约3.4×10^38个地址。就好像有无数个宇宙,每个宇宙都有无数个星球,每个星球上都有无数个房间,每个房间都有一个独特的IPv6地址,几乎不用担心地址会用完,能够满足未来大量设备接入互联网的需求。

子网掩码 vs ip

在IP地址中,每个数字(0-255)实际上是8位二进制数。IPv4地址由4个这样的数字组成,总共是32位。例如,IP地址“172.17.0.1”可以转换为二进制表示为:

10101100.00010001.00000000.00000001

每个数字(0-255)对应8位二进制数。所以,“172.17”在二进制中表示为:

10101100.00010001

这16位二进制数就是网络部分,表示这个IP地址属于“172.17”这个网络。剩下的16位二进制数(“00000000.00000001”)是主机部分,用于标识网络中的不同设备。

因此,“172.17.0.1/16”中的“/16”表示前16位是网络部分,后16位是主机部分。具体来说:

  • 网络部分:10101100.00010001(即“172.17”)

  • 主机部分:00000000.00000001(即“0.1”)

这样,整个网络的IP地址范围是“172.17.0.0”到“172.17.255.255”,因为主机部分可以是“0.0”到“255.255”。

子网掩码

  • 作用:用于区分IP地址中的网络部分和主机部分。在IPv4地址中,子网掩码长度为16位,意味着前16位是网络地址,后16位是主机地址。

  • 具体解释

    • 网络地址:前16位“172.17”是网络地址,表示该IP地址属于“172.17”这个网络。在这个网络中,所有IP地址的前16位都是相同的,即“172.17”。

    • 主机地址:后16位“0.1”是主机地址,用于标识网络中的不同设备。在这个网络中,主机地址的范围是“0.0”到“255.255”,即“172.17.0.0”到“172.17.255.255”。

  • 例子

    • IP地址:172.17.0.1

    • 子网掩码:255.255.0.0(等同于16位)

    • 网络地址:172.17.0.0

    • 主机地址:0.1

总结

  • 子网掩码长度16位表示IP地址的前16位是网络部分,后16位是主机部分。在这个例子中,“172.17”是网络地址,“0.1”是主机地址,整个网络的IP地址范围是“172.17.0.0”到“172.17.255.255”。

从上述信息中,我们可以看到docker0的IP地址为172.17.0.1,子网掩码为16位,这表明它管理着172.17.0.0/16这个网段的IP地址分配。同时,我们还可以通过执行docker [container] inspect <image name>命令来查看容器的详细信息,包括其所属网络的配置。在Networks配置项中,我们可以找到网关(Gateway)和IP地址(IPAddress)等关键信息,如下所示:

docker [container] inspect <image name>

"Networks": {"bridge": {  // 表示该容器使用的网络模式为桥接模式"IPAMConfig": null,  // IP地址管理配置,此处为空表示使用默认配置"Links": null,  // 容器之间的连接配置,此处为空表示没有特殊连接"Aliases": null,  // 容器在网络中的别名,此处为空表示没有设置别名"MacAddress": "02:42:ac:11:00:02",  // 容器的MAC地址"DriverOpts": null,  // 网络驱动选项,此处为空表示使用默认驱动选项"NetworkID": "af5288f6a00acbba4577b5e2d80414344ee55254b663fafa1bc60713252ac088",  // 网络的唯一标识符"EndpointID": "3c2530d77688b6be17e4ec6499716d0d946f4dcec6cfbf5738b665823880f047",  // 容器在网络中的端点标识符"Gateway": "172.17.0.1",  // 网关地址,即容器访问外部网络的中转站地址"IPAddress": "172.17.0.2",  // 容器的IP地址"IPPrefixLen": 16,  // IP地址的子网掩码长度,此处表示子网掩码为255.255.0.0"IPv6Gateway": "",  // IPv6网关地址,此处为空表示未配置IPv6网关"GlobalIPv6Address": "",  // 全局IPv6地址,此处为空表示未配置全局IPv6地址"GlobalIPv6PrefixLen": 0,  // 全局IPv6地址的前缀长度,此处为0表示未配置"DNSNames": null  // DNS名称,此处为空表示没有设置DNS名称}
}

 扫盲专区 

网关与IP简介

  • IP地址:就像我们每个人的身份证号码一样,IP地址是网络中设备的唯一标识。在这个例子中,“172.17.0.2”就是该容器在所在网络中的“身份证号码”,通过这个地址,网络中的其他设备就可以找到并和它进行通信。

  • 网关:可以理解为一个“中转站”。当容器想要访问外部网络(比如互联网)时,它会先把数据发送到“172.17.0.1”这个网关地址,然后网关会负责把数据转发到外部网络。简单来说,网关就像是一个桥梁,帮助容器从内部网络走向外部世界。

二、自定义网络机制

为了克服默认网络docker0在稳定性和灵活性方面的不足,Docker提供了自定义网络机制。通过创建自定义网络,我们可以更好地管理和控制容器之间的通信,实现更加稳定和高效的网络访问。

(一)创建自定义网络

创建自定义网络非常简单,只需执行以下命令:

docker network create <network_name>

例如,我们可以创建一个名为mynet的自定义网络:

docker network create mynet

执行该命令后,Docker会自动创建一个新的网络,并为其分配一个唯一的网络ID。

(二)查看Docker网络

要查看所有已创建的Docker网络,可以使用以下命令:

docker network ls

该命令会列出所有网络的名称、ID、驱动程序等信息,方便我们进行管理和查询。

(三)容器启动时指定自定义网络

在启动容器时,我们可以通过--network参数指定容器加入到某个自定义网络中。例如:

docker run -d -p 88:80 --name app1 --network mynet nginx

该命令会启动一个名为app1的Nginx容器,并将其加入到mynet自定义网络中。通过这种方式,我们可以将多个容器组织到同一个网络中,实现它们之间的稳定通信。

(四)使用容器名称作为域名进行访问

当容器加入到自定义网络后,我们可以使用容器的名称作为域名进行访问。例如,假设我们有两个容器app1和app2,它们都加入了mynet自定义网络。我们可以在app1容器中执行以下命令来访问app2容器:

docker exec -it app1 bash
root@411c92f75eb1:/# curl http://app2:80

通过这种方式,我们可以实现容器之间的稳定通信,而无需关心容器IP地址的变化。这大大提高了容器网络的可管理性和可维护性。

三、总结

Docker网络是容器化技术中的重要组成部分,它为容器之间的通信提供了强大的支持。通过了解Docker网络的基础知识,如容器IP分配和默认网络docker0,我们可以更好地理解容器的网络连接机制。而自定义网络机制则为我们提供了更加灵活和稳定的网络管理方式,通过创建自定义网络、指定容器加入网络以及使用容器名称作为域名进行访问,我们可以实现容器之间的高效通信,满足各种复杂的网络需求。掌握Docker网络的相关知识,将有助于我们在软件开发和部署过程中更加得心应手地运用Docker技术,提高开发效率和系统稳定性。

相关文章:

速通Docker === 网络

目录 Docker网络详解 容器之间直接通信的弊端 &#xff08;一&#xff09;启动容器 &#xff08;二&#xff09;进入容器并发起请求 &#xff08;三&#xff09;请求流程 &#xff08;四&#xff09; 弊端分析 一、Docker网络基础 &#xff08;一&#xff09;容器IP分配…...

【MySQL — 数据库基础】深入解析MySQL常用数据类型

常用数据类型 创建完数据库之后&#xff0c;就要在数据库中创建表&#xff0c;表中存储的数据记录&#xff0c;一条记录由不同的列组成&#xff0c;每条列都需要自己的类型&#xff1b;并且表中的多个行对应的列的数据类型&#xff0c;都必须是相同的&#xff1b; 那么每个…...

Linux高级--3.3.1 C++ spdlog 开源异步日志方案

一、基本介绍 spdlog 是由 Gustav S. 在 2015 年开发的一个高性能 C 日志库。开发这个库的主要目的是为了提供一个非常快速、轻量、易于使用的日志工具&#xff0c;特别适合需要高性能、低延迟日志记录的 C 应用程序。&#xff08;由于源码现在比较难下载&#xff0c;我把压缩…...

电梯系统的UML文档05

Dispatcher 不控制实际的电梯组件&#xff0c;但它在软件系统中是重要的。每一个电梯有一个ispatcher&#xff0c;主要功能是计算电梯的移动方向、移动目的地以及保持门的打开时间。它和系统中除灯控制器以外的几乎所有控制对象交互。 安全装置也是一个环境对象&#xff0c;它…...

如何使 LLaMA-Factory 支持 google/gemma-2-2b-jpn-it 的微调

如何使 LLaMA-Factory 支持 google/gemma-2-2b-jpn-it 的微调 追加&#xff0c; "Gemma-2-2B-JPN-Instruct": {DownloadSource.DEFAULT: "google/gemma-2-2b-jpn-it",},修改 constants.py&#xff0c; vi ./src/llamafactory/extras/constants.py---"…...

MySQL中日期和时间戳的转换:字符到DATE和TIMESTAMP的相互转换

在MySQL中&#xff0c;经常需要在 DATE、TIMESTAMP 和字符串之间进行相互转换。以下是一些常见的转换方法&#xff1a; 1. 字符串到日期/时间类型 字符串转 DATE: 使用 STR_TO_DATE() 函数将字符串转换为 DATE 类型。你需要提供字符串的格式。 SELECT STR_TO_DATE(2024-08-24,…...

HarmonyOS NEXT开发进阶(十):UIAbility 组件交互

文章目录 一、前言二、启动应用内的 UIAbility三、启动应用内的UIAbility并获取返回结果四、启动其他应用的UIAbility五、启动其他应用的 UIAbility 并获取返回结果六、启动 UIAbility 的指定页面6.1 调用方 UIAbility 指定启动页面6.2 目标 UIAbility 首次启动6.3 目标UIAbili…...

深入探索Math.NET:开启高效数值计算之旅

一、引言 在当今数字化时代&#xff0c;数值计算已然成为科学研究、工程设计、金融分析等众多领域的核心驱动力。从探索宇宙奥秘的物理学计算&#xff0c;到优化建筑结构的土木工程设计&#xff0c;再到预测市场趋势的金融建模&#xff0c;数值计算的身影无处不在&#xff0c;…...

AI编程工具横向评测--Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发

AI编程工具横向评测–Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发 数据分析类应用的开发&#xff0c;指的是首先进行数据分析&#xff0c;比如统计学分析、机器学习模型的构建等&#xff0c;然后将分析的流程开发成数据分析类的工具&#xff0c;或者将数据分…...

【2024 CSDN博客之星】技术洞察类:从DeepSeek-V3的成功,看MoE混合专家网络对深度学习算法领域的影响(MoE代码级实战)

目录 一、引言 1.1 本篇文章侧重点 1.2 技术洞察—MoE&#xff08;Mixture-of-Experts&#xff0c;混合专家网络&#xff09; 二、MoE&#xff08;Mixture-of-Experts&#xff0c;混合专家网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场…...

Linux——入门基本指令汇总

目录 1. ls指令2. pwd3. whoami指令4. cd指令5. clear指令6. touch指令7. mkdir指令8. rm指令9. man指令10. cp指令11. mv指令12. cat指令13. tac指令14. more指令15. less指令16. head指令17. tail指令18. date指令19. cal指令20. find指令21. which指令22. alias指令23. grep…...

54,【4】BUUCTF WEB GYCTF2020Ezsqli

进入靶场 吓我一跳&#xff0c;但凡放个彭于晏我都不说啥了 提交个1看看 1 and 11 1# 还尝试了很多&#xff0c;不过都被过滤了&#xff0c;头疼 看看别人的WP 竟然要写代码去跑&#xff01;&#xff01;&#xff01;&#xff0c;不会啊&#xff0c;先用别人的代码吧&#xf…...

【Leetcode 热题 100】45. 跳跃游戏 II

问题背景 给定一个长度为 n n n 的 0 0 0 索引 整数数组 n u m s nums nums。初始位置为 n u m s [ 0 ] nums[0] nums[0]。 每个元素 n u m s [ i ] nums[i] nums[i] 表示从索引 i i i 向前跳转的最大长度。换句话说&#xff0c;如果你在 n u m s [ i ] nums[i] nums[i…...

C/C++ 时间复杂度(On)

定义&#xff1a; 在计算机科学中&#xff0c;时间复杂性&#xff0c;又称时间复杂度&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述&#xff0c;不包括这个函数的低…...

【STM32-学习笔记-10-】BKP备份寄存器+时间戳

文章目录 BKP备份寄存器Ⅰ、BKP简介1. BKP的基本功能2. BKP的存储容量3. BKP的访问和操作4. BKP的应用场景5. BKP的控制寄存器 Ⅱ、BKP基本结构Ⅲ、BKP函数Ⅳ、BKP使用示例 时间戳一、Unix时间戳二、时间戳的转换&#xff08;time.h函数介绍&#xff09;Ⅰ、time()Ⅱ、mktime()…...

React 中hooks之 React.memo 和 useMemo用法总结

1. React.memo 基础 React.memo 是一个高阶组件&#xff08;HOC&#xff09;&#xff0c;用于优化函数组件的性能&#xff0c;通过记忆组件渲染结果来避免不必要的重新渲染。 1.1 基本用法 const MemoizedComponent React.memo(function MyComponent(props) {/* 渲染逻辑 *…...

日志收集Day001

1.ElasticSearch 作用&#xff1a;日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml&#xff08;这里yy做了别名&#xff0c;过滤掉空行和注释行&#xff09; yy /etc/el…...

机器人“大脑+小脑”范式:算力魔方赋能智能自主导航

在机器人技术的发展中&#xff0c;“大脑小脑”的架构模式逐渐成为推动机器人智能化的关键。其中&#xff0c;“大脑”作为机器人的核心决策单元&#xff0c;承担着复杂任务规划、环境感知和决策制定的重要角色&#xff0c;而“小脑”则专注于运动控制和实时调整。这种分工明确…...

python程序跑起来后,然后引用的数据文件发生了更新,python读取的数据会发生变化吗

在 Python 程序运行过程中&#xff0c;如果引用的数据文件被更新&#xff0c;程序能否读取到更新后的数据&#xff0c;取决于以下几个因素&#xff1a; 1. 是否动态读取文件 如果 Python 程序在运行过程中动态读取文件&#xff08;例如通过循环或定时机制反复打开文件读取&…...

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...