Docker:Docker网络

 Docker Network 是 Docker 平台中的一项功能,允许容器相互通信以及与外界通信。它提供了一种在 Docker 环境中创建和管理虚拟网络的方法。Docker 网络使容器能够连接到一个或多个网络,从而使它们能够安全地共享信息和资源。

预备知识

推荐先看视频先有个大概的了解,再对比视频或文章进行动手操作

【入门篇】Docker网络模式Linux - Bridge | Host | None_哔哩哔哩_bilibili

什么是 Network Namespace?

网络命名空间 (Network Namespace): 网络命名空间是 Linux 内核提供的一种网络隔离机制。它就像是为每个容器创建了一个独立的网络环境。

  • 每个容器都有自己的网络命名空间。主机也有一个默认的网络命名空间。
  • 隔离性: 每个网络命名空间有自己的网络设备、IP 地址、路由表、防火墙规则等。
  • 独立性: 在一个命名空间中的变更不会影响其他命名空间。
  • 灵活性: 允许在同一台主机上运行多个相互隔离的网络环境。

什么是 veth-pair?

veth-pair (Virtual Ethernet Device Pairs): veth 是 "虚拟以太网设备" 的缩写。它总是成对出现,像是一根虚拟的网线,连接不同的网络命名空间。

  • 工作原理: veth 对的两端分别位于不同的网络命名空间。从一端发送的数据包会立即出现在另一端。
  • 用途: 主要用于连接不同的网络命名空间,使它们能够通信。
  • 在 Docker 中的应用:
    • 一端连接到容器的网络命名空间。
    • 另一端连接到主机的默认命名空间(通常通过 docker0 网桥)。

namespace 和 veth 如何协同工作

VETH 想象成一根网线。一端连接到主机网络,另一端连接到创建的网络命名空间。让我们连接电缆,并打开这些接口。通过接下来的步骤,我们将会理解容器都在自己的网络环境中运行,为什么可以方便地与其他容器和外部网络进行通信。

a. 容器创建: b. veth 对创建: c. 网络连接: d. 通信过程:

  • Docker 为新容器创建一个新的网络命名空间。
  • 在这个命名空间中创建一个虚拟网络接口(如 eth0)。
  • Docker 创建一对 veth 设备。
  • 一端(如 veth1)被移动到容器的命名空间,并可能被重命名为 eth0。
  • 另一端(如 veth0)保留在主机的默认命名空间,并连接到 docker0 网桥。
  • 容器内的 eth0 通过 veth 对连接到主机上的 docker0 网桥。
  • docker0 网桥充当虚拟交换机,连接所有容器。
  • 容器间通信: 数据从一个容器的 eth0 经过 veth 对到达 docker0,再通过另一个 veth 对到达目标容器。
  • 容器与外部通信: 数据经过 veth 对到达 docker0,然后通过主机的网络接口(如 eth0)发送到外部网络。

通过这种方式,Docker 能够在提供强大网络功能的同时,实现了容器网络的隔离性和互联性。这为微服务架构和复杂的分布式系统提供了坚实的网络基础。

demo:在容器启动默认网络驱动

图中显示了lo(回环接口)和eth0(是我ES2的主网卡)的信息,其中docker0接口是允许不同容器之间以及容器与宿主机之间的网络通信,注意state DOWN

Docker 引擎的每次安装都会自动包含三个默认网络。bridge,host,none

此时检查网络驱动bridge信息

docker network inspect bridge

运行容器示例,观察不同之处

docker run -itd --name=networktest ubuntu


Docker网络驱动

让我们把Docker网络驱动想象成不同类型的道路系统,这样可能更容易理解。

Bridge网络(默认模式)

小方框代表不同的容器。底部的线代表Docker0网桥,连接所有容器。

 想象这是一个小区内部的道路系统。每个容器就像小区里的一栋房子,它们通过这个内部道路系统相互连接。对于大多数单机应用,Bridge网络就足够了。它提供了良好的隔离性和易用性。

