Docker Network(网络)——8

目录:

  1. Docker 为什么需要网络管理
  2. Docker 网络架构简介
    1. CNM
    2. Libnetwork
    3. 驱动
  3. 常见网络类型
    1. bridge 网络
    2. host 网络
    3. container 网络
    4. none 网络
    5. overlay 网络
  4. docker 网络管理命令
    1. docker network create
    2. docker network inspect
    3. docker network connect
    4. docker network disconnect
    5. docker network prune
    6. docker network rm
    7. docker network ls
    8. 网络命令基本操作
  5. 网络详解
    1. docker Bridge 网络
      1. 网络介绍
      2. 生活案例
      3. 操作案例
        1. 容器间的网络通信
        2. 创建自定义 bridge
        3. DNS 解析
        4. 端口暴露和转发
    2. docker Host 网络
      1. 网络介绍
      2. 操作案例
    3. docker Container 网络
      1. 网络介绍
      2. 操作案例
  6. docker none 网络
    1. 网络介绍
    2. 操作案例

1.Docker 为什么需要网络管理

容器的网络默认与宿主机及其他容器都是相互隔离, 但同时我们也要考虑下面的一些问题, 比如

  • 多个容器之间是如何通信的
  • 容器和宿主机是如何通信的
  • 容器和外界主机是如何通信的
  • 容器中要运行一些网络应用(如 nginx、 web 应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应用应该如何实现
  • 容器不想让它的网络与宿主机、与其他容器隔离应该如何实现
  • 容器根本不需要网络的时候应该如何实现
  • 容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)应该如何实现

上述的这些问题都需要我们对容器的网络进行合理的管理才能解决,这就体现出了容器网络管理的重要性。
 

2.Docker 网络架构简介

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

CNM

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

  • Sandbox:提供了容器的虚拟网络栈,也即端口、套接字、 IP 路由表、防火墙、DNS 配置等内容。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。
  • Network: Docker 内部的虚拟子网,使得网络内的参与者能够进行通讯。
  • Endpoint:就是虚拟网络的接口,就像普通网络接口一样, Endpoint 的主要职责是负责创建连接。 Endpoint 类似于常见的网络适配器,那也就意味着一个 Endpoint 只能接入某一个网络, 当容器需要接入到多个网络,就需要多个 Endpoint。
  • 如上图所示,容器 B 有两个 Endpoint 并且分别接入 Networkd A 和 Network B。那么容器 A 和容器 B 之间是可以实现通信的,因为都接入了 NetworkA。但是容器 A 和容器 C 不可以通过容器 B 的两个 Endpoint 通信。
Libnetwork

Libnetwork 是 CNM 的一个标准实现。 Libnetwork 是开源库,采用 Go 语言编写(跨平台的),也是 Docker 所使用的库, Docker 网络架构的核心代码都在这个库中。Libnetwork 实现了 CNM 中定义的全部三个组件,此外它还实现了本地服务发现、基于 Ingress 的容器负载均衡,以及网络控制层和管理层等功能。

驱动

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

3.常见网络类型

bridge 网络

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

host 网络

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

container 网络

这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信

none 网络

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

overlay 网络

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


另外,在 Docker 安装时,会自动安装一块 Docker 网卡称为 docker0,它是一个网桥设备,主要用于 Docker 各容器及宿主机的网络通信。



 

4.docker 网络管理命令

命令清单

docker network create

功能

创建自定义网络

语法


 

关键参数

  • -d, --driver: 网络驱动
  • --gateway: 网关地址
  • --subnet: 表示网段的 CIDR 格式的子网
  • --ipv6: 启用 ipv6

样例

docker network inspect

功能

查看网络详情

语法

关键参数

-f,--format:指定格式

样例


 

docker network connect

功能

于将容器连接到网络。可以按名称或 ID 连接容器。 一旦连接,容器可以与同一网络中的其他容器通信。

语法

关键参数

--ip: 指定 IP 地址

--ip6: 指定 IPv6 地址

样例


 

docker network disconnect

功能

断开网络

语法

关键参数

-f:强制退出

样例

docker network prune

功能

删除不使用的网络

语法


 

关键参数

-f, --force : 不提示

样例

docker network rm

功能

删除 1 个或者多个网络

语法

关键参数

-f:强制退出

样例


 

 docker network ls

功能

列出网络

语法

别名

 

关键参数

  • -f, --filter:指定过滤条件
  • --format:指定格式
  • --no-trunc:不截断
  • -q, --quiet :仅仅显示 id

样例


 

网络命令基本操作

创建网络并指定 ip 地址段

查看创建的网络

创建一个容器并加入网络

查看容器网络信息

创建一个新的 nginx 容器 mynginx2,但是不加入我们的自定义网络

