docker网络原理笔记

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

docker 网络,使用的是CNM 网络模型方案。 libnetwork是对CNM的实现, 提供docker核心网络架构的全部功能

Docker的网络子系统是可插拔的,使用驱动程序。默认情况下存在多个驱动程序,并提供核心网络功能:

bridge:默认网络驱动程序。如果未指定驱动程序,则这是您要创建的网络类型。当您的应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。
host:对于独立容器,删除容器和Docker主机之间的网络隔离,并直接使用主机的网络。host 仅适用于Docker 17.06及更高版本的swarm服务
overlay:覆盖网络将多个Docker守护程序连接在一起,并使群集服务能够相互通信。您还可以使用覆盖网络来促进群集服务和独立容器之间的通信,或者在不同Docker守护程序上的两个独立容器之间进行通信。此策略消除了在这些容器之间执行OS级别路由的需要。
macvlan:Macvlan网络允许您为容器分配MAC地址,使其显示为网络上的物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan 在处理期望直接连接到物理网络的传统应用程序时,使用驱动程序有时是最佳选择,而不是通过Docker主机的网络堆栈进行路由。

none:对于此容器,禁用所有网络。通常与自定义网络驱动程序一起使用。none不适用于群组服务

  1. 单机桥接:

linux Docker 创建单机桥接网络采用内置的桥接驱动,而 Windows Docker 创建时使用内置的 NAT 驱动

在Linux 上网络名称为 bridge

查看:

[root@docker1 docker]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5c3bb6e979f5        bridge              bridge              local
3f3eb1511ddd        host                host                local
3db9e188251c        none                null                local

查看详情:

[root@docker1 docker]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "5c3bb6e979f54af8e7001a9a8d35647a657cb8fb7d610180214b782fb28bb9b2",
        "Created": "2019-08-10T05:10:14.092819245-04: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,
         ....
         ....
[root@docker1 docker]# docker network inspect bridge | grep bridge.name
            "com.docker.network.bridge.name": "docker0",
[root@docker1 docker]# 

可以看到默认情况 brige网络映射到 docker0

查看网桥:

brctl 工具来查看系统中的 Linux 网桥

[root@docker1 docker]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02421fadc487       no              veth99d9308
[root@docker1 docker]# 

端口映射允许将某个容器端口映射到docker主机端口上

  1. Macvlan

为容器提供 MAC 和 IP 地址 ,将容器直接与物理网络连接:
在这里插入图片描述

macvlan需要将物理网络设置为混杂模式, 即网络需要配置为trunck模式

接入物理网络需要在网络上进行打标签
在这里插入图片描述

将容器连接到vlan100的网络上,为其打上目标 VLAN 网络对应的 ID

Docker Swarm 支持两种服务发布模式,两种模式均保证服务从集群外可访问。

  • Ingress模式(默认), 可以通过集群内任意一个node节点访问容器服务。
  • Host模式, 只能是运行容器副本的该node节点才能访问容器服务。

区别图:
在这里插入图片描述

Ingress 模式采用名为 Service Mesh 或者 Swarm Mode Service Mesh 的四层路由网络来实现

在这里插入图片描述

如果容器服务存在多个副本,则流量会被平均分发到不同的副本上

在这里插入图片描述

覆盖网络:

Docker 支持覆盖网络, 基于 Libnetwork 和驱动进行实现, docker也提供Overlay原生驱动支持

原理:

Docker 使用 VXLAN 隧道技术创建了虚拟二层覆盖网络

VXLAN 的设计中,允许用户基于已经存在的三层网络结构创建虚拟的二层网络

在前面的示例中创建了一个子网掩码为 10.0.0.0/24 的二层网络,该网络是基于一个三层 IP 网络实现的,三层 IP 网络由 172.31.1.0/24 和 192.168.1.0/24 这两个二层网络构成
在这里插入图片描述

VXLAN 的美妙之处在于它是一种封装技术,能使现存的路由器和网络架构看起来就像普通的 IP/UDP 包一样,并且处理起来毫无问题。

为了创建二层覆盖网络,VXLAN 基于现有的三层 IP 网络创建了隧道。小伙伴可能听过基础网络(Underlay Network)这个术语,它用于指代三层之下的基础部分。