Host网络

大方框表示直接使用主机的网络栈。 这就像直接把房子建在主干道上。容器直接使用宿主机的网络,没有任何隔离。这种模式性能最好,但安全性较低。

Overlay网络

两个椭圆形代表不同主机上的网络。连接线表示跨主机通信。 这就像不同城市之间的高速公路,允许不同物理机器上的容器通信。

把这个想象成不同城市之间的高速公路网络。它允许不同物理机器上的Docker容器进行通信,就像它们在同一个网络中一样。这对于构建跨多台服务器的分布式系统非常有用。

Macvlan网络

小方框代表拥有独立MAC地址的容器。底部的线代表物理网络。 

这就像给每个房间都分配了一个独立的门牌号(MAC地址)。每个容器都可以直接连接到物理网络,就像是网络上的一个独立设备。这在某些需要直接访问物理网络的特殊场景中很有用。

None网络

这相当于一个没有任何道路连接的孤岛。容器完全与网络隔离,不能进行任何网络通信。这在一些特殊的安全要求下可能会用到。

使用场景

选择合适的网络驱动时,需要考虑以下因素:

  • 应用的架构和通信需求
  • 性能要求
  • 安全性和隔离级别
  • 部署环境(单主机vs多主机)
  • 可扩展性需求
  • 特定的网络功能需求(如负载均衡、服务发现等)
  1. Bridge 网络:
    • 最常用的网络驱动,适合大多数单主机部署场景。
    • 理想用于开发和测试环境,因为它提供了良好的隔离性和易用性。
    • 适合部署独立的Web应用、数据库服务或微服务组件。
    • 当需要在同一主机上运行多个相互隔离的应用时,Bridge网络是最佳选择。
  2. Host 网络:
    • 当网络性能是首要考虑因素时使用,如高性能计算或网络密集型应用。
    • 适用于需要访问主机网络栈的特权容器,如网络监控工具或安全扫描器。
    • 在需要直接访问主机网络接口的场景中非常有用,如某些网络管理工具。
    • 但要注意,由于缺乏网络隔离,使用Host网络时需要格外小心安全性。
  3. Overlay 网络:
    • 在构建跨多个Docker主机的分布式应用时是理想选择。
    • 非常适合微服务架构,允许服务在不同主机间无缝通信。
    • 在Docker Swarm集群环境中广泛使用,提供了内置的服务发现和负载均衡。
    • 适用于需要高可用性和水平扩展的大规模应用部署。
  4. Macvlan 网络:
    • 当容器需要在物理网络上表现为独立设备时使用。
    • 适用于网络设备模拟或虚拟化网络功能(NFV)场景。
    • 在需要直接暴露容器到外部网络的情况下很有用,如特定的网络安全要求。
    • 对于需要绕过Docker网络栈以获得最佳性能的场景也很适合。
  5. None 网络:
    • 用于需要完全网络隔离的特殊安全场景。
    • 适合需要自定义网络栈的高级用户。
    • 在某些特定的沙箱环境或安全敏感的应用中可能会用到。
    • 也可用于创建不需要网络连接的数据处理或计算密集型容器。

Docker Bridge 工作原理

a. 网桥(Bridge): Docker在安装时会创建一个名为docker0的网桥。这个网桥充当虚拟交换机,
所有容器都连接到这个交换机上,实现容器间的网络通信。

b. veth-pair: 当创建容器时,Docker会创建一对虚拟接口(veth pair)。一端连接到容器内部,
另一端连接到docker0网桥。这就像用一根虚拟网线将容器和网桥连接起来。

c. IP地址分配: Docker会从预定义的网段中为每个容器分配一个IP地址。这相当于给每个
"房间"(容器)分配一个独特的门牌号,便于识别和通信。

d. 端口映射: 如果需要从外部访问容器内的服务,需要进行端口映射。这类似于在大楼的总机上
设置分机,让外部可以直接与特定的"房间"(容器)通信。