查看该容器的网络配置,可以看到采用的是 docker0 桥

 

 

我们将该容器加入到我们自己创建的网络

 

再次查看我们的容器 2 的网络配置,可以 看到它多了一个 mynetwork

 

 

我们让容器二断开网络


 

再次查看容器 2 网络配置,可以看到只有 1 个 bridge 网络了

 

删除网络,可以看到网络被使用了,无法删除

 

再次删除容器,删除网络,可以看到只要我们停止了所有容器,就可以正常的删除网络了。


 

5.网络详解

docker Bridge 网络
网络介绍

Docker Bridge 网络采用内置的 bridge 驱动, bridge 驱动底层采用的是 Linux 内核中Linux bridge 技术。就网络而言, bridge 网络是在网络段之间转发流量的链路层设备,而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离。Docker Container 的 bridge 桥接模式可以参考下图

默认情况下,创建的容器在没有使用--network 参数指定要加入的 docker 网络时,默认都是加入 Docker 默认的单机桥接网络,即下面的 name 为 bridge 的网络。


 

默认的 bridge 网络会被映射到内核中为 docker0 的网桥上。Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字。


 

生活案例 

bridge 就像一个立交桥一样,有很多条路可以四通八达,每条路都连接了 2 个方向的通道。

操作案例
容器间的网络通信

回忆一下之前学到网络知识:多台主机是如何通过网络中进行通信的?
如果是两台主机可以直接通过连接网线的两端进行通信。那多台主机通信怎么处理呢?这就需要新增路由器/交换机,把多台主机连接到路由器/交换机上, 通过路由器/交换机来达到交换数据, 即通信的目的。

其实容器之间的通信也和上面主机通信的方式如出一辙, 之前我们提到了安装 Docker的时候会默认 docker0 这个网桥软件设备, 这个 docker0 设备可以类比成上图的交换机/路由器设备,当我们创建好容器之后, 如果不手动指定网络模式,默认会使用bridge 网络, 容器会自动连接到 docker0 这个网桥设备, 然后通过这个网桥来进行容器间的通信。下面我们一起来做个实验验证一下.

使用 busybox 镜像创建两个容器, 并且保持在后台运行


 

关于 BusyBox 镜像介绍:

BusyBox 是一个集成了一百多个最常用 Linux 命令和工具(如 cat、 echo、grep、 mount、 telnet 等)的精简工具箱,它只需要几 MB 的大小,很方便进行各种快速验证,被誉为“Linux 系统的瑞士军刀”。BusyBox 可运行于多款 POSIX 环境的操作系统中,如 Linux(包括Android)、 Hurd、 FreeBSD 等先看一下两个容器间通信的现象


 

确定两个容器可以通信之后, 我们来查看一下 bridge 网络的信息

此时, 该网络已经连接了两个容器,即 c1 和 c2。c1 和 c2 两个容器就是通过 docker0 这个网桥来进行通信的。当我们停止或删除掉一个容器的时候, 会发现该容器会自动和 docker0 切断连接

 

 

创建自定义 bridge

在默认情况下, 我们创建的容器都会连接在 docker0 这个 bridge 上。那其实我们也可以创建一些自定义的 bridge,让运行的容器通过自定义 bridge 进行通信。可以通过 create 命令来创建新的 bridge.

-d,--driver 选项指定网络驱动程序

在创建自定义 bridge 的时候可能会出现如下报错


 

我们可以通过重启 docker 服务来解决这个问题


 

使用命令 docker network inspect 查看 new-bridge 网络信息会发现这个网络的子网 IP 是 172.18.0.0/16, 它表示如果我们创建容器并连接到该网络上, 就会给该容器分配一个 172.18.xx.xx 这个网段的 IP 地址。


 

那我们在创建容器的时候, 怎么才能连接自定义的这个 bridge 呢?可以通过--network 选项指定要连接的网络, 如果不指定, 默认是连接的 bridge。

查看自定义 bridge 网络的详细信息, 发现 c3 容器已经连接到该网络上了。

DNS 解析

Docker 自定义桥接网络是支持通过 Docker DNS 服务进行域名解析的, 也就是说我们可以直接使用容器名进行通信,因为 DNS 服务可以解析容器名到 IP 地址的映射, 但是默认的 bridge 网络是不支持 DNS 的。 

准备实验环境: c1 和 c2 容器默认连接 bridge 网络, c3 和 c4 容器默认连接 newbridge 网络

 

验证 c1 和 c2 是否能够使用 dns 解析服务

 

验证 c3 和 c4 是否能够使用 DNS 解析服务

 

端口暴露和转发

暴露方式

端口暴露有 2 种方式,在启动容器的时候添加端口参数,一种-P 暴露所有端口,一种
是-p,暴露指定端口

