Docker:网络

Docker:网络

    • Docker 网络架构
      • CNM
      • Libnetwork
      • 驱动
      • 网络类型
    • 命令
      • docker network ls
      • docker network inspect
      • docker network create
      • docker network connect
      • docker network disconnect
      • docker network prune
      • docker network rm
    • 网络操作
      • bridge
      • host
      • container
      • none


Docker 网络架构

Docker容器实现环境隔离,为内部进程提供一个独立的环境,这里面就包含网络环境的隔离。从容器内部来看,就好像自己独占一个主机,拥有一套完整的网络配置,包括IP协议栈、端口、套接字、防火墙等等。

为了实现这样的容器网络,采用的架构由三部分组成:CNMLibnetwork驱动

CNM

CNMDocker采用的网络设计规范,其又分为三个组成要素:SandBoxEndpointNetwork

  • SandBox:提供独立的网络协议栈,用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境
  • NetworkDocker内部的虚拟子网,使网络内的逻辑主机可以通信
  • Endpoint:虚拟网络的接口,通过该接口容器可以接入Network

在这里插入图片描述

上图中包含三个容器,每个容器都有自己的SandBox实现自己的独立网络协议栈。这些容器通过endpoint连接到network,再通过network连接到宿主机的网络,最后通过宿主机接入互连网。


Libnetwork

LibnetworkCNM的一个实现,其完成了CNM定义的三个核心功能,并拓展了容器负载均衡,网络控制以及管理。


驱动

容器具有独立完整的网络协议栈,协议栈的上三层应用层运输层网络层都没有变化。因为容器使用TCP/IP协议,宿主机也是用TCP/IP协议,这些协议在上三层实现,所以上三层没有修改的必要,直接复用宿主机的实现。

这里不是说容器和宿主机使用同样的网络栈,只是它们的网络栈上三层使用相同实现方案。

协议栈的最底层是数据链路层,数据链路层通过主机的驱动程序实现。为了实现网络的隔离性,那么就需要让不同容器之间,容器与宿主机之间的网络隔离。这就依赖于数据链路层的驱动程序,比如说Endpoint就是在数据链路层的驱动中实现的。

除去实现基本的隔离性,Docker还提供了多种类型的网络,并分别实现相应的驱动程序。比如桥接网络驱动Dridge Driver、宿主机网络驱动Host Driver等等。


网络类型

刚才提到,Docker实现了多个驱动程序,来支持不同类型的网络,在操作容器时,就可以选择不同的网络类型:

  1. Bridge网络:桥接网络,驱动在主机上创建一个网桥,多个容器可以接入网桥,相互通信,也可以通过网桥与互连网通信
  2. Host网络:宿主机网络,相当于移除了宿主机与容器之间的网络隔离,让容器可以直接使用宿主机的网络,此时容器直接使用宿主机的网络
  3. Container网络:容器网络,让一个容器共享另一个容器的网络,此时两个容器共享ip,端口号等等,也就是共享网络
  4. none网络:容器的网络依然隔离,但是不再拥有自己的网络,此时无法进行网络通信

接下来先讲解Docker的网络命令,再深入讲解以上四种网络的操作。


命令

docker network ls

  • 功能:查看docker的所有网络

语法:

docker network ls [option]

示例:

在这里插入图片描述

在这台主机上的Docker,共有四个网络,其中brideghostnone这三个网络,是Docker自带的网络,它们的网络名称和驱动名称相同。

后面的DRIVER是该网络使用的驱动程序,也就是先前提到的几种驱动程序之一。

第四个网络是用户自建的网络,使用的驱动是bridge


docker network inspect

  • 功能:输出网络的详细信息

语法:

docker network inspect [option]

查看默认的bridge网络:

在这里插入图片描述

此处可以看到其使用的驱动程序,是否使用IPv6。再比如Subnet表示可分配的子网,所有连接到这个网络的容器,可以分配到这些子网。Gateway表示网关,即这个网络通过172.17.0.1连接到宿主机。

使用ifconfig查看宿主机网络:

在这里插入图片描述

可以看到一个docker0网络,这是Docker安装时,自动配置的网络,也是所有容器的默认网络。其地址为172.17.0.1,也就是bridge网络使用的网关。

所有的Docker容器启动时,如果没有指定网络,默认使用bridge网络,bridge使用docker0,因此docker0是所有容器的默认网络。


