速通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技术,提高开发效率和系统稳定性。

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

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

相关文章

Kafka 日志存储 — 日志索引

每个日志分段文件对应两个索引文件&#xff1a;偏移量索引文件用来建立消息偏移量到物理地址之间的映射&#xff1b;时间戳索引文件根据指定的时间戳来查找对应的偏移量信息。 1 日志索引 Kafka的索引文件以稀疏索引的方式构造消息的索引。它并不保证每个消息在索引文件中都有…

空调可视化监控与管理系统

随着智能化技术的不断发展&#xff0c;空调系统作为现代建筑、工业和商业场所的核心设备&#xff0c;正在从传统管理模式向智能化管理迈进。无论是大型商业楼宇、工业厂房&#xff0c;还是数据中心的精密空调&#xff0c;如何通过智能监控和高效管理降低能耗、提升运行效率&…

3.3 OpenAI GPT-4, GPT-3.5, GPT-3 模型调用:开发者指南

OpenAI GPT-4, GPT-3.5, GPT-3 模型调用:开发者指南 OpenAI 的 GPT 系列语言模型,包括 GPT-4、GPT-3.5 和 GPT-3,已经成为自然语言处理领域的标杆。无论是文本生成、对话系统,还是自动化任务,开发者都可以通过 API 调用这些强大的模型来增强他们的应用。本文将为您详细介…

用户中心项目教程(五)---MyBatis-Plus完成后端初始化+测试方法

文章目录 1.数据库的链接和创建2.建库建表语句3.引入依赖4.yml配置文件5.添加相对路径6.实体类的书写7.Mapper接口的定义8.启动类的指定9.单元测试10运行时的bug 1.数据库的链接和创建 下面的这个就是使用的我们的IDEA链接这个里面的数据库&#xff1a; 接下来就是输入这个用户…

Azure Synapse Dedicated SQL Pool实用命令语句

一、数据管理相关命令 1. 数据加载 COPY 命令&#xff1a;用于从外部存储&#xff08;如 Azure Blob 存储&#xff09;加载数据到 Dedicated SQL Pool 中。 COPY INTO [dbo].[target_table] FROM https://<storage_account>.blob.core.windows.net/<container>/…

products页面出现多选框后,能够直接将勾选的products删除吗?而不用跳转到flow再删除。例如将勾选的products传给flow

在标准的「Opportunity Products」(机会产品) 相关列表上&#xff0c;Salesforce 并不直接支持多选后一次性删除的功能。如果你想要在“同一页面”直接勾选然后删除&#xff0c;而不跳转到单独的 Flow 界面&#xff0c;通常需要借助自定义开发的方式来实现。下面给你几种可行的…

AI软件栈:中间表示

概念 编译器通常可以分为前端、优化器和后端三个部分中间表示属于变异过程中表达源程序的方法,作为单独的表示语言。将不同的前端语言(例如C、python、Java等)描述转换为中间表示。优化器对中间表示进行转换和优化,输出新的中间表示。后端将优化后的中间表示转换为特定硬件…

C++:深入理解const_iterator的应用

在 C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;迭代器&#xff08;iterator&#xff09;是操作容器的重要工具&#xff0c;用于在容器的元素上进行遍历或操作。const_iterator 是迭代器的一种&#xff0c;用于只读访问容器中的元素&#xff0c;而不能修改它们的值…

LeetCode hot 力扣热题100 二叉树的最大深度

class Solution { public:int maxDepth(TreeNode* root) {if (root nullptr) {return 0;}int l_depth maxDepth(root->left);int r_depth maxDepth(root->right);return max(l_depth, r_depth) 1;} }; 代码作用 该函数通过递归计算二叉树的最大深度&#xff08;从根节…

Mysql InnoDB B+Tree是什么?

“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线&#xff0c;将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…

MATLAB基础应用精讲-【数模应用】粒子群与遗传算法相结合(PSO-GA)应用(附MATLAB代码实现)

目录 前言 几个高频面试题目 遗传算法、粒子群优化算法和强化学习对比 1 遗传算法(Genetic Algorithm, GA) 2 粒子群优化算法(Particle Swarm Optimization, PSO) 3 强化学习(Reinforcement Learning, RL) 4 遗传算法、粒子群优化算法和强化学习在智能方面的比较。…

对人型机器人的研究和展望

目录 概述 1 核心软硬件部件 1.1 运动控制部分 1.1.1 减速机 1.1.2 编码器 1.1.3 直流无刷电机 1.2 智能仿生手 1.3 控制板卡 2 人型机器人的应用 3 未来展望 概述 如果现在有人问&#xff1a;当前那个行业最火&#xff1f;毫无疑问答案肯定是人型机器人了。当前各类机…

Flask:后端框架使用

文章目录 1、介绍2、demo演示3、Flask请求和响应 3.1 演示demo3.2 request获取请求体数据3.3 requests发送请求3.4 响应返回和接收 4、特殊路由 4.1 路由重定向4.2 路由拦截器 1、介绍 Flask是由python语言编写的轻量级Web应用框架&#xff0c;主要应用于后端框架&#xff…

递归算法学习v2.3

目标和 设置全局变量&#xff1a; class Solution {int ret,path,aim;public int findTargetSumWays(int[] nums, int target) {aim target;dfs(nums,0);return ret;}public void dfs(int[] nums,int pos){if(pos nums.length){if(path aim){ret ;}return;}path nums[pos…

红黑树封装map和set(c++版)

前言 在前面&#xff0c;我们介绍了c中map和set库的使用&#xff0c;也实现了一颗简单的红黑树。那么现在我们就利用这两部分的知识&#xff0c;实现一个简单的myMap和mySet。 源码阅读 在我们实现之前&#xff0c;我们可以阅读一些标准库的实现&#xff0c;学习标准库的实现…

Windows 服务程序实现鼠标模拟

cpp #include <windows.h> #include <fstream> #include <string> #include <tchar.h> #include <thread> #include <vector> #define SERVICE_NAME _T("MouseSimulationService") // 全局变量 SERVICE_STATUS g_Servi…

ui设计公司分享:浅色 UI 设计

在数字化产品琳琅满目的今天&#xff0c;用户对于界面的要求早已不止于功能的实现&#xff0c;更追求一种舒适、无压的交互体验。而浅色UI设计&#xff0c;凭借其独特的魅力&#xff0c;正逐渐成为众多设计师营造优质体验的首选。 一、浅色UI设计的视觉优势 &#xff08;一&a…

Nacos:使用PgSQL数据源

数据源插件开源仓库地址&#xff1a;nacos-datasource-extend-plugins 一、PostgreSQL数据库安装 1、本文使用Docker进行数据库的安装&#xff0c;使用docker命令拉取的PG14版本的数据库&#xff1a; docker pull postgres:14.6 2、创建PG容器并启动&#xff0c;映射了5432…

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…

C语言之装甲车库车辆动态监控辅助记录系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 &#xff08;一&#xff09;…