Docker 基础使用 (4) 网络管理

文章目录

  • Docker 网络管理需求
  • Docker 网络架构认识
  • Docker 常见网络类型
    • 1. bridge 网络
    • 2. host 网络
    • 3. container 网络
    • 4. none 网络
    • 5. overlay 网络
  • Docker 网路基础指令
  • Docker 网络管理实操

其他相关链接
Docker 基础使用(0)基础认识
Docker 基础使用(1)使用流程概览
Docker 基础使用(2)镜像与容器
Docker 基础使用(3)存储卷

Docker 网络管理需求

在操作系统的学习过程中,可以了解网络通信,本质上通常是两个进程的通信。Docker运行容器的本质通常是隔离了更多资源或属性的进程,隔离的资源就包括网络资源,容器的网络默认与宿主机及其他容器都是相互隔离。

但容器在实际应用场景下,也是需要进行网络(进程)间通信的。 通常需要考虑的通信场景有:

  1. 多个容器之间是如何通信的
  2. 容器和宿主机是如何通信的
  3. 容器和外界主机是如何通信的
  4. 容器中要运行一些网络应用(如 nginx、web 应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应用应该如何实现
  5. 容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)应该如何实现

为了满足上述需求,便有了学习容器网络管理的需求。

Docker 网络架构认识

Docker 容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块。 Docker为了实现容器网络,主要采用Libnetwork与驱动作为架构。

CNM
Docker 网络架构采用的设计规范是 CNM(Container Network Model)。CNM 中规定了 Docker 网络的基础组成要素:Sandbox、Endpoint、Network。

Sandbox:提供了容器的虚拟网络栈,即端口、套接字、IP 路由表、防火墙、DNS 配置等内容。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。

Network:Docker 内部的虚拟子网,使得网络内的参与者能够进行通讯。

Endpoint:就是虚拟网络的接口,就像普通网络接口一样,Endpoint 的主要职责是负责创建连接。Endpoint 类似于常见的网络适配器,那也就意味着一个 Endpoint 只能接入某一个网络, 当容器需要接入到多个网络,就需要多个 Endpoint。 如下图当两Endpoint同时接入同一个Network中即可实现容器间的通信。

Libnetwork
CNM是一种架构, Libnetwork 是 CNM 的一个标准实现。Libnetwork 是开源库,采用 Go 语言编写(跨平台的),也是 Docker 所使用的库,Docker 网络架构的核心代码都在这个库中。Libnetwork 实现了 CNM 中定义的全部三个组件以及其他额外的功能。

在这里插入图片描述

驱动

驱动指的是一种用于与底层系统或基础设施交互的插件,说的直白一点就是驱动是操作对应硬件的软件。 例如显卡驱动、显示器键盘鼠标的驱动(基础驱动装机自带,所以对电脑没有过多需求的用户不知道驱动是什么)。

Docker网络相关的驱动也是驱动的一种,驱动主要负责实现数据层相关内容,例如网络的连通性和隔离性是由驱动来处理的。驱动通过实现特定网络类型的方式扩展了 Docker 网络栈,例如桥接网络和覆盖网络。Docker 内置了若干驱动,通常被称作原生驱动或者本地驱动。例如 Bridge Driver、Host Driver、Overlay Driver、MacVLan Driver、IPVLan Driver、None Driver 等等。每个驱动负责创建其上所有网络资源的创建和管理。

(补充:网络栈是一种计算机网络的概念,用于描述网络协议栈的层次结构。它包括多个层次,每个层次都负责不同的功能,具体来说就是网络通信模型中的某一层,例如物理层、数据链路层、网络层、传输层和应用层。)

Docker 常见网络类型

1. bridge 网络

bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。Docker 容器的默认网络驱动.当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择。

在这里插入图片描述
bridge 网络默认网桥

在创建容器时,默认情况下(即创建的容器在没有使用–network参数指定要加入的 docker 网络时)都是加入 Docker 默认的单机桥接网络。默认的 bridge 网络会被映射到内核中为 docker0 的网桥上,一个docker bridge 对应一个 Linux bridge (内核网桥)。bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字。通过 docker network ls 指令查询出的名为bridge网络即为默认网络。 当两个相同的容器连接同一个网桥,即可进行通信。此外用户可定义自定义,例如使用docker network create -d bridge new-bridge 指令,创建一个名为new-bridge自定义网桥。