docker network create

  • 功能:创建一个网络

语法:

docker network create [option] network_name

选项:

  • --driver, -d:指定网络驱动,默认是 bridge
  • --subnet:指定网络的子网
  • --gateway:指定网络的默认网关
  • --ip-range:指定分配给容器的连续 IP 地址范围
  • --enable-ipv6:启用 IPv6 网络

此处注意区别--subnet--ip-range,前者指定的是子网,这个会影响网络的广播,IP地址的范围等。而 --ip-range只限制地址范围,容器分配到的IP地址不会超过这个范围。

例如,指定子网为 172.17.0.0/16 并设置 IP 范围为 172.17.1.0/24,这意味着 Docker 将只从 172.17.1.0172.17.1.255 这个范围内为容器分配 IP 地址,但是容器的广播域是172.17.0.0/16

创建一个桥接网络test1

在这里插入图片描述

以上命令创建了一个test1桥接网络,并且分配了子网192.168.0.1

通过ifconfig查看主机网络:

在这里插入图片描述

此时多出一个br-8c5013a75f1d0网络,前面的brbridge简写,表示桥接网络,后面是一段随机生成的字符。这个网络的地址为192.168.0.1,就是先前指定的子网。


docker network connect

  • 功能:将容器连接到网络

语法:

docker network connect [option] network container

选项:

  • --ip:指定IP地址
  • --ip6:指定IPv6地址

示例:

在这里插入图片描述

以上命令,创建了一个busybox容器,并且执行以下命令分配网络:

docker network connect --ip 192.168.66.66 test1 bx1

分配的IP地址是192.168.66.66,来自网络test1,这是先前创建的一个桥接网络。

进入容器后,执行ifconfig,可以看到三个网络。

  1. eth0:由于在docker run的时候,没有指定网络,默认使用bridge网络,也就是eth0,为其分配的地址为172.17.0.2
  2. eth1:这是通过以上指令添加的网络,通过子网掩码可以看出所属子网为192.168.0.0/16,也就是test1可分配的子网,而分配的地址是192.168.66.66
  3. lo:一个本地环回地址

docker network disconnect

  • 功能:断开容器与网络的连接

语法:

docker newwork disconnect

docker network prune

  • 功能:删除所有不使用的网络

语法:

docker newwork prune

示例:

在这里插入图片描述

此处删除了两个用户自定的网络,因为这两个网络没有任何一个容器正在使用。


docker network rm

  • 功能:删除指定网络

语法:

docker newwork rm

网络操作

bridge

bridge是默认的网络配置,如果创建容器时,不配置网络属性,那么就会使用bridge网络。

创建一个容器,不配置任何网络:

在这里插入图片描述

查看网络信息,可以看到两个两个网络接口,分别是lo本地环回,以及eth0接口用于对外通信。

eth0的地址为172.17.0.2,子网掩码为255.255.0.0,可见其属于子网172.17.0.0/16

这个地址,其实属于宿主机的docker0

在这里插入图片描述

可以看到,docker0接口的地址为172.17.0.1,当一个容器创建时,不指定网络,就会通过docker0搭建网桥,与宿主机通信,最后通过宿主机的eth0与互连网通信。

在这里插入图片描述

从容器内部看,好像自己使用eth0就可以直接与互连网直接通信,自己独占一个主机的网络接口。

但是其实eth0本质是连接了docker0这个网桥,而宿主机的eth0也连接了docker0这个网桥。因此容器内部的eth0与宿主机的eth0可以通过网桥通信,进而让容器可以与外界网络通信。

在此处,docker0就类似于物理上的路由器或者说交换机,所有连接到这个网桥的接口都可以相互通信,实现的是宿主机与容器之间的通信。

同一个网桥上的任意两个接口都可以相互通信,那么同一网桥内的两个容器之间也能可以通信,并且还会自带DNS的解析服务

创建一个桥接网络test_net

在这里插入图片描述

在两个终端运行两个busybox容器bx3bx4,都连接到test_net网络:

在这里插入图片描述

docker run时加上参数--network,可以直接指定网络,无需通过docker network connect

bx3容器分配到的IP地址为172.18.0.2

在这里插入图片描述

bx4容器分配到的IP地址为172.18.0.3

bx3ping 172.18.0.3

在这里插入图片描述

成功了,说明bx3bx4可以通过网桥test_net进行通信。

