Docker学习——⑦

news2025/1/12 6:01:31

文章目录

  • 1、Docker 为什么需要网络管理
  • 2、Docker 网络架构简介
    • 2.1 CNM
    • 2.2 Libnetwork
    • 2.3 驱动
  • 3、常见网络类型
  • 4、docker 网络管理命令
  • 5、网络详解
    • 5.2 docker Bridge 网络
    • 5.2 docker Host 网络
    • 5.3 docker Container 网络
    • 5.4 docker none 网络

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

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

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

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

2、Docker 网络架构简介

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

2.1 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 通信

2.2 Libnetwork

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

2.3 驱动

驱动主要负责实现数据层相关内容,例如网络的连通性和隔离性是由驱动来处理的。驱动通过实现特定网络类型的方式扩展了 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创建网络
docker network connect连接网络
docker network disconnect断开网络
docker network lsdocker network list列出网络
docker network prune删除不使用的网络
docker network inspect查看网络详情
docker network rmdocker network remove删除 1 个或者多个网络

docker network create
创建自定义网络

docker 自带了三个网路,如果创建一个自定义网络,那么这里就会多一个网络

在这里插入图片描述

docker network create [OPTIONS] NETWORK

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

创建网路,指定子网

docker network create mynet1 --subnet=192.168.0.0/16

在这里插入图片描述

如果在创建容器时就指定网络,该容器只会有这个一个网络

如果在创建容器时,不指定网络,通过docker network connect连接到一个网络上,那么这个容器会多一个docker0网络

多的就是这个
在这里插入图片描述
在这里插入图片描述

docker network inspect
查看网络详情

docker network inspect [OPTIONS] NETWORK [NETWORK...]

关键参数
-f, --format:指定格式

查看这个网络的详情

docker network inspect mynet1

在这里插入图片描述

查看默认的桥接网络中都有哪些容器

docker network inspect bridge

在这里插入图片描述

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

docker network connect [OPTIONS] NETWORK CONTAINER

关键参数
- -ip:指定 IP 地址
- -ip6:指定 IPv6 地址

启动一个busybox容器

docker run -it -d --name busybox busybox:latest

在这里插入图片描述

进入容器,通过ifconfig命令查看网络配置

在这里插入图片描述

退出容器,把容器busybox加入到网络mynet1中

docker network connect mynet1 busybox

再进入容器,通过ifconfig命令查看网络配置

在这里插入图片描述

再查看网络详情

在这里插入图片描述

说明已经成功将容器加入到网络中

docker network disconnect
断开网络

docker network disconnect [OPTIONS] NETWORK CONTAINER

关键参数
-f:强制退出

将容器busybox端口网络mynet1

docker network disconnect mynet1 busybox

查看网络mynet1的详情
在这里插入图片描述

进入busybox内部查看网络配置,确实断开了

在这里插入图片描述

docker network prune
删除不使用的网络

docker network prune [OPTIONS]

关键参数
-f, --force :不提示

docker network rm
删除 1 个或者多个网络

docker network rm NETWORK [NETWORK...]

关键参数
-f:强制退出

删除网络mynet1

在这里插入图片描述

docker network ls
列出网络

docker network ls [OPTIONS]

别名

docker network list

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

在这里插入图片描述

5、网络详解

5.2 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 是内核中网桥的名字。

在这里插入图片描述

容器间的网络通信

关于 BusyBox 镜像介绍:
BusyBox 是一个集成了一百多个最常用 Linux 命令和工具(如 cat、echo、grep、mount、telnet 等)的精简工具箱,它只需要几 MB 的大小,很方便进行各种快速验证,被誉为“Linux 系统的瑞士军刀”

BusyBox 可运行于多款 POSIX 环境的操作系统中,如 Linux(包括Android)、Hurd、FreeBSD 等

启动两个busybox容器,用两个shell分别进入容器内,查看网络配置,然后ping对方

docker run -it -d --name b1 busybox
docker run -it -d --name b2 busybox

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以看到容器之间是能相互ping通的,因为它们都加入了bridge网络

docker network inspect bridge

在这里插入图片描述

停止容器b1,此时它也会退出bridge网络,bridge网络中只有容器b2

在这里插入图片描述

在这里插入图片描述

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

可以通过 create 命令来创建新的 bridge

docker network create mynet

在这里插入图片描述

在这里插入图片描述

创建运行busybox容器,并指定网络都为mynet

docker run -it -d --name busybox1 --network mynet busybox
docker run -it -d --name busybox2 --network mynet busybox

在这里插入图片描述

容器busybox1和busybox2是能相互ping,因为它们在同一个网络中,这里就不再验证了

在这里插入图片描述

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

c1 和 c2 容器默认连接 bridge 网络,进入c1中,通过域名ping c2