VXLAN 隧道两端都是 VXLAN 隧道终端(VXLAN Tunnel Endpoint, VTEP)。VTEP 完成了封装和解压的步骤,以及一些功能实现所必需的操作,如下图所示。
在这里插入图片描述

每个主机运行了一个容器,之后又为容器连接创建了一个 VXLAN 覆盖网络。

为了实现上述场景,在每台主机上都新建了一个 Sandbox(网络命名空间)。正如前文所讲,Sandbox 就像一个容器,但其中运行的不是应用,而是当前主机上独立的网络栈。

在 Sandbox 内部创建了一个名为 Br0 的虚拟交换机(又称做虚拟网桥)。同时 Sandbox 内部还创建了一个 VTEP,其中一端接入到名为 Br0 的虚拟交换机当中,另一端接入主机网络栈(VTEP)。

在主机网络栈中的终端从主机所连接的基础网络中获取到 IP 地址,并以 UDP Socket 的方式绑定到 4789 端口。不同主机上的两个 VTEP 通过 VXLAN 隧道创建了一个覆盖网络,如下图所示。
在这里插入图片描述

每个容器都会有自己的虚拟以太网(veth)适配器,并接入本地 Br0 虚拟交换机。目前拓扑结构如下图所示,虽然是在主机所属网络互相独立的情况下,但这样能更容易看出两个分别位于不同主机上的容器之间是如何通过 VXLAN 上层网络进行通信的。

在这里插入图片描述

示例:

将 node1 上的容器称为 C1,node2 上的容器称为 C2,如下图所示。假设 C1 希望 ping 通 C2

在这里插入图片描述

C1 发起 ping 请求,目标 IP 为 C2 的地址 10.0.0.4。该请求的流量通过连接到 Br0 虚拟交换机 veth 接口发出。虚拟交换机并不知道将包发送到哪里,因为在虚拟交换机的 MAC 地址映射表(ARP 映射表)中并没有与当前目的 IP 对应的 MAC 地址。

所以虚拟交换机会将该包发送到其上的全部端口。连接到 Br0 的 VTEP 接口知道如何转发这个数据帧,所以会将自己的 MAC 地址返回。这就是一个代理 ARP 响应,并且虚拟交换机 Br0 根据返回结果学会了如何转发该包。接下来虚拟交换机会更新自己的 ARP 映射表,将 10.0.0.4 映射到本地 VTEP 的 MAC 地址上。

现在 Br0 交换机已经学会如何转发目标为 C2 的流量,接下来所有发送到 C2 的包都会被直接转发到 VTEP 接口。VTEP 接口知道 C2,是因为所有新启动的容器都会将自己的网络详情采用网络内置 Gossip 协议发送给相同 Swarm 集群内的其他节点。

交换机会将包转发到 VTEP 接口,VTEP 完成数据帧的封装,这样就能在底层网络传输。具体来说,封装操作就是把 VXLAN Header 信息添加以太帧当中。

VXLAN Header 信息包含了 VXLAN 网络 ID(VNID),其作用是记录 VLAN 到 VXLAN 的映射关系。每个 VLAN 都对应一个 VNID,以便包可以在解析后被转发到正确的 VLAN。

封装的时候会将数据帧放到 UDP 包中,并设置 UDP 的目的 IP 字段为 node2 节点的 VTEP 的 IP 地址,同时设置 UDP Socket 端口为 4789。这种封装方式保证了底层网络即使不知道任何关于 VXLAN 的信息,也可以完成数据传输。

当包到达 node2 之后,内核发现目的端口为 UDP 端口 4789,同时还知道存在 VTEP 接口绑定到该 Socket。所以内核将包发给 VTEP,由 VTEP 读取 VNID,解压包信息,并根据 VNID 发送到本地名为 Br0 的连接到 VLAN 的交换机。在该交换机上,包被发送给容器 C2。

《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第1章docker基础(1.5-1.9) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。 阅读详情

相关推荐

Docker篇】深入理解Docker网络原理,理解Docker0,自定义网络网络连通

文章目录Docker网络原理1. Linux veth pair2. 理解Docker03. 容器互联--Link4. 自定义网络(推荐)5. 网络连通6. 总结 Docker网络原理 在前面的文章中跟大家说到了容器是相对独立的环境,相当于一个小型的Linux系统,外界无法直接访问,那他是怎么做的呢,这里我们先了解下Linux veth pair。 1. Linux veth pair veth pair是成对出现的一种虚拟网络设备接口,一端连着网络协议栈,一端彼此相连。如下图所示: veth pair