不仅如此,还可以直接ping 容器名

在这里插入图片描述

bx3ping bx4也成功了,这是因为处于同一网桥下的容器,网桥会对域名进行DNS解析,容器名就是域名,bx4直接被解析为了172.18.0.3

不过这个DNS解析只有用户自己创建的桥接网络才有,docker0不带有这个功能。


host

host是一种非常简单粗暴的容器网络模式,这种模式下,容器不会进行网络隔离,直接使用宿主机的网络配置。

在这里插入图片描述

上图中,container A使用host网络,其箭头直接指向整个宿主机网络,宿主机有什么接口,container A就有什么接口

创建一个busybox容器,使用host网络:

在这里插入图片描述

其包含的网络接口与宿主机完全一致,比如docker0etho以及一个br-xxxx网络,这个是先前创建的test_net网络的接口。

虽然这种方式很简单粗暴,但是相比于bridge,不需要通过网桥进行数据转发,网络效率会更高。缺点是与宿主机共用网络,可能会有端口冲突等问题。


container

container网络模式下,一个容器会直接使用另一个容器的网络,两个容器共享网络栈。

在这里插入图片描述

上图中,container A使用的就是container模式的网络,其与container B共用一份网络。

创建容器bx6,使用test_net桥接网络:

在这里插入图片描述

其分配到的地址为172.18.0.2

再创建一个容器bx7,使用container网络,与bx6共享网络:

docker run是添加以下参数,则为container网络:

--network container:被共享网络的容器

在这里插入图片描述

--network container:bx6表示bx7共享了bx6的网络,其eth0接口的地址也为172.18.0.2

对于被共享网络的容器,不一定就是桥接网络,也有可能是host等其它网络。不论是什么网络,都支持被container网络进行容器之间的共享。

container网络的实现原理很简单,容器网络通过net namespace进行隔离,每个容器都会创建自己的net namespace。当一个容器使用container网络时,不会创建自己的net namespace,而是直接进入到别的容器的net namespace中,那么这两个容器的网络就不会被隔离,于是新容器就可以使用别的容器的网络了。


none

none就是没有网络,可以在docker run时通过--network=none来指定。

在这里插入图片描述

在这种模式下,只有一个lo本地环回接口,无法与外部进行网络连接。

对于一些不需要互连网的应用,或者安全要求高的内容,可以使用none网络进行。

最后,再总结一下以上四种网络:

  • bridge:容器通过net namespace隔离网络环境,再使用一个接口连接到网桥与外部通信
  • host:容器不创建自己的net namespace,直接与宿主机共享网络
  • container:容器不创建自己的net namespace,直接使用其他容器的net namespace
  • none:容器通过net namespace隔离网络环境,但是不开放接口,形成一个完全独立,无法联网的网络环境

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

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

相关文章

力扣排序268题 数字丢失

题目: 丢失的数字 给定一个包含[0,n]中n各数的数组nums,找出[0,n]这个范围 内没有出现在数组中的那个数。 示例1: 输出:n 3,因为有3个数字,所以所有的数字都在范围 [0,3]内。2是丢失的数字,因为它没有出现…

自动化测试类型与持续集成频率的关系

持续集成是敏捷开发的一个重要实践,可是究竟多频繁的集成才算“持续”集成? 一般来说,持续集成有3种常见的集成频率,分别是每分钟集成、每天集成和每迭代集成。项目组应当以怎样的频率进行集成,这取决于测试策略&…

Gitlab-runner running on Kubernetes - hostAliases

*Config like this. *That in your helm values.yaml.

从头开始学PHP之面向对象

首先介绍下最近情况,因为最近入职了且通勤距离较远,导致精力不够了,而且我发现,人一旦上了班,下班之后就不想再进行任何脑力劳动了(对大部分牛马来说,精英除外)。 话不多说进入今天的…

【综合算法学习】(第十五篇)

