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

Docker 网络-单机版

Docker 网络的理论基础

本章节主要是要理解网络的理论,实际操作的内容并不多。

Network Namespace

Docker 网络的底层原理是Linux的Network Namespace。

Network Namespace 是 Linux 内核提供的,用于实现网络虚拟化的重要功能。
它能创建多个隔离的网络空间,每个独立的网络空间内的防火墙、网卡、路由表、邻居表、协议栈等都是独立的。
不管是虚拟机还是容器,当运行在独立命名空间是,就像是一台单独的主机

CNM

CNM : Container Network Model : 容器网络模型。
是一种网络连接的解决方案,是一种设计规范、设计标准,它规定了Docker网络的基础组成要素。
它定义了三个基本要素 : 沙盒Sandbox终端Endpoint网络Network

1、沙盒 : 一个独立的网络栈,其中包括以太网接口、端口号、路由表、DNS配置等。Linux 的 Network Namespace 是沙盒的标准实现。

2、终端 : 虚拟网络接口,主要负责创建连接,即将沙盒链接到网络上。一个终端只能接入某一个网络。

3、网络 : 802.1d(就是一个标准) 网桥的软件实现,是需要交互的终端的集合。

Libnetwork

CNM 是设计规范,而 Libnetwork 是开源的、由 Go 语言编写的、跨平台的 CNM 的 标准实现。
LIbnetwork 除了实现了 CNM 的三个组件外,还实现了本地服务发现、容器负载均衡、以及网络控制层与管理层的功能。

Driver

每种不同的网络类型都有对应的不同的底层Driver,这些Driver负责在主机上真正实现需要的网络功能,例如 veth-pair 设备等。
不过,无论哪种网络类型,其工作方式都是类似的:
1) 通过调用Docker引擎的API发出请求;
2)由Libnetwork 做出框架性的处理;
3)将请求转发给相应的Driver。

通过 docker network ls 命令可以查看当前主机所连接的网络及网络类型。

在这里插入图片描述

补充-Linux 中的常用网络命令

ip address 命令

可以简写 为 ip addrip a

作用 : 查看、添加和删除网络接口的 IP 地址信息。

【查看所有网络接口的IP地址信息】:
ip address show or ip address or ip addr or ip a
作用和ifconfig命令效果一样

【查看某个网络的IP地址信息】:
ip address show eth0 : eth0 就是网络接口

【添加一个IP到某个网络接口】:
ip address add 192.168.1.100/24 dev eth0 :

  • [add] : 表示添加,后面跟着的就是 IP 地址 & 子网掩码
  • [dev] : 是关键字,device 的缩写,后面的 eth0 是 网络接口设备。

【删除某个网络接口的IP】:
ip address delete 192.168.1.100 dev eth0 :

  • [delete] : 表示删除,可以简写为 [del]。

ip link 命令

作用 :查看、启用、禁用网络接口以及修改一些接口级别的设置。

【查看所有网络接口及状态】:
ip link show

【查看特定网络接口的信息】:
ip link show eth0

【启用某个网络接口】:
ip link set dev eth0 up

【禁用某个网络接口】:
ip link set dev down

【给网络接口分配命名空间】:
ip link set veth0 netns NamespaceName

【添加 veth 对 (虚拟网络接口对)】 - 关键:
veth 对是成对出现的虚拟网络接口,数据发送到其中一个接口会从另一个接口接收,反之亦然。
就相当于一根网线。veth 对可以连接不同的 Namespace ,实现两个网络的互联互通。

命令ip link add veth0 type veth peer name veth1
【这行命令做了以下几件事】:
1)创建了一个名为 veth0 的虚拟网络接口。
2)创建了一个名为 veth1 的虚拟网络接口,它是 veth0 的对端。
3)将这两个接口配对,使得它们之间可以直接通信。

【删除veth 对】:
ip link delete veth0
会自动的删除另一个与之配对的网络端口。

ip netns 命令

作用 : 是一个管理和操作网络命名空间(network namespaces)的命令。

【查看所有的网络命名空间】:
ip netns list

【添加一个网络命名空间】:
ip netns add namespace-name

【删除一个网络命名空间】:
ip netns delete namespace-name

