Docker网络和overlay的基础讲解

 本人发现了两篇写的不错的文章:Docker网络 - docker network详解-CSDN博客,Docker 容器跨主机通信 overlay_docker overlay 网络-CSDN博客

 因为这两篇文章中含有大量的例子,新手看起来毫不费力。于是我偷了个小懒,在本篇文章中没有写一些例子,只写了他们没有的例子。所以本篇更像是他俩的补充。所以新手完全可以先看他俩的文章,然后再回来看一下我补充了哪些。

一:Docker网络的作用

1. 容器与外界通信
2. 容器间通讯,跨主机容器间通讯
3. 网络隔离(容器网络命名空间、子网隔离)
4. 提供网络自定义能力
5. 提供容器间发现功能
6. 提供负载均衡能力

常用的基本命令:

//连接一个容器到一个网络
docker network connect     Connect a container to a network
//创建一个网络
docker network create      Create a network
//将容器从一个网络中断开
docker network disconnect  Disconnect a container from a network
//查看网络的详细信息
docker network inspect     Display detailed information on one or more networks
//查看网络列表
docker network ls          List networks
//移除所有未使用的网络
docker network prune       Remove all unused networks
//移除一个或多个网络
docker network rm          Remove one or more network

二:网络驱动

1:bridge(网桥网络)

1. bridge是docker默认的网络驱动程序。如果没有指定驱动程序,这就是正在创建的网络类型。当应用程序在需要与同一主机上的其他容器通信的容器中运行时,通常会使用桥接网络。
2. 就联网而言,桥接网络是在网段之间转发流量的链路层设备,链路层设备Mac地址进行通信。桥接器可以是在主机内核运行的硬件设备或者软件设备。
3. 就docker而言,网桥网络为软件网桥。允许连接到同一网桥的容器进行通讯,同时提供与未连接到该网桥的容器的隔离。不同网桥上的容器无法直接通讯。
4. 启动docker时,会自动创建一个名为docker0的网桥网络,并且新启动的容器会默认连接到该网络。

a8896a40edb34c8abf4f2128a5915173.png

        网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);每个容器实例内部也有一块网卡,每个接口叫eth0;docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

2:host(主机网络)

1. Host模式,即容器网络不会与宿主机产生网络隔离,而是使用主机的网络栈,容器不会分配自己的IP地址。运行容器是所有端口映射的选项都将失效,并且在使用时产生警告信息。主机模式可以用于性能优化,因为主机模式下无需网络地址转换(NAT),并且不会为每个端口创建userland-proxy(在默认情况下,Docker使用Userland Proxy作为默认的端口转发机制。Userland Proxy基于iptables规则进行转发,将容器内部的网络流量通过宿主机上的特定端口进行转发。)
2. Host模式,仅适用于linux主机,Mac和windows主机不支持
3. docker run 或docker service create 通过指定--network host 来使用主机网络。该模式下集群节点上运行容器将受到限制(例如:容器端口为80端口,由于使用主机网络,则每个集群节点仅能运行一个80端口的容器)

3:none

如果要完全隔离容器的网络堆栈,可以在启动容器时使用--network-none标志。在容器中,只创建环回设备

4:自定义网络

1:由于创建的容器加入默认网络之后,我们的容器IP是会发生变化的,我们此时通过pingIP地址是可以PIng通的,但是为了服务方便,我们不会去记住他们的ip地址,而是通过ping他们的服务名,但是我们通过在默认网络里面,去ping服务名,是ping不通的。

        因此我们需要实现自定义的网络,因为在自定义网络里面,在同一个网络中的容器IP地址,会被自动解析。这样我们就可以通过ping服务名即可通讯。

2:我们在自定义网络的时候,我们还可以指定这个网络的网关,子网,ip,以及一些特定选项。

docker network create \
--driver=bridge \
--subnet=172.28.0.0/16 \
--ip-range=172.28.5.0/24 \
--gateway=172.28.5.254 \
--opt com.docker.network.bridge.name=alpine-net1 \            #指定网络的名称
--opt com.docker.network.bridge.enable_ip_masquerade=false \  #禁用ip伪装,造成无法访问外网
--opt com.docker.network.bridge.enable_icc=false \            #禁止容器间进行相互访问,并不代表不能进行DNS解析
--opt com.docker.network.container_iface_prefix=ethnick \     #指定网络接口的前缀
alpine-net1        #网络名称