weixin_45842494的博客 5674

Docker——网络原理

直接使用bridge模式,是无法支持指定IP运行docker的,例如执行以下命令就会报错 docker run -itd --name test1 --network bridge --ip 172.17 .0.10 nginx:latest /bin/bash。

weixin_67300995的博客 1502

Docker 网络原理

本篇是第七部分“网络篇”的第八篇。在这个部分,我会为你由浅入深的介绍 Docker 网络相关的内容。包括 Docker 网络基础及其实现和内部原理等。上篇,我为你介绍了 Docker 内部 DNS 的原理,本篇,我们来总结下 Docker 网络原理Docker 网络相关的原理及实践,在前面我已经基本都为大家介绍到了。本篇,对这些内容做下总结,以及扩展。 我们知道 Docker 支持多种...

k8s 生态 254

Docker网络原理

前言 Docker有4种网络通信模型,分别是:bridge、host、none、container,默认使用的网络模型是bridge,本文中用到的也是bridge网络模型 本文分享Docker网络原理,主要包含三部分内容: 容器之间通信 容器访问外网 外部访问容器 1、前置网络知识 1)、veth pair veth是虚拟以太网卡(Virtual Ethernet)的缩写。veth设备总是成对的,因此称之为veth pair。veth pair一端发送的数据会在另外一端接收。根据这一特性,veth pa

hxt的博客 4886

非常干!聊聊几种主流Docker网络的实现原理

一、容器网络简介容器网络主要解决两大核心问题:一是容器的IP地址分配,二是容器之间的相互通信。本文重在研究第二个问题并且主要研究容器的跨主机通信问题。实现容器跨主机通信的...

1693

Docker网络的核心概念:CNM、libnetwork和host驱动

本文是Docker网络高级实战指南,重点介绍隔离网络、检查路由表和自定义网络驱动的技术。我们将深入探讨Docker网络的核心概念,例如容器网络模型(CNM)和libnetwork,并通过一系列实际示例展示如何配置和管理Docker网络

Lion_Long的博客 1729

Docker 网络深度详解(从原理到实战)

手动创建(),本质是独立的docker0网桥;内置DNS 解析,容器间可通过「容器名 / 别名」直接互通(核心优势);不同自定义网络隔离,互不干扰(比如项目 A 和项目 B 用不同网络);支持动态添加 / 移除容器。# 1. 创建自定义网络# 2. 启动 Tomcat(不暴露端口,仅容器内访问)# 3. 启动 Nginx(暴露80端口,配置反向代理到 Tomcat)# 4. 进入 Nginx 容器,修改配置(代理到 tomcat-web:8080)# 编辑配置文件echo '

returnthem的博客 311

Docker】学习笔记03:DockerFile、Docker网络原理

Docker】学习笔记03:DockerFile、Docker网络原理DockerFile概述DockerFile构建过程DockerFile的指令实战实战测试1:(构建一个自己的centos镜像,添加官方centos镜像中没有的命令)实战测试2:(构建一个tomcat镜像)Docker网络原理理解Docker 0自定义网络网络连通实战:部署Redis集群SpringBoot微服务打包Docker镜像 DockerFile 概述 dockerfile 是用来构建docker镜像的文件,是命令参数脚本 构建

danggang0317的博客 351

Docker网络原理笔记

初识Docker网络 Docker中所有的网络接口都是虚拟的。虚拟的转发效率高~! 通过"–link"命令建立两个容器间网络相互连通 –link 原理就是我们在hosts配置中增加一个 IP tomcat02 容器ID hosts映射 自定义网络配置 自定义网络可以通过容器名ping通,不使用"–link",自定义网络已经帮我们维护好了对应的关系,推荐使用自定义网络配置 Docker容器和网络进行连通: 假设要跨网络操作别人,就需要使用docker network connect 连通 .

顾鸢的博客 153

Docker 学习笔记(九):Docker 网络原理,理解 docker0,虚拟网卡,容器互联,以及跨网络连通

本文介绍了 Docker 网络原理,介绍了 docker0,Veth-pair 技术,以及 Docker 给容器分配虚拟网卡的方式。同时讲述了两种容器互联的方式,分别是 Link 和 自定义网络。还有容器之间跨网络连通的方式。