-p

将指定的容器端口映射至主机所有地址的一个动态端口, ·“动态端口”指随机端口,具体的映射结果可使用 docker port 命令查看
-p <hostPort>:<containerPort>
将容器端口<containerPort>映射至指定的主机端口<hostPort>

端口转发

连接 bridge 网络的容器只能与连接在当前网络中的容器进行通信。如果一个容器想要对外提供一些网络服务的话,需要进行端口转发才可以实现。端口转发将 Docker 容器的端口映射到宿主机的端口上,那么任何发送到宿主机该端口的流量,都会被转发到容器的端口中。如下图所示,两个容器内部均开放 80 端口,它们分别映射到宿主机的 8088 和 8089 端口, 即表示任何发送到 8088 端口的流量都会转发到 Container 1 容器的 80 端口, 发送到 8089 端口的流程都会转发到Container 2 容器的 80 端口。

我们启动一个容器,配置 80 端口的转发:

 --rm 表示运行完自动删除该容器

--name 指定容器名

当我们通过 web 浏览器访问宿主机的 8088 端口时,会得到 nginx 主页

 

docker Host 网络
网络介绍

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

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

操作案例

下面我们一起来动手操作一下

可以看到 c1 容器是独立的网络配置, 而 c2 容器是和宿主机共享网络配置。

使用场景

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

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

Docker Container 的 other container 网络模式实现逻辑如下:

  • 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
  • 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用 other container 的 namespace
操作案例

创建一个 busybox 容器

使用 netcontainer1 的网络创建另外一个容器

 

进入两个容器,查看容器的 ip 信息,发现两个 ip 和 mac 完全一样


 

我们停止容器 1,再次看下容器 2 的网络,发现 eth0 网卡消失了,只有一个本地网络了

我们再次重启容器 1 和容器 2

再次查看,然后可以看到容器网络恢复

 

使用场景

在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输效率较高。但是两个容器之间存在依赖,如果依赖容器重启了,会导致另外一个服务的网络不可用。
 

docker none 网络
网络介绍

none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环),没有其他任何网卡。

操作案例

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

使用场景

  • 针对一些对安全性要求比较高并且不需要联网的应用, 可以使用 none 网络, 比如生成随机密码, 避免生成密码被第三方获取。
  • 一些第三方的应用可能需要 docker 帮忙创建一个没有网络的容器, 网络由第三方自己来配置。
     

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

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

相关文章

class072 最长递增子序列问题与扩展【算法】

class072 最长递增子序列问题与扩展【算法】 code1 300. 最长递增子序列 // 最长递增子序列和最长不下降子序列 // 给定一个整数数组nums // 找到其中最长严格递增子序列长度、最长不下降子序列长度 // 测试链接 : https://leetcode.cn/problems/longest-increasing-subsequen…

你知道MySQL中 group by 怎么优化吗

更好的阅读体验&#xff0c;请点击 YinKai s Blog。 ​ 在 MySQL 中 group by 用于按照一个或多个列对结果集进行分组。在讨论 group by 怎么优化之前&#xff0c;我们先来看看 group by 的执行流程&#xff0c;这样我们才能对症下药。 group by 执行流程 ​ 我们先用下面的 …

Ubuntu 18.04使用Qemu和GDB搭建运行内核的环境

安装busybox 参考博客&#xff1a; 使用GDBQEMU调试Linux内核环境搭建 一文教你如何使用GDBQemu调试Linux内核 ubuntu22.04搭建qemu环境测试内核 交叉编译busybox 编译busybox出现Library m is needed, can’t exclude it (yet)的解释 S3C2440 制作最新busybox文件系统 https:…

2024年网络安全竞赛-Web安全应用

Web安全应用 (一)拓扑图 任务环境说明: 1.获取PHP的版本号作为Flag值提交;(例如:5.2.14) 2.获取MySQL数据库的版本号作为Flag值提交;(例如:5.0.22) 3.获取系统的内核版本号作为Flag值提交;(例如:2.6.18) 4.获取网站后台管理员admin用户的密码作为Flag值提交…

udp多播组播

import socket ,struct,time# 组播地址和端口号 MCAST_GRP 239.0.0.1 MCAST_PORT 8888 # 创建UDP socket对象 sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # 绑定socket对象到本地端口号 # sock.bind((MCAST_GRP, MCAST_PORT)) …

【4】PyQt输入框

1. 单行文本输入框 QLineEdit控件可以输入单行文本 from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout from PyQt5.QtCore import * from PyQt5.QtGui import QIcon import sysdef init_widget(w: QWidget):# 修改窗口标题w.setWindowTitle(单行输…

前端面试——CSS面经(持续更新)