5:container

新建的容器和已经存在的一个容器共享一个网络IP配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

三:Overlay(覆盖网络)

1:默认的overlay

1. overlay网络驱动程序在多个Docker守护进程主机之间创建分布式网络。该网络位于(覆盖)特定于主机的网络之上,允许连接到该网络的容器(包括群集服务容器)在启用加密时安全通信。Docker透明地处理每个数据包往返于正确的Docker守护进程主机和正确的目标容器的路由
2. 初始化一个swarm集群或将Docker主机加入现有swarm集群时,会在该Docker主机上创建两个新网络:
        1. 名为ingress的overlay网络,处理与swarm service相关的控制和数据流量。创建一个service没有指定自定义网络时,默认将连接到ingress网络。ingress网络提供对容器化应用程序的负载均衡和路由功能。它允许外部流量通过单一入口点访问多个容器,并根据定义的规则将请求转发到适当的后端容器
        2. 名为docker-gwbridge的bridge网络,用于将覆盖网络(包括ingress网络)连接到单个Docker守护程序的物理网络。通过这个网络,容器可以连接到宿主机
        3. 可以使用docker network create创建自定义的overlay网络,方法与创建自定义bridge网络相同。服务或容器一次可以连接到多个网络。服务或容器只能通过各自连接的网络进行通信。

1:初始化swarm集群,会默认创建 ingress 网络和 docker_gwbridge 网络:

7e7542e6c9944a10901d2c25a6da22d1.png

2:添加两个worker节点到集群

ocker swarm join-token worker

d0a966172323411f90963255baadc0c5.png

3:创建service,将加入默认ingress网络

docker service create -p 8080:80 --replicas 3 --name nginx-svc nginx:latest

9185b706570e4ca9adc9fa9592e80f16.png

4:查看ingress 网络明细

docker network inspect ingress

6a4dee25e220413cb33cadd6fa17e247.png

 

7a700fca8264451ba5e0f67c4bbd9127.png

5:查看docker_gwbridge网络详情

docker network inspect docker_gwbridge

cc5aade663dc4d26b511885b8f08406d.png

 6:查看iptables网络转发

bf6e60a6de454283b8fe3ad4a6d4abaa.png

所有发送到本机8080端口的数据被转发到172.18.0.2:8080,172.18.0.2 为docker_gwbridge 网络上ingress_sbox容器的地址,ingress_sbox实为网络命名空间并非容器,通过ingress_sbox网络命名空间连接ingress与docker_gwbridge两个设备。宿主机网络命名空间所在目录:/var/run/docker/netns

7:通过nsenter命令在ingress_sbox命名空间下运行ash 终端(nsenter是一个可以在指定进程的命令空间下运行指定程序的命令)

# 已超级权限启动容器,并在容器中以指定的命名空间运行程序
docker run -dit --rm -v /var/run/docker/netns:/netns --privileged=true \
--name alpine5 myalpine nsenter --net=/netns/ingress_sbox ash
# 与容器交互查看容器中网卡信息ifconfig
docker exec -it alpine5 ash

f4315238f026462b9abcb9299c7c5907.png

ingress_sbox网络命名空间连接了ingress网络与docker_gwbridge网络 

8:通过ipvsadm查看虚拟ip

2af65e4327254902a4fd99cc998d79fa.png

9:示意图

a4f3e7457d334a519294c219bdab0815.png

 2:自定义默认的ingress网络与docker_gwbridge网络

1:使用--ingress 标志创建overlay网络

docker network create \--driver overlay \--ingress \--subnet=10.10.0.0/16 \--gateway=10.10.0.2 \--opt com.docker.network.driver.mtu=1500 \my-ingress

2:创建新的docker_gwbridge网络

docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge

3:重新将节点加入集群

4:使用默认网络创建服务验证效果

docker service create -p 8080:80 --replicas 3 --name nginx-svc nginx:latest

5:修改了docker_gwbridge网络的worker节点上运行工具容器

# 已超级权限启动容器,并在容器中以指定的命名空间运行程序
docker run -dit --rm -v /var/run/docker/netns:/netns --privileged=true \
--name alpine5 myalpine nsenter --net=/netns/ingress_sbox ash# 与容器交互查看容器中网卡信息ifconfig
docker exec -it alpine5 ash

c92e9cc7175747dd8cc16a4e3918d167.png