【在特定的网络命名空间中执行命令】:
ip netns exec namespace-name xxxxx
[xxxxx] 表示要执行的命令,例如 ip address add … 等操作网络的命令。

brctl 命令

使用前安装一下 :yum install -y bridge-utils

作用】 :
brctl 是一个用于 Linux 系统中管理以太网桥接接口的命令行工具

  • 它允许用户创建、维护和检查 Linux 内核中的以太网桥(bridge),从而实现网络流量在多个网络接口之间的转发,就像它们连接到同一个物理交换机一样。
  • 这对于需要在同一台机器上实现网络隔离或构建复杂的网络拓扑结构特别有用,比如在虚拟化环境、容器网络等场景中。

【查看所有的网桥】
brctl show

【新增/删除 一个网桥】
新增 : brctl addbr bridge-name
删除 : brctl delbr bridge-name

【添加/删除 接口到网桥】
添加 :brctl addif bridge-name interface-name
删除 :brctl delif bridge-name interface-name

实践-对Network Namespace 的理解

需求描述

通过手动创建两个Network Namespace,并 分别创建对应的 IP地址,创建虚拟网络接口对,能够相互ping通。
表示两个网络能够正常访问。以此来体会 网络命名空间的实际作用。

网络拓扑简图

在这里插入图片描述

实际操作

创建两个命名空间

ip netns add ns1
ip netns add ns2

创建虚拟网络接口 veth pair

如果想要让两个网络命名空间连通,则需要用到虚拟设备接口技术 veth pair。该技术需要一对网络接口分别置于两个命名空间中。
【创建网络接口对】 :ip link add veth-ns1 type veth peer name veth-ns2
【查看网络接口对】 :ip link show : 具有MAC地址、不具有IP、状态为 DOWN

把网络接口分配给命名空间

ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2

分配完成后,可以在命名空间下查看对应的接口:
ip netns exec ns1 ip address : 在 ns1 中执行 ip address 命令,查看网络信息。

给网络命名空间分配IP

【给两个命名空间中的 各自的网络端口 添加IP】
ip netns exec ns1 ip address add 192.168.1.100/24 dev veth-ns1
ip netns exec ns2 ip address add 192.168.1.200/24 dev veth-ns2

启用网络端口

【将两个命名空间中的 各自的端口状态置成 up】
ip netns exec ns1 ip link set dev veth-ns1 up
ip netns exec ns2 ip link set dev veth-ns2 up

测试连通性

【分别在命名空间中 ping 另一个命名空间的IP】
ip netns exec ns1 ping 192.168.1.200
ip netns exec ns2 ping 192.168.1.100

以上,两个端口互相能够 ping 通,证明我们手动创建的两个网络通了。

Docker中常用的网络命令

查看网络

  • 列出所有的网络docker network ls
  • 查看指定网络的详细信息docker network inspect bridge[网络名称]

创建一个新的bridge类型的网络
docker network create -d bridge networkName
[-d bridge] 表示指定网络的类型为 bridge

将现有容器连接到某个网络
docker network connect networkName containerName

将容器从网络中断开连接
docker network disconnect networkName containerName

创建容器时即指定网络】
docker run --name containerName --network networkName ... image:tag ...
[--network networkName] 表示容器要加入的网络

删除网络
docker network rm networkName

bridge 网络

Docker Bridge 网络是 Docker 默认的网络驱动。当你安装 Docker 时,它会自动创建一个名为 docker0 的桥接网络,这是一种虚拟以太网桥只能用于转发配置在同一宿主机上的不同 Docker 容器之间的数据包。

基本概念

【Bridge 网络】:* 默认情况下,Docker 使用 bridge 驱动来创建一个私有的内部网络,* 该网络允许在同一个宿主机上运行的容器相互通信。
【docker0】:* 这是 Docker 在安装时自动创建的一个桥接网络接口,* 所有使用默认 bridge 网络的新建容器都会连接到这个网络,并通过它进行通信。
【IP 地址分配】:* Docker 会为每个连接到默认 bridge 网络的容器分配一个 IP 地址。* 这些 IP 地址是从一个预定义的私有地址池中分配出来的。

特性