值得注意是的,docker提供的默认bridge网络无法使用DNS域名解析服务。而自定义的bridge网络可以。
!

bridge 网络端口问题

docker 容器有和主机网络交互的需求,为此,需要对端口号进行专门的处理。通常容器要想和外部
主机或其他主机进行通信有两种策略。

① 暴露所有端口号, 在启动容器时,可以使用指令参数 -P暴露主机所有端口号

② 端口转发, 身端口转发(Port Forwarding)本身是一种网络配置,允许将来自外部网络的流量路由到局域网中的特定设备或服务。通常用于使外部用户能够访问局域网中的服务器或服务,如Web服务器或游戏服务器。 使用-p参数将主机端口号与容器端口号建立映射关系,主机指定端口号接收到的网络数据会发给容器的指定端口号。

端口转发

在这里插入图片描述

2. host 网络

对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择

Docker 容器运行默认都会分配独立的 Network Namespace 隔离子系统, 但是如果基于 host 网络模式,容器将不会获得一个独立的 Network Namespace,而是和宿主机共用同一个 Network Namespace,容器将不会虚拟出自己的网卡,IP 等,而是直接使用宿主机的 IP 和端口。

连接到 host 网络的容器共享宿主机的网络栈,容器的网络配置与宿主机完全一样。用户可以在启动容器时通过 --network=host 指定使用 host 网络。

在这里插入图片描述
bridge 网络在通信的时候需要进行端口转发以及 NAT 地址转换,这势必会消耗掉一些资源以及性能。而直接使用 host 网络最大的好处就是性能好,如果容器对网络传输效率有较高的要求,建议选择 host 网络。当然也会牺牲一些东西,比如要考虑端口冲突问题,其他服务已经被占用的端口就不能再使用了。

3. container 网络

这个模式指定新创建的容器和已存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个已存在的、指定的容器共享 ip,端口等。两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 LO网卡(127.0.0.1,通常被称为本地回环地址(Loop back address))设备通信。

Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模式。之所以称为“other container 模式”,是因为这个模式下的 Docker Container,会使用其他容器的网络环境。之所以称为“特别”,是因为这个模式下容器的网络隔离性会处于 bridge 桥接模式与 host 模式之间。Docker Container 共享其他容器的网络环境,则至少两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离

在这里插入图片描述
other container 网络模式的创建方式如下:

1. 创建一个 busybox 容器 (任意带网络通信的容器均可)
docker run -itd --name netcontainer1 busybox
2. 使用 netcontainer1 的网络创建另外一个容器
docker run -itd --name netcontainer2 --network container:netcontainer1 busybox这样创建的两个容器的ip、mac地址完全一样。

4. none 网络

Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。容器完全网络隔离。

在运行容器的时候,可以通过–network=none 参数来指定容器使用 none 网络。

5. overlay 网络

借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个Docker 守护进程连接在一起,使集群服务能够相互通信。当我们需要运行在不同Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择。

Docker 网路基础指令

创建自定义网络
docker network create [OPTIONS] NETWORK○ -d, --driver:网络驱动
○ --gateway:网关地址
○ --subnet:表示网段的 CIDR 格式的子网
○ --ipv6:启用 ipv6
查看网络详情 
docker network inspect [OPTIONS] NETWORK [NETWORK...]用于将容器连接到网络。可以按名称或 ID 连接容器。一旦连接,容器可以与同一网络中的其他容器通信。
docker network connect [OPTIONS] NETWORK CONTAINER断开网络
docker network disconnect [OPTIONS] NETWORK CONTAINER删除不使用的网络
docker network prune [OPTIONS]删除 1 个或者多个网络
docker network rm列出网络
docker network ls

Docker 网络管理实操

创建网络
docker network create --subnet=172.18.0.0/16 mynetwork