3:自定义overlay网络

1:创建自定义overlay网络

docker network create -d overlay \
--attachable \
--subnet=10.12.0.0/16 \
--subnet=10.13.0.0/16 \
--gateway=10.12.0.100 \
--gateway=10.13.0.100 \
nginx-net
# -–attachable:允许集群服务间的容器交互连接或者独立的容器之间能够连接。 \
swarm在设计之初是为了service(一组container)而服务的,因此通过swarm创建的overlay网络在一开始并不支持单独的container加入其中。但是在docker1.13, \
我们可以通过“–attach” 参数声明当前创建的overlay网络可以被container直接加入。

03868874918d4eb6abba3a7b59792774.png

2:指定网络创建服务

docker service create -p 8081:80 --replicas 3 --name nginx-svc1 --network nginx-net nginx:latest

2ec0436f50fc4859a008ef8a98c435e9.png

ingress: 网络提供对容器化应用程序的负载均衡和路由功能。它允许外部流量通过单一入口点访问多个容器,并根据定义的规则将请求转发到适当的后端容器
nginx-net:自定义overlay网络,提供跨主机容器互联与跨主机通信。

3:每个服务中的任务(容器)均连接到ingress网络(提供负载与路由)与自定义overlay网络(跨节点通信)以及加入docker_gwbridge网络(容器与主机通信)

本篇的补充结束啦!0voice · GitHub

 

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

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

相关文章

C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信

1. 前言 RabbitMQ是一个流行的开源消息队列系统,支持多种消息协议,广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中,我们将熟悉如何使用C与RabbitMQ进行消息通信。 2. 准备工作 在 Windows 平台上…

vue elementui el-dropdown-item设置@click无效的解决方案

如图&#xff0c;直接在el-dropdown-item上面设置click&#xff0c;相应的method并没有被触发&#xff0c;查找资料发现需要在它的上级 el-dropdown 处使用 command 方法触发。 【template】 <el-dropdown placement"bottom-end" command"handleCommand&quo…

使用docker-compose单点搭建社区版seafile+onlyoffice在线word编辑平台

文章目录 前言一、平台介绍1. seafile平台介绍2. onlyoffice平台介绍 二、版本信息三、基础信息准备1.docker配置文件2.准备目录 四、onlyoffice部署五、seafile平台部署1.准备seafile.yaml文件2.运行平台 六、双平台对接总结 前言 记录使用docker-compose单点搭建社区版seafi…

游戏引擎学习第七天

视频参考:https://www.bilibili.com/video/BV1QFmhYcE69 ERROR_DEVICE_NOT_CONNECTED 是一个错误代码&#xff0c;通常在调用 XInputGetState 或 XInputSetState 函数时返回&#xff0c;表示指定的设备未连接。通常会出现以下几种情况&#xff1a; 未连接控制器&#xff1a;如…

计算机的错误计算(一百五十二)

摘要 探讨 MATLAB 中双曲正弦函数 sinh(x)与双曲余弦函数 cosh(x)的计算精度问题。 例1. 已知 计算 以及 直接贴图吧&#xff1a; 另外&#xff0c;16或17位的正确值分别为 0.5168712762709208e1、0.52645599648397069e1、0.2140244217618104e247 与 0.2140244217…

【C++】详解RAII思想与智能指针

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 丢掉幻想&#xff0c;准备斗争 目录 引言 内存泄漏 内存泄漏的危害 内存泄漏的处理 一、RAII思想 二、智能指针 1.auto_ptr 实现原理 模拟实现 弊端…

JDBC-Dao层模式

分层思维 分层思维是软件架构设计的一种重要思想&#xff0c;它通过将应用程序划分为多个相互独立且依赖关系的层。 通常分为以下三层关系。 web层&#xff1a;主要负责与用户进行交互&#xff0c;处理请求。 service层&#xff1a;业务逻辑层&#xff0c;主要负责处理应用程序…

三种单例实现

1、不继承Mono的单例 实现 使用 注&#xff1a; 使用需要继承BaseManager 泛型填写自己本身 需要实现无参构造函数 2、挂载式的Mono单例 实现 使用 注&#xff1a; 使用需要继承SingletonMono 泛型填写自己本身 需要挂载在unity引擎面板 3、不用挂载式的单例 实现 使…

Flink API 的层次结构