积累,沉淀,温故而知新 2527

基于《狂神说Java》Docker--学习笔记

笔记仅做学习与复习使用,不存在刻意抄袭。参考于学友小瓦匠学编程。给各位学友强烈推荐《遇见狂神说》他的整套Java学习路线使我获益匪浅!!!

wudidahuanggua的博客 1194

Docker学习笔记

docker 理念回顾将应用和环境打包成一个镜像文件!数据?如果把数据放到容器里面,容器删除之后数据也就丢失了,想办法将容器里面的数据保存在宿主机上面:数据持久化。宿主机和容器之间实现数据共享的技术,docker 容器中产生的数据,同步到本地。将容器内的目录挂载到宿主机上。容器的持久化和同步操作,容器间也可以数据共享!使用数据卷方式一:使用命令挂载 -vdocker run -it -v 主机目录:容器目录#测试#查看容器元数据# 里面找到 Mounts 这个对象里面显示的就是我们挂载的内容。

qq_35778042的博客 887

狂神说docker学习笔记2020

狂神说docker学习笔记2020 文章目录狂神说docker学习笔记2020一 Docker概述(1)Docker的作用一 Docker的安装(1)Docker的基本组成(1)Docker的安装(2)卸载docker(3)docker 镜像的配置二 Docker run流程和Docker原理Docker的常用命令(1) 帮助命令(2) 镜像命令(3)容器命令(4) 其他容器命令(4) 小结(全部基础命令)四 Docker安装练习1 安装Nginx2 安装Nginx 安装 tomcat3 部署ES +

weixin_43691773的博客 3270

阿里不传之密的Java架构速成笔记被我搞到手了,竟有七大专题,1425页考点这么详细

前言 我们都知道,在程序员的职业生涯中,有多个发展方向,不过就数据表明,近年来选择架构师方向的开发人员也越来越多。 对于架构师的发展前途,我相信是已经没有争议的,但这个“概念”对于很多开发人员来说,并没有太清晰的认识,怎样才能成为架构师,是很多程序员心里的疑问。 所以,就架构师需要掌握的技术来说,我们特此整理一份Java架构速成笔记分享给你,包含七大专题,共1425页经典考点,希望吃透后的你能够轻松挑战P8岗。 以下会展示「Java架构速成笔记」的大致内容及部分截图,篇幅有限,需完整pdf版的帮忙

文章中资料均可获取,有需要请添加yunduoa2019即可 109

面试面经|华为月入35k的Java架构师,他是如何做到的

不论是技术经理还是架构师,没有绝对地说哪条路是对还是错,适合自己才是最重要。小公司的可能没有架构师这个概念,大公司的架构师职位又不是那么容易拿下。但不管怎样,不断去学习新的技术,提升自己的层次是很有必要的,无论你在哪一家公司,过硬的技术水平才能吃得开。希望通过我这份Jaav架构面试复盘笔记,能够对你有所帮助。...

Q54665642ljf的博客 341

八、DockerDocker网络原理

八、Docker网络原理 解决的问题:docker如何处理容器之间的网络访问 测试 # 一、查看本宿主机的 ip addr [root@kk ~]# 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.

诸葛小猿 2348

Docker--Docker网络原理

=虚拟网卡(Virtual Network Interface,简称vNIC) 是一种在软件层面模拟的网卡设备,不依赖于物理硬件,而是通过操作系统或虚拟化技术实现网络通信功能。==它允许计算机在虚拟环境中模拟物理网卡的行为,用于连接虚拟网络或与物理网络交互。

m0_74068921的博客 9243

有了这篇 Docker 网络原理,彻底爱了~

Docker 网络原理容器是相对独立的环境,相当于一个小型的 Linux 系统,外界无法直接访问,那他是怎么做的呢,这里我们先了解下 Linux veth pair。1. Linux veth pairveth pair 是成对出现的一种虚拟网络设备接口,一端连着网络协议栈,一端彼此相连。如下图所示:veth pair将两个网络veth0和veth1连通。2. 理解Docker0我们先查看本地ip...

架构师小秘圈 271
上一篇: docker api url调用
下一篇: kvm虚拟化及cpu内存调优学习笔记(一)
comprel
博客等级 码龄10年 70粉丝 132原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值