e. NAT(网络地址转换): Docker使用NAT机制允许容器访问外部网络。当容器发起对外连接时,
Docker会将容器的私有IP地址转换为主机的IP地址。

f. DNS服务: Docker提供内置的DNS服务,允许容器通过名称相互发现和通信。这在使用自定义
网络或部署多容器应用时特别有用。

g. iptables规则: Docker自动管理iptables规则,用于处理NAT、端口映射和网络隔离。这些
规则确保了容器网络的安全性和正确路由。


Overlay网络的工作原理

  1. VXLAN封装: Overlay网络主要使用VXLAN(Virtual Extensible LAN)技术。VXLAN在原始的以太网帧外部添加一个VXLAN头,然后封装在UDP包中。
  2. 网络标识: 每个Overlay网络都有一个唯一的网络ID(VXLAN Network Identifier, VNI),用于区分不同的虚拟网络。
  3. VTEP(VXLAN Tunnel Endpoint): 每个Docker主机上运行一个VTEP。它负责封装和解封装VXLAN数据包。
  4. 分布式控制平面: Docker Swarm使用一个分布式数据库(通常是etcd或Consul)来存储网络拓扑信息。
  5. 数据包传输流程: a. 源容器发送数据包 b. 本地VTEP封装数据包(添加VXLAN头) c. 封装后的包通过物理网络传输 d. 目标主机的VTEP接收并解封装数据包 e. 数据包传递给目标容器

现在让我详细解释Overlay网络的跨主机通信原理:

  1. 网络设置:
    • 每个Docker主机上都运行一个Overlay网络(图中橙色区域)。
    • 每个主机上都有一个VTEP(VXLAN Tunnel Endpoint,图中紫色方框)。
  2. 容器通信过程: a. 源容器(容器1)发送数据包到目标容器(容器2)。 b. 数据包首先到达本地Overlay网络。 c. VTEP接收到数据包,并进行VXLAN封装:
    • 添加VXLAN头,包含VNI(VXLAN Network Identifier)。
    • 将整个包封装在UDP数据包中。 d. 封装后的数据包通过物理网络传输(图中红色底部区域)。 e. 目标主机的VTEP接收到数据包,进行解封装。 f. 解封装后的原始数据包通过目标主机的Overlay网络传递给目标容器。
  3. VXLAN封装:
    • 图中间的方框显示了VXLAN封装的结构。
    • VXLAN头包含VNI,用于标识特定的Overlay网络。
    • 原始以太网帧被封装在VXLAN包内。
  4. 网络发现和路由:
    • Docker Swarm使用分布式数据存储(如etcd)来维护网络拓扑信息。
    • 每个VTEP知道如何将数据包路由到其他主机上的容器。
  5. 优势:
    • 隔离性:不同Overlay网络之间完全隔离。
    • 可扩展性:可以支持大量的网络和容器。
    • 跨数据中心:可以在不同物理位置的主机之间创建Overlay网络。
  6. 性能考虑:
    • VXLAN封装会带来一些性能开销。
    • 在高性能要求的场景中,可能需要考虑网络优化。

Overlay网络的这种机制使得Docker容器能够在不同的物理主机之间进行透明通信,就像它们在同一个本地网络中一样。这为构建大规模、分布式的容器应用提供了强大的基础。

实际应用中,Overlay网络常用于:

  • 微服务架构中服务之间的通信
  • 跨数据中心的应用部署
  • 大规模容器编排(如使用Kubernetes或Docker Swarm)

Docker自定义网络

注意:前面的内容是原理理解就行,这里可能是最常用的了。

Docker自定义网络就像是在一个大型办公楼里创建专属的部门局域网。每个网络就像一个独立的楼层或区域,有自己的规则和特点。

网络驱动类型: 想象不同类型的办公区域布局

a) Bridge(桥接): 最常用,就像标准的办公楼层。

b) Overlay(覆盖): 类似于跨多个办公楼的虚拟专用网络。

c) Host(主机): 直接使用主机网络,像是直接在大楼的主网络上工作。