Apache Flink 提供了多层 API&#xff0c;每层 API 针对不同的抽象层次和用途&#xff0c;使得开发者可以根据具体需求选择合适的 API 层次。以下是 Flink API 的层次结构及其简要说明&#xff1a;

DHCP与DNS安全管理

一、DHCPSnooping的攻击防范功能配置&#xff08;路由器&#xff09; 1.启动设备 2.将pc设为DHCP获取IP地址 3.配置DHCP [AR1]dhcp enable //启动DHCP服务 [AR1]ip pool aaa //设置地址池 [AR1-ip-pool-aaa]network 192.168.10.0 mask 24 //设置地址范围 [AR1-ip-poo…

51c视觉~合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/11603901 #CSWin-UNet 将自注意力机制集成到UNet中&#xff01;CSWin-UNet&#xff1a;U型分割方法&#xff0c;显著提高计算效率和感受野交互&#xff01;本文提出了CSWin-UNet&#xff0c;这是一种新颖的U型分割方法&…

深度学习服务器租赁AutoDL

省钱绝招 #AutoDL #GPU #租显卡

设备接入到NVR管理平台EasyNVR多品牌NVR管理工具/设备的音视频配置参考

NVR管理平台EasyNVR是一款功能强大的安防视频监控平台&#xff0c;能够轻松实现视频流的导入、录像、存储和回放等功能。在将设备接入到海康NVR管理平台EasyNVR时&#xff0c;视音频配置是确保视频监控效果的重要步骤。本文将详细介绍如何将设备接入到EasyNVR平台&#xff0c;并…

35.3K+ Star!PhotoPrism:一款基于AI的开源照片管理工具

PhotoPrism 简介 PhotoPrism[1] 是一个为去中心化网络设计的AI照片应用,它利用最新技术自动标记和查找图片,实现自动图像分类与本地化部署,你可以在家中、私有服务器或云端运行它。 项目特点 主要特点 浏览所有照片和视频,无需担心RAW转换、重复项或视频格式。 使用强大的…

HTML之列表

练习题&#xff1a; 图所示为一个问卷调查网页&#xff0c;请制作出来。要求&#xff1a;大标题用h1标签&#xff1b;小题目用h3标签&#xff1b;前两个问题使用有序列表&#xff1b;最后一个问题使用无序列表。 代码&#xff1a; <!DOCTYPE html> <html> <he…

redis实现消息队列的几种方式

一、了解 众所周知&#xff0c;redis是我们日常开发过程中使用最多的非关系型数据库&#xff0c;也是消息中间件。实际上除了常用的rabbitmq、rocketmq、kafka消息队列&#xff08;大家自己下去研究吧~模式都是通用的&#xff09;&#xff0c;我们也能使用redis实现消息队列。…

Linux下MySQL的简单使用

Linux下MySQL的简单使用 导语MySQL安装与配置MySQL安装密码设置 MySQL管理命令myisamchkmysql其他 常见操作 C语言访问MYSQL连接例程错误处理使用SQL 总结参考文献 导语 这一章是MySQL的使用&#xff0c;一些常用的MySQL语句属于本科阶段内容&#xff0c;然后是C语言和MySQl之…

即插即用篇 | YOLOv8 引入 代理注意力 AgentAttention

Transformer模型中的注意力模块是其核心组成部分。虽然全局注意力机制具有很强的表达能力,但其高昂的计算成本限制了在各种场景中的应用。本文提出了一种新的注意力范式,称为“代理注意力”(Agent Attention),以在计算效率和表示能力之间取得平衡。代理注意力使用四元组(Q…

从0开始学PHP面向对象内容之(常用魔术方法续一)

常用魔术方法&#xff08;续&#xff09; 上期我们讲到几个常用的魔术方法&#xff0c;但是由于篇幅过程且全是文字性质地东西&#xff0c;就没写完&#xff0c;篇幅太长也会丧失阅读兴趣&#xff0c;我尽量控制一篇文章在5000字左右 一、__isset()&&__unset() 1、在…

【MySQL】数据库知识突破:数据类型全解析与详解

前言&#xff1a;本节内容讲述MySQL的数据类型&#xff0c; 我们在学习之前的建表的时候已经用过各种各样的数据类型。 比如int、varchar、char类型等等。其中它们是对表的结构的操作&#xff0c; 并没有对数据的内容进行操作&#xff0c;所以它叫做DDL。另外&#xff0c;还有…