目录 图像渲染(medium) 题目解析 讲解算法原理 编写代码 岛屿数量(medium) 题目解析 讲解算法原理 编写代码 图像渲染(medium) 题目解析 1.题目链接:. - 力扣(LeetCode&…

教育技术革新:SpringBoot在线试题库系统开发

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Sprin…

OTFS延迟多普勒信道模型(信道模型代码)

一、信道模型公式 1、延迟多普勒域信道模型 在一个M*N维的延迟多普勒域中,定义M为子载波数,子载波间隔为 对应倒数时隙长度为,信号总长度为,L-1表示最大径数。 公式中冲激响应延迟域移动的分辨率,如下图中Delay轴的一格也就是即,多…

Failed to search for file: Cannot update read-only repo

今天在读《Linux就该这么学》并上机操作RedHat Linux 8。结果在执行指令时却出现了问题: 我明明已经是root权限了,我于是上网去找,但也没看到合适的解答。为什么会和书上的操作结果不一样。 后来我突然意识到是不是我打了不该打的空格,于是…

Android中SurfaceView与GLSurfaceView 的关系

SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中,SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式,适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…

游戏引擎中的颜色科学

游戏引擎中的渲染组件的作用是生成一个二维图片,在特定的时间从给定的视点观察的方向看到的一个三维空间的状态。他们的生成每一张图片都会被称为帧,他们生成的速度称为帧率。 像素 在每一帧中,游戏引擎的视觉输出基本上是一大堆彩色像素&a…

计算机网络-以太网小结

前导码与帧开始分界符有什么区别? 前导码--解决帧同步/时钟同步问题 帧开始分界符-解决帧对界问题 集线器 集线器通过双绞线连接终端, 学校机房的里面就有集线器 这种方式仍然属于共享式以太网, 传播方式依然是广播 网桥: 工作特点: 1.如果转发表中存在数据接收方的端口信息…

D56【python 接口自动化学习】- python基础之异常

day56 异常的产生与分类 学习日期:20241102 学习目标:模块与标准库 -- 72 初始异常:异常的产生与分类 学习笔记: 什么是异常 异常的分类 总结 引发异常时,代码会进行中断exception-所有内置的非系统退出类异常都派…

轴承性能对步进电机的影响

步进电机作为一种重要的电动机类型,在工业自动化、机器人技术以及各种机械设备中得到了广泛应用。步进电机的性能直接关系到其控制精度、响应速度和可靠性,而其中一个关键的组成部分——轴承,往往被认为是影响步进电机性能的一个重要因素。 一…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

Java类和对象(上篇)

今天学习Java的类【认识类,并学习有关类的操作(1.定义和使用 2.实例化 3. this引用 4.构造对象和初始化对象)】 目录 1. 初步认知面向对象1.1 面向对象的概念1.1 面向对象和面向过程 2. 类定义和使用2.1 认识类2.2 类的定义格式2.3 练习2.3.1…

【路径——Dijkstra】

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int, int> PII; const int N 2025, M N * N; int h[N], e[M], ne[M], w[M], idx; int dist[N]; int n 2021; void add(int a, int b, int c) {w[idx] …

ubuntu安装与配置Nginx(1)

在 Ubuntu 上安装和配置 Nginx 是相对简单的。以下是一个逐步指南&#xff1a; 1. 更新系统包 首先&#xff0c;确保你的系统是最新的。打开终端并运行&#xff1a; sudo apt update sudo apt upgrade2. 安装 Nginx 使用以下命令安装 Nginx&#xff1a; sudo apt install …

基于XSS的flash钓鱼上线Cobalt strike

题记 学习网安真是让人愉快啊&#xff0c;天天晚上睡觉之前都要想点技术问题&#xff0c;我是不是快魔怔了&#xff0c;今天打算搞XSS的flash钓鱼&#xff0c;完成一下写毕业论文的时候没有完成的事情。学习最有趣的地方就是在学习过程中发现新的不会的出现&#xff0c;下一个…

10.30.2024刷华为OD

文章目录 HJ20 密码验证合格程序&#xff08;难过全部例子 list取数左开有闭 [0,3) &#xff09;HJ21 简单密码HJ22 汽水瓶 (数学游戏...)HJ23 (dic就是map&#xff0c;注意怎么用&#xff0c; 善用values()和keys()函数返回list)语法知识记录 (留意转换的字符怎么拼接) HJ20 密…

安卓设备adb执行AT指令控制电话卡

文章目录 AT指令起源与发展&#xff1a;基本格式&#xff1a;常见应用领域及功能&#xff1a;不同设备中的应用&#xff1a; 安卓获取modem设备输入符入口安卓设备输入AT指令 AT指令 AT 指令是 Attention 的缩写&#xff0c;是一种用于控制调制解调器等通信设备的指令集。 起…