d) Macvlan: 给容器自己的MAC地址,就像给每个员工独立的网络设备。

e) None: 没有网络,类似于隔离的私密办公室。

创建自定义网络: 就像规划和设置新的办公区域。 

docker network create --driver bridge my_network

网络隔离: 每个自定义网络就像一个独立的楼层,默认情况下彼此隔离。 不同网络的容器就像在不同楼层工作的员工,需要特殊通道才能互相通信。

自动DNS解析: 在自定义网络中,容器可以通过名称相互访问,就像在办公室里直接叫同事名字。 例如:ping container_name 就能工作,不需要知道IP地址。

IP地址管理: Docker会为每个加入网络的容器分配IP,就像给新员工分配工位。 可以指定IP范围:--subnet 192.168.1.0/24

连接容器到网络

a) 创建时连接:docker run --network my_network ...

b) 已存在的容器连接: 这就像是把员工分配到特定的办公区或让他们进入新的项目组。

docker network connect my_network container_name

断开网络连接: 类似于临时将员工调离某个项目组。

 docker network disconnect my_network container_name

网络别名: 可以给容器在特定网络中指定别名,就像给员工在不同项目中使用不同的代号。

docker network connect --alias db my_network container_name

自定义网络的优势

a) 更好的隔离性:不同项目组之间不互相干扰。

b) 自动服务发现:容器可以通过名字互相找到,不需要记忆复杂的IP。

c) 更安全:可以控制哪些容器可以相互通信。

d) 动态管理:可以随时添加或移除容器,就像员工加入或离开项目组。

跨主机网络: 使用Overlay网络,可以让不同物理机器上的容器通信,就像不同办公楼之间建立专用通道。

网络配置: 可以设置网络的各种参数,例如MTU(最大传输单元)、网关等,就像调整办公网络的各种设置。

查看网络信息: 这就像查看办公区域的详细平面图和人员分布。

docker network inspect my_network

实际应用例子:

  1. 多层应用:前端容器在一个网络,后端容器在另一个网络,数据库容器在第三个网络。
  2. 微服务:每个微服务可以有自己的网络,只有需要通信的服务之间建立连接。
  3. 开发环境:可以为不同的开发项目创建隔离的网络环境

docker网络联通

思考:为了连接到网络,计算机必须至少具有一个网络接口。每个网络接口必须有自己唯一的 IP 地址。提供给主机的 IP 地址将分配给其网络接口。但是每个网络接口都需要一个 IP 地址吗?

当我们将一个容器连接到多个网络时,它会获得多个IP地址。为什么呢?

解释:

  1. 默认网络: 当一个容器被创建时,除非另有指定,它会自动连接到默认的"bridge"网络,并获得一个IP地址。
  2. 自定义网络: 当我们将容器连接到一个自定义网络时,它会在这个新网络中获得另一个IP地址。
  3. 多网络连接: 一个容器可以同时连接到多个网络,每个网络中都会有一个唯一的IP地址。
  4. 网络隔离: 每个网络都是相互隔离的。容器在一个网络中的IP地址对其他网络是不可见的。
  5. 路由: 容器内部会有多个网络接口,每个对应一个连接的网络。

工作原理:

  1. 默认连接:容器创建时自动连接到默认bridge网络,获得172.17.0.2 IP地址。
  2. 自定义网络连接:使用 docker network connect 命令将容器连接到自定义网络。容器在新网络中获得另一个IP地址(172.18.0.2)。
  3. 多网络接口:容器内部创建新的网络接口(eth1)来处理新网络连接。
  4. 路由:容器操作系统负责管理这些网络接口和路由决策。
  5. 网络隔离:每个网络都是独立的,容器在一个网络中的通信不会影响其在另一个网络中的通信。
  6. 灵活性:这种设计允许容器同时参与多个网络环境,增加了网络配置的灵活性。