列出已创建的网络
docker network ls
在这里插入图片描述
启动容器mynginx1并以名为mynetwork的网络启动
docker run -itd --name mynginx1 --network mynetwork nginx:1.24.0
在这里插入图片描述
docker inspect mynginx1:
在这里插入图片描述

启动容器2
docker run -itd --name mynginx2 nginx:1.24.0

查看容器2发现除了本地网络之外,没有其他的网络连接
docker inspect mynginx2
在这里插入图片描述
将创建的网络与容器2连接
docker network connect mynetwork mynginx2

再次查看容器2的网络,发现有新的网络
docker inspect mynginx2
在这里插入图片描述

完整执行流程# 创建网络
docker network create --subnet=172.18.0.0/16 mynetwork# 列出已创建的网络
docker network ls # 启动容器mynginx1并以名为mynetwork的网络启动
docker run -itd --name mynginx1 --network mynetwork nginx:1.24.0#查看容器1的信息
docker inspect mynginx1#启动容器2
docker run -itd --name mynginx2 nginx:1.24.0# 查看容器2发现除了本地网络之外,没有其他的网络连接
docker inspect mynginx2# 将创建的网络与容器2连接
docker network connect mynetwork mynginx2# 再次查看容器2的网络,发现有新的网络
docker inspect mynginx2# 断开容器2的网络连接
docker network disconnect mynetwork mynginx2docker inspect mynginx2# 尝试删除网络,但删除失败,因为任然有容器1在使用该网络。
docker network rm mynetwork

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

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

相关文章

文件操作(Python和C++版)

一、C版 程序运行时产生的数据都属于临时数据&#xff0c;程序—旦运行结束都会被释放通过文件可以将数据持久化 C中对文件操作需要包含头文件< fstream > 文件类型分为两种: 1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2. 二进制文件- 文件以文本的二进…

Spring运维之boo项目表现层测试匹配响应执行状态响应体JSON和响应头

匹配响应执行状态 我们创建了测试环境 而且发送了虚拟的请求 我们接下来要进行验证 验证请求和预期值是否匹配 MVC结果匹配器 匹配上了 匹配失败 package com.example.demo;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Auto…

Transformer动画讲解:Softmax函数

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

读AI未来进行式笔记07量子计算

1. AI审讯技术 1.1. 发明者最初的目的是发明一种能够替代精神药物&#xff0c;为人类带来终极快乐的技术 1.1.1. 遗憾的是&#xff0c;他找到的只是通往反方向的大门 1.2. 通过非侵入式的神经电磁干扰大脑边缘系统&#xff0c;诱发受审者最…

VRRP基础配置(华为)

#交换设备 VRRP基础配置 VRRP (Virtual Router Redundancy Protocol) 全称是虚拟路由规元余协议&#xff0c;它是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;该虚拟路由器在本地局域网拥有唯一的一个虚拟 ID 和虚拟 IP 地址。实际上&…

UV胶的均匀性对产品质量有什么影响吗?

UV胶的均匀性对产品质量有什么影响吗? UV胶的均匀性对产品质量具有显著的影响&#xff0c;主要体现在以下几个方面&#xff1a; 粘合强度&#xff1a;UV胶的均匀性直接影响其粘合强度。如果UV胶分布不均匀&#xff0c;可能导致部分区域粘接力不足&#xff0c;从而影响产品的…

报错:CMake Error OpenCVConfig.cmake opencv-config.cmake

1、编译过程中&#xff0c;出现OpenCV 报错问题 报错&#xff1a;CMake Error OpenCVConfig.cmake opencv-config.cmake 解决思路&#xff1a;参考此链接

LangChain + ChatGLM 实现本地知识库问答

基于LangChain ChatGLM 搭建融合本地知识的问答机器人 1 背景介绍 近半年以来&#xff0c;随着ChatGPT的火爆&#xff0c;使得LLM成为研究和应用的热点&#xff0c;但是市面上大部分LLM都存在一个共同的问题&#xff1a;模型都是基于过去的经验数据进行训练完成&#xff0c;无…

Python进阶-部署Flask项目(以TensorFlow图像识别项目WSGI方式启动为例)