1. CSS选择器及其优先级 !important > 行内样式 > id选择器 > 类/伪类/属性选择器 > 标签/伪元素选择器 > 子/后台选择器 > *通配符 2. 重排和重绘是什么&#xff1f;浏览器的渲染机制是什么&#xff1f; 重排(回流)&#xff1a;当增加或删除dom节点&…

【面试经典150 | 二叉树】从中序与后序遍历序列构造二叉树

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;递归 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容…

Android : Room 数据库的基本用法 —简单应用

1.Room介绍&#xff1a; Android Room 是 Android 官方提供的一个持久性库&#xff0c;用于在 Android 应用程序中管理数据库。它提供了一个简单的 API 层&#xff0c;使得使用 SQLite 数据库变得更加容易和方便。 以下是 Android Room 的主要特点&#xff1a; 对象关系映射…

9.MySQL 索引

目录 ​​​​​​​概述 概念&#xff1a; 单列索引 普通索引 创建索引 查看索引 删除索引 唯一索引 创建唯一索引 删除唯一索引 主键索引 组合索引 创建索引 全文索引 概述 使用全文索引 空间索引 内部原理 相关算法&#xff1a; hash算法 二叉树算法 …

Spring基于XML文件配置AOP

AOP AOP&#xff0c;面向切面编程&#xff0c;是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象&#xff0c;一个对象包括静态的属性信息&#xff0c;包括动态的方法信息等。而AOP是横向的对不同事物的抽象&#xff0c;属性与属性、方法与方法、对象与对象都可以组成一个…

12.10多种编码方式,编码方案选择策略(递归级联),PDE,RLE代码

作者如何选择和设计编码方案&#xff0c;以实现高效的解压缩和高压缩比&#xff1f;BtrBlocks是否适用于所有类型的数据&#xff1f; 选择和设计编码方案&#xff1a; 结合多种高效编码方案&#xff1a;BtrBlocks 通过选择一组针对不同数据分布的高效编码方案&#xff0c;实现…

js判断是否对象自身为空

文章目录 一、前言二、JSON.stringify三、for in 配合 hasOwnProperty四、Object.keys五、Object.getOwnPropertyNames六、Object.getOwnPropertyNames 结合 Object.getOwnPropertySymbols七、Reflect.ownKeys八、最后 一、前言 如何判断一个对象为空&#xff1f; 先上结论&a…

MySql复习笔记03(小滴课堂) 事务,视图,触发器,存储过程

mysql 必备核心知识之事务的详细解析&#xff1a; 创建一个数据库表&#xff1a; 添加数据并开启事务。 添加数据并查询。 登录另一台服务器发现查不到这个表中的数据。 这是因为事务开启了&#xff0c;但是没有提交&#xff0c;只是把数据存到了内存中&#xff0c;还没有写入…

JOSEF 冲击继电器 ZC-23A DC48V 柜内安装,板前带座

系列型号 ZC-23冲击继电器&#xff1b;ZC-23A冲击继电器&#xff1b; ZC-23B冲击继电器 一、用途 冲击继电器ZC-23A DC48V 柜内安装板前带座 (以下简称继电器)&#xff0c;广泛用于直流操作的继电器保护及自动控制回路中&#xff0c;作为集中控制信号元件。 二、主要技术参…

力扣刷题总结 字符串(2)【KMP】

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 28.找出字符串中第一个匹配项的下标mid经典KMP4593重复的子字符串mid可以使用滑动窗口或者KMP KMP章节难度较大&#xff0c;需要深入理解其中…

Flink 本地单机/Standalone集群/YARN模式集群搭建

准备工作 本文简述Flink在Linux中安装步骤&#xff0c;和示例程序的运行。需要安装JDK1.8及以上版本。 下载地址&#xff1a;下载Flink的二进制包 点进去后&#xff0c;选择如下链接&#xff1a; 解压flink-1.10.1-bin-scala_2.12.tgz&#xff0c;我这里解压到soft目录 [ro…

OrangePi ZERO2 刷机与启动

镜像准备 用读卡器和Win32Diskimager刷写镜像到内存卡&#xff0c;镜像文件见下面百度云链接&#xff1a;https://pan.baidu.com/s/14aKTznc4Jvw4SoFF54JUTg 提取码&#xff1a;1815 刷写完毕后插回香橙派 串口登录 用MobaXterm和USB-TTL进行串口登录&#xff0c;MobaXterm软…

谈一谈网络协议中的应用层

文章目录 一&#xff0c;什么是HTTPHTTP的优缺点HTTPS 一&#xff0c;什么是HTTP 我们在通过网络进行传输数据时&#xff0c;我们要保证&#xff0c;我们在发送时构造的数据&#xff0c;在接收时也能够解析出来&#xff0c;这本质上就是一种协议&#xff0c;是一种应用层协议&…