优势:

  1. 网络隔离:可以将容器连接到多个隔离的网络环境。
  2. 微服务架构:支持复杂的微服务部署,允许服务在不同网络中扮演不同角色。
  3. 安全性:可以通过网络分离来增强安全性,例如将数据库容器连接到后端网络,而不暴露给前端网络。
  4. 灵活配置:允许在不中断服务的情况下动态调整容器的网络连接。

这种多网络连接的能力使Docker容器能够适应复杂的网络拓扑需求,为现代分布式系统的部署提供了强大的支持。


参考

https://docs.docker.com/network/

https://docs.docker.com/engine/tutorials/networkingcontainers/

https://medium.com/techlog/diving-into-linux-networking-and-docker-bridge-veth-and-iptables-a05eb27b1e72

37、网络连通_哔哩哔哩_bilibili

https://mostafizur99.medium.com/connecting-containers-with-vxlan-overlay-networks-mastering-multi-container-host-networking-a72cc561c098

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

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

相关文章

SQL Server 2022 中的 Tempdb 性能改进非常显著

无论是在我的会话中还是在我写的博客中,Tempdb 始终是我的话题。然而,当谈到 SQL Server 2022 中引入的重大性能变化时,我从未如此兴奋过。他们解决了我们最大的性能瓶颈之一,即系统页面闩锁并发。 在 SQL Server 2019 中&#x…

Go语言--复合类型之map、结构体

map Go 语言中的 map(映射、字典)是一种内置的数据结构,它是一个无序的 key-value 对的集合,比如以身份证号作为唯一键来标识一个人的信息。 格式 map [keyType]valueType 在一个 map 里所有的键都是唯一的,而且必须是支持和!操作符的类型…

Git仓库介绍

1. Github GitHub 本身是一个基于云端的代码托管平台,它提供的是远程服务,而不是一个可以安装在本地局域网的应用程序。因此,GitHub 不可以直接在本地局域网进行安装。 简介:GitHub是最流行的代码托管平台,提供了大量…

【MySQL】4.MySQL 的数据类型

MySQL 的数据类型 一.数据类型分类在这里插入图片描述二.注意点1.char VS varchar2.datetime VS timestamp3.enum 和 set 的使用方法 一.数据类型分类 二.注意点 1.char VS varchar char 的意义是直接开辟固定大小的空间,浪费磁盘空间,但是效率高varcha…

孟德尔随机化与痛风3

写在前面 检索检索,刚好发现一篇分区还挺高,但结果内容看上去还挺熟悉的文章,特记录一下。 文章 Exploring the mechanism underlying hyperuricemia using comprehensive research on multi-omics Sci Rep IF:3.8中科院分区:2区 综合性期…

基于ESP32 IDF的WebServer实现以及OTA固件升级实现记录(三)

经过前面两篇的前序铺垫,对webserver以及restful api架构有了大体了解后本篇描述下最终的ota实现的代码以及调试中遇到的诡异bug。 eps32的实际ota实现过程其实esp32官方都已经基本实现好了,我们要做到无非就是把要升级的固件搬运到对应ota flash分区里面…

数据结构之“队列”(全方位认识)

🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 前言 上期博客介绍了” 栈 “这个数据结构,他具有先进后出的特点。本期介绍“ 队列 ”这个数据结构,他具有先进先出的特点。 目录…

通信协议_C#实现自定义ModbusRTU主站

背景知识:modbus协议介绍 相关工具 mbslave:充当从站。虚拟串口工具:虚拟出一对串口。VS2022。 实现过程以及Demo 打开虚拟串口工具: 打开mbslave: 此处从站连接COM1口。 Demo实现 创建DLL库,创建ModbusRTU类,进行实现: using Syste…

【JVM-04】线上CPU100%

【JVM-04】线上CPU100% 1. 如何排查2. 再举一个例子 1. 如何排查 ⼀般CPU100%疯狂GC,都是死循环的锅,那怎么排查呢?先进服务器,⽤top -c 命令找出当前进程的运⾏列表按⼀下 P 可以按照CPU使⽤率进⾏排序显示Java进程 PID 为 2609…