本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。首先简要介绍了Flask框架的基本概念及其特点&#xff0c;其次详细阐述了Flask项目的部署流程&#xff0c;涵盖了服务器环境配置、Flask应用的创建与测试、WSGI服务器的安装与配置等内容。本文旨在帮…

JAVA-LeetCode 热题 100 第56.合并区间

思路&#xff1a; class Solution {public int[][] merge(int[][] intervals) {if(intervals.length < 1) return intervals;List<int[]> res new ArrayList<>();Arrays.sort(intervals, (o1,o2) -> o1[0] - o2[0]);for(int[] interval : intervals){if(res…

【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?

问题&#xff1a; 波特率9600&#xff0c;发送 01 03 00 00 00 04 44 09 (8字节) 需要多少时间&#xff0c;如何计算&#xff1f; 在计算发送数据的时间时&#xff0c;首先要考虑波特率以及每个字符的数据格式。对于波特率9600和标准的UART数据格式&#xff08;1个起始位&…

AIRNet模型使用与代码分析(All-In-One Image Restoration Network)

AIRNet提出了一种较为简易的pipeline&#xff0c;以单一网络结构应对多种任务需求&#xff08;不同类型&#xff0c;不同程度&#xff09;。但在效果上看&#xff0c;ALL-In-One是不如One-By-One的&#xff0c;且本文方法的亮点是batch内选择patch进行对比学习。在与sota对比上…

JAVA-学习-2

一、类 1、类的定义 把相似的对象划分了一个类。 类指的就是一种模板&#xff0c;定义了一种特定类型的所有对象的属性和行为 在一个.java的问题件中&#xff0c;可以有多个class&#xff0c;但是智能有一个class是用public的class。被声明的public的class&#xff0c;必须和文…

Pytorch 实现目标检测一(Pytorch 23)

一 目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别。然而&#xff0c;很多时候图像里有多个我们感兴趣的目标&#xff0c;我们不仅想知 道它们的类别&#xff0c;还想得到它们在图像中的具体位置。在…

【前端】响应式布局笔记——自适应布局

自适应布局 自适应布局是不同设备对应不同的html(局部自适应)&#xff0c;通过判断设备的类型或控制局部的变化。 1、获取设备是移动端还是pc端 // 获取设备的信息let userAgent navigator.userAgent.toLowerCase();// 使用正则表达式来判断类型let device /ipad|iphone|m…

数据并非都是正态分布:三种常见的统计分布及其应用

你有没有过这样的经历&#xff1f;使用一款减肥app&#xff0c;通过它的图表来监控自己的体重变化&#xff0c;并预测何时能达到理想体重。这款app预测我需要八年时间才能恢复到大学时的体重&#xff0c;这种不切实际的预测是因为应用使用了简单的线性模型来进行体重预测。这个…

服务部署:.NET项目使用Docker构建镜像与部署

前提条件 安装Docker&#xff1a;确保你的Linux系统上已经安装了Docker。如果没有&#xff0c;请参考官方文档进行安装。 步骤一&#xff1a;准备项目文件 将你的.NET项目从Windows系统复制到Linux系统。你可以使用Git、SCP等工具来完成这个操作。如何是使用virtualbox虚拟电…

国产操作系统上给virtualbox中win7虚拟机安装增强工具 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上给virtualbox中win7虚拟机安装增强工具 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上给win7虚拟机安装virtualbox增强工具的文章。VirtualBox增强工具&#xff08;Guest Additions&a…

Liunx环境下redis主从集群搭建(保姆级教学)02

Redis在linux下的主从集群配置 本次演示使用三个节点实例一个主节点&#xff0c;两个从节点&#xff1a;7000端口&#xff08;主&#xff09;&#xff0c;7001端口&#xff08;从&#xff09;&#xff0c;7002端口&#xff08;从&#xff09;&#xff1b; 主节点负责写数据&a…

Rust-02-变量与可变性

在Rust中&#xff0c;变量和可变性是两个重要的概念。 变量&#xff1a;变量是用于存储数据的标识符。在Rust中&#xff0c;变量需要声明其类型&#xff0c;例如&#xff1a; let x: i32 5; // 声明一个名为x的变量&#xff0c;类型为i32&#xff08;整数&#xff09;&#…