在这里插入图片描述

在这里插入图片描述

ping 域名不行,但是ping ip可以

用前面创建的busybox1通过域名pingbusybox2,查看是否能ping通

在这里插入图片描述

这里是能ping通的,因为busybox1和busybox2链接的是自定义的bridge网路,自定义的bridge网路是支持DNS域名解析的,所以能ping通

而默认的bridge网络是不支持DNS域名解析的

5.2 docker Host 网络

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

在这里插入图片描述

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

docker run -it -d --name c3 --network=host busybox

分别查看c3、c1和宿主机的网络配置信息

c3:
在这里插入图片描述

c1:
在这里插入图片描述

宿主机:
在这里插入图片描述

通过对比发现容器c3的网络配置与宿主机完全一样,原因就是使用了 --network=host
而容器c1是独立的网络配置

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

5.3 docker Container 网络

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

Docker Container 的 other container 网络模式可以参考下图:

在这里插入图片描述

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

1.查找 other container(即需要被共享网络环境的容器)的网络 namespace
2.将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用 other container 的 namespace

创建一个容器c4,不指定网络,则会加入默认的bridge网络,再创建另一个容器c5,指定网络与c4共享

docker run -it -d --name c4 busybox
docker run -it -d --name c5 --network container:c4 busybox

在这里插入图片描述

分别进入这两个容器,查看网络配置信息

在这里插入图片描述

在这里插入图片描述

它们的网络配置信息完全一模一样,因为容器c5用的就是容器c4的网络配置信息

将容器c4停止,再次进入容器c5,查看网络配置信息

在这里插入图片描述
在这里插入图片描述

结果就是eth0 网卡直接消失了,只有一个本地网络了

重启容器c4和c5,再次进入容器c5内,查看网络配置信息

在这里插入图片描述

此时eth0 网卡又回来了

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

5.4 docker none 网络

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

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

docker run -it -d --name c6 --network=none busybox

进入容器c6内,查看网络配置信息

在这里插入图片描述

此时ping谁都不行,因为没有外部网络ip

使用场景:

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

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

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

相关文章

制造企业使用设备健康管理平台的好处

智能科技的发展不仅改变了我们的日常生活,也给工业制造领域带来了巨大的变化。在制造业生产线上,每天都在使用各种不同的机器设备来生产我们日常使用的物品。然而,这些设备的维护、维修和状态监测成为了制造企业的一大挑战。随着科技的发展&a…

Asset Bundles Browser

unity Asset Bundles Browser 删除图中的Test后使用: 下载链接https://download.csdn.net/download/qq_38513810/87554838?spm1001.2014.3001.5503

【IDE】【实战系列】掌握这些技巧发现阅读源码不过如此简单

文章目录 IDE 版本前言IDE Debug主界面介绍字段断点(field breakpoints)使用方式配置EnabledSuspendLog 行断点(line breakpoints)使用方式配置方式 方法断点(method breakpoints)使用方式配置方式 异常断点…

Linux编译器---gcc/g++的使用

一、背景知识 在Linux系统中,GCC是一个非常重要的工具,因为它使得开发者可以使用C和C等语言编写高性能的程序。它主要包括四个方面: 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码&#xff0…

ECharts:显示暂无数据

ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求,实现各种炫酷的统计图表效果。 如上图所示,有数据的时候固然好看,但是当它没有数据的时候,就是光秃秃的一片,所…

Peter算法小课堂—自定义容器