轻松驾驭开发之旅:Maven配置阿里云CodeUp远程私有仓库全攻略

文章目录 引言一、为什么选择阿里云CodeUp作为远程私有仓库?二、Maven配置阿里云CodeUp远程私有仓库的步骤准备工作配置Maven的settings.xml文件配置项目的pom.xml文件验证配置是否成功 三、使用阿里云CodeUp远程私有仓库的注意事项 引言 在软件开发的世界里&#…

Golang | Leetcode Golang题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; func shortestPalindrome(s string) string {n : len(s)fail : make([]int, n)for i : 0; i < n; i {fail[i] -1}for i : 1; i < n; i {j : fail[i - 1]for j ! -1 && s[j 1] ! s[i] {j fail[j]}if s[j 1] s[i] {fail[i…

uni-appx,实现登录功能,弹窗功能。组件之间传值

这篇文章的内容使用组合式API实现的&#xff0c;只有弹窗部分有选择式API的写法介绍。如果想要看其他选择式API&#xff0c;还请下载官方的hello-uni-appx源码进行学习&#xff0c;查看。想要看组合式API的写法&#xff0c;请查看源码 hello-uvue。 hello-uni-appx源码 相比于…

MybatisX插件的简单使用教程

搜索mybatis 开始生成 module path&#xff1a;当前项目 base package:生成的包名&#xff0c;建议先独立生成一个&#xff0c;和你原本的项目分开 encoding&#xff1a;编码&#xff0c;建议UTF-8 class name strategy&#xff1a;命名选择 推荐选择camel&#xff1a;驼峰命…

PD虚拟机不能复制Mac的文件怎么回事 PD虚拟机不能复制Mac的文件怎么办 Parallels Desktop怎么用

PD虚拟机不仅能提供跨系统协作的服务&#xff0c;还能进行虚拟机系统与原生系统间的文件共享、文本复制、文件复制等操作&#xff0c;让系统间的资源可以科学利用。但在实际操作过程中&#xff0c;PD虚拟机不能复制Mac的文件怎么回事&#xff1f;PD虚拟机不能复制Mac的文件怎么…

Java项目:基于SSM框架实现的共享客栈管理系统分前后台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的共享客栈管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

CosyVoice - 阿里最新开源语音克隆、文本转语音项目 支持情感控制及粤语 本地一键整合包下载

近日&#xff0c;阿里通义实验室发布开源语音大模型项目FunAudioLLM&#xff0c;而且一次包含两个模型&#xff1a;SenseVoice和CosyVoice。 CosyVoice专注自然语音生成&#xff0c;支持多语言、音色和情感控制&#xff0c;支持中英日粤韩5种语言的生成&#xff0c;效果显著优于…

【JavaSE复习】数据结构、集合

JavaSE 复习 1.数据结构1.1 查找1.1.1 基本查找1.1.2 二分查找1.1.3 插值查找1.1.4 斐波那契查找1.1.5 分块查找1.1.6 分块查找的扩展&#xff08;无规律数据&#xff09; 1.2 排序1.2.1 冒泡排序1.2.2 选择排序1.2.3 插入排序1.2.4 快速排序 2. 集合2.1 基础集合2.1.1 集合和数…

53-1 内网代理3 - Netsh端口转发(推荐)

靶场还是用上一篇文章搭建的靶场 :52-5 内网代理2 - LCX端口转发(不推荐使用LCX)-CSDN博客 一、Netsh 实现端口转发 Netsh是Windows自带的命令行脚本工具,可用于配置端口转发。在一个典型的场景中,如果我们位于公网无法直接访问内网的Web服务器,可以利用中间的跳板机通过…

设计模式探索:责任链模式

1. 什么是责任链模式 责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下&#xff1a; 避免将一个请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&…

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致&#xff08;Inconsistent&#xff09;状态 2.2.日志式文件系统&#xff08;Journaling filesystem&#xff09; 3.Linux文件系统的运行 4、文件的删…