【自动配置】:Docker 自动处理大多数配置细节,包括创建和管理 docker0 网桥、为容器分配 IP 地址等。
【隔离性】:默认情况下,不同的 Docker 主机上的容器即使位于相同的 IP 地址范围内也不会相互干扰,因为它们彼此间是完全隔离的。
【端口映射】:为了使外部网络能够访问容器内的服务,可以使用 -p 或 --publish 标志将容器的端口映射到宿主机上的端口。
【DNS 解析】:对于连接到同一自定义 bridge 网络的容器,Docker 提供内置的 DNS 服务器以便于容器之间可以通过名称互相解析。

一张图,多个容器和多个网络的结构:

  • 默认情况下,容器会自动加入 docker0 网桥;
  • 若指定容器加入某个网络也是支持的;
  • 一个容器可以在多个网络中。

在这里插入图片描述

none 网络(了解)

none 网络是一种特殊的网络模式,它实际上**不为容器提供任何网络功能**

  • 当你启动一个容器并指定使用 none 网络模式时,该容器将不会有任何网络接口除了回环接口(loopback interface)。
  • 这意味着容器将被完全隔离在网络层面,无法与外部网络通信,也无法被外部网络访问。
  • 启动容器时指定none网络 :添加 --network none 参数

host 网络(了解)

host 网络是一种允许容器共享宿主机网络栈的网络配置方式。

  • 当一个容器使用 host 网络模式运行时,它不会获得自己独立的网络命名空间,而是直接使用宿主机的网络接口。
  • 这意味着该容器可以直接监听宿主机的所有网络接口,并且其网络配置(如端口)与宿主机完全一致。
  • 启动容器时指定host网络:添加 --network host 参数

【Host 网络模式的特点】

  • 直接访问宿主机网络:使用 host 网络模式的容器可以直接访问宿主机的所有网络接口,这包括物理网卡、虚拟网卡等。
  • 无网络隔离:与默认的 bridge 或其他网络模式不同,host 模式下的容器不具有网络层面的隔离性。容器和宿主机在网络层面上几乎是等同的。
  • 端口无需映射:由于容器直接使用宿主机的网络栈,因此不需要通过 -p 或 --publish 参数来发布容器端口到宿主机上,因为它们已经在同一个网络空间内。
  • Linux 专属:值得注意的是,host 网络模式仅在 Linux 上可用.
http://www.lryc.cn/news/617896.html

相关文章:

  • 在 .NET Core 5.0 中启用 Gzip 压缩 Response
  • js异步操作 Promise :fetch API 带来的网络请求变革—仙盟创梦IDE
  • Qwen2.5-vl源码解读系列:ImageProcessor
  • Android14 QS编辑页面面板的加载解析
  • Android中Activity销毁底层原理
  • GSON 框架下百度天气 JSON 数据转 JavaBean 的实战攻略
  • Mysql——Sql的执行过程
  • 从 0 到 1:用 MyCat 打造可水平扩展的 MySQL 分库分表架构
  • Linux-常用命令
  • 深入解析 resolv.conf 文件:DNS 配置的核心
  • 驱动_ConfigFS多级目录操作
  • 光功率dBm为何是负数?一文详解
  • Google OAuth 配置步骤指南,实现Google Drive文件同步功能。
  • UVM验证—UVM 简述
  • 快速了解TF-IDF算法
  • 逐际动力开源运控 tron1-rl-isaacgym 解读与改进
  • 自由学习记录(81)
  • 5B 参数,消费级显卡可部署:Wan2.2-TI2V-5B 本地部署教程,9分钟跑出电影级大片!
  • 【运维进阶】WEB 服务器
  • GB17761-2024标准与电动自行车防火安全的技术革新
  • Redis 数据结构及特点
  • 【工作笔记】Wrappers.lambdaQuery()用法
  • ROS2学习(1)—基础概念及环境搭建
  • JavaEE 初阶第十七期:文件 IO 的 “管道艺术”(下)
  • vscode新建esp32工程,没有sample_project怎么办?
  • 计算机网络:ovn数据通信都是用了哪些协议?
  • 应用层模拟面试题
  • C语言(06)——二、八、十、十六进制的相互转换
  • Effective C++ 条款35:考虑 virtual函数以外的其他选择
  • 【已解决】报错:WARNING: pip is configured with locations that require TLS/SSL