太戈编程第308题 暴力法 cin>>n>>m; for(int i0;i<n;i) cin>>name[i]>>year[i]; for(int i0;i<m;i){int x;string y;cin>>x>>y;int OK0;for(int j0;j<n;j){if(name[j]y&&year[j]x){OK1;break;}}cout<<OK<<…

彭州市民政局“四个聚焦” 推动未成年人保护工作

聚焦机制完善。以“六大保护”为主导&#xff0c;聚焦“27&#xff08;市级部门&#xff09;13&#xff08;镇、街道&#xff09;”整体联动&#xff0c;定期开展信息交流会、跨部门协同工作培训会等活动&#xff0c;不断健全协调机制、完善协同体系&#xff0c;进一步提升全市…

springboot vue mysql的在线竞拍拍卖系统

基于SpringBoot的在线拍卖系统,springboot vue mysql (毕业论文10168字以上,共34页,程序代码,MySQL数据库) 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue 【技术栈】 Java, SpringBoot, Jquery, Layui, MYSQL, HTML, CSS, JAVASCRIPT, Ajax 7707 java毕业设计 springboot v…

进博会再现上亿大单 EZZ携手HIC海橙嗨选签署2024年度合作备忘录

正在举行的第六届中国国际进口博览会上&#xff0c;再现上亿大单。11月6日&#xff0c;在澳大利亚新南威尔士州政府代表的见证下&#xff0c;澳交所基因组龙头上市公司EZZ生命科学和中国跨境社交电商龙头HIC海橙嗨选签署2024合作备忘录&#xff0c;在未来的一年&#xff0c;EZZ…

vue 数字软键盘 插件 封装 可拖动

1、效果图 2、使用方式 <Keyboard v-if"show" close"show false" :inputDom"$refs.input" /> 封装的数字键盘 Keyboard.vue 组件代码 <template><divclass"keyboard"ref"keyboard":style"{ left: …

日本it培训班,如何选择靠谱的赴日IT培训班?

随着科技的发展&#xff0c;信息技术行业在全球范围内迅速发展&#xff0c;并呈现出蓬勃的发展态势&#xff0c;在日本&#xff0c;IT行业也成为一种极为热门的职业选择。日本专门学校在这个领域内培养了许多IT从业者&#xff0c;成为了众多IT公司的培养基地。如果你对IT产业感…

【前端异常】JavaScript错误处理:分析 Uncaught(in promise) error

这里写目录标题 一、Promise是什么二、什么是 Uncaught(in promise) error三、解决方案3.1 使用catch方法处理Promise的错误3.2 使用 async/await 处理Promise的错误3.3 全局异常处理 四、结论 在开发过程中&#xff0c;JavaScript的错误处理是一个老生常谈的话题。当应用程序发…

AI机器人软件定制流程

一、项目概述 AI机器人软件定制流程是根据客户的需求&#xff0c;定制开发一款具有人工智能功能的机器人软件。本方案将详细介绍AI机器人软件定制的整个流程&#xff0c;包括需求分析、设计、开发、测试和交付等环节。 二、需求分析 在定制AI机器人软件之前&#xff0c;需要…

Linux系统上配置MySQL自动备份

1、编写Shell脚本&#xff0c;并保存为.sh文件 #!/bin/bash# 获取当前日期和时间 current_date$(date %Y%m%d) current_time$(date %H%M%S)# 设置备份文件名 path"/usr/local/mysql5.7/bak" bakFileName"dbname_backup_${current_date}_${current_time}.sql&qu…

阿里云国际站:应用实时监控服务

文章目录 一、阿里云应用实时监控服务的概念 二、阿里云应用实时监控服务的优势 三、阿里云应用实时监控服务的功能 四、写在最后 一、阿里云应用实时监控服务的概念 应用实时监控服务 (Application Real-Time Monitoring Service) 作为一款云原生可观测产品平台&#xff…

React Native简介 说明为什么要学习React Native

首先 什么是 React Native &#xff1f; React Native 是 Facebook 在 React.js Conf 2015 上推出了开源框架 React Native (简称 RN)是 React 的一个原生 (Native) 扩展 它允许我们通过 React 语法&#xff0c;来开发ios 和Android 原生应用 简单说 由Facebook发布 是一种Re…

笔尖笔帽检测1:笔尖笔帽检测数据集(含下载链接)

笔尖笔帽检测1&#xff1a;笔尖笔帽检测数据集(含下载链接) 目录 笔尖笔帽检测1&#xff1a;笔尖笔帽检测数据集(含下载链接) 1. 前言 2. 手笔检测数据集 &#xff08;1&#xff09;Hand-voc1 &#xff08;2&#xff09;Hand-voc2 &#xff08;3&#xff09;Hand-voc3 …

【OpenCV(3)】linux arm aarch 是 opencv 交叉编译与使用

文章目录 1、直接找github 别人编译好的2、自主编译参考 3使用CMake检查 参考 1、直接找github 别人编译好的 测试很多&#xff0c;找到一个可用的。 https://github.com/dog-qiuqiu/libopencv 它用了超级模块&#xff01; OpenCV的world模块也称为超级模块&#xff08;supe…

gStore入选BenchCouncil年度世界开源系统杰出成果

“只以贡献分高下” BenchCouncil&#xff08;国际测试委员会&#xff09; 邀请了多位独立科学家 从2022至2023年度数万项开源相关成果中 遴选出了102项代表性成果 在确定主要贡献者的基础上 产生了开源领域 年度人才榜、机构榜、国家榜 共195人进入榜单 中国在“开源…

Marin说PCB之 PCB封装和原理图封装的藕断丝连

最近天气开始降温了&#xff0c;小编我不得不拿出珍藏多年的秋裤穿上了&#xff0c;就是走路不太方便&#xff0c;有点紧啊&#xff0c;可能是当时衣服尺码买小了吧&#xff0c;不可能是我吃胖了&#xff0c;这个绝对不可能。 话说小编我今年属实有点走霉运啊&#xff0c;下班和…