Docker--Docker Network(网络)

Docker为什么需要网络管理

容器的网络默认与宿主机及其他容器之间是隔离的,但有时也需要与宿主机和容器进行通信。

容器间及容器与外部通信的需求

  • 容器间通信:在Docker环境中,容器默认与宿主机及其他容器是相互隔离的。然而,在实际应用中,多个容器之间可能需要相互通信,以实现数据共享、服务调用等功能。这就需要对容器的网络进行合理配置和管理,以确保它们能够按照预期进行通信。
  • 容器与外部通信:容器内部可能运行着一些网络应用,如Web应用、数据库等,这些应用需要能够被外部访问。为了实现这一点,需要为容器配置适当的网络设置,如端口映射、IP地址等,以确保外部用户可以访问到容器内部的应用。

网络隔离与安全性的需求

  • 网络隔离:Docker容器提供了良好的隔离性,每个容器都有自己的文件系统、进程空间和网络空间。网络隔离是容器隔离性的重要组成部分,它确保了容器之间的网络栈是独立的,从而避免了网络攻击和干扰。
  • 安全性:通过合理的网络管理,可以为容器实施访问控制、防火墙规则等安全措施,以提高容器的安全性。例如,可以限制容器对外部网络的访问权限,防止恶意攻击和数据泄露。

定制化网络的需求

  • 特殊网络需求:在某些场景下,容器可能需要更高的定制化网络配置。例如,可能需要定制特殊的集群网络、容器间的局域网等。这些定制化需求需要通过Docker的网络管理功能来实现。

Docker 网络架构简介

Docker的网络架构是一个复杂而强大的系统,它基于容器网络模型(Container Network Model,CNM)、Libnetwork以及一系列驱动来实现。

CNM

CNM:全名Container Network Model,容器网络模型,旨在标准化和简化容器网络的管理。
CNM主要包含以下三个组件:

  • Sandbox:沙盒提供了容器的虚拟网络栈,包括端口、套接字、IP路由表、防火墙、DNS配置等内容。它主要用于隔离容器网络与宿主机网络,形成完全独立的容器网络环境。
  • Endpoint:终端是虚拟网络的接口,类似于普通网络接口或网络适配器。它的主要职责是负责创建连接,将沙盒连接到网络。一个Endpoint只能接入某一个网络,当容器需要接入到多个网络时,就需要多个Endpoint。
  • Network:网络是Docker内部的虚拟子网,使得网络内的参与者能够进行通讯。它可以是桥接网络、覆盖网络等,具体类型由驱动实现。
    在这里插入图片描述

Libnetwork

Libnetwork是CNM的一个标准实现,也是Docker网络架构的核心组件。它是开源库,采用Go语言编写,实现了CNM中定义的全部三个组件,并提供了以下额外功能:

  • 本地服务发现:使得容器能够发现同一网络内的其他服务。
  • 基于Ingress的容器负载均衡:实现了容器间的负载均衡,提高了应用的可用性和性能。
  • 网络控制层和管理层功能:提供了丰富的网络配置和管理选项,使得用户可以灵活地定制网络拓扑和策略。

驱动

驱动是Docker网络架构中实现数据层相关内容的组件,它负责处理网络的连通性和隔离性等核心任务。Docker内置了多种驱动,以满足不同的网络需求:

  • Bridge Driver:桥接驱动,在Docker管理的主机上创建一个Linux网桥(默认为docker0)。默认情况下,网桥上的容器可以相互通信,也可以通过配置实现对外部容器的访问。桥接网络是解决主机内多容器通讯的最佳选择。
  • Host Driver:主机驱动,使得容器与主机共享同一网络命名空间。在这种模式下,容器将直接使用主机的网络协议栈、路由表及iptables规则等,实现了与主机网络的无缝对接。
  • Overlay Driver:覆盖驱动,实现了跨主机的多子网网络方案。它主要通过使用Linux bridge和vxlan隧道实现,底层通过类似于etcd或consul的KV存储系统实现多机的信息同步。覆盖网络是解决跨主机多子网网络问题的最佳选择。
  • None Driver:无网络驱动,使得Docker容器完全隔离,无法访问外部网络。在这种模式下,容器不会被分配IP地址,也无法与其他容器和主机通信。

在这里插入图片描述

docker网络管理命令

docker network create

创建自定义网络

语法:

docker network create [OPTIONS] NETWORK

关键参数

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

例子:

docker network create --driver=bridge --subnet=192.168.0.0/16 br0

docker network inspect

查看网络详情

语法:

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

例子:

docker network inspect br0

docker network connect

将容器连接到网络

语法:

docker network connect [OPTIONS] NETWORK CONTAINER

例子:

docker network connect br0 mynginx1

docker network disconnect

断开网络

语法:

docker network disconnect [OPTIONS] NETWORK CONTAINER

例子:

docker network disconnect br0 mynginx

docker network prune

删除不同的网络

语法:

docker network prune [OPTIONS]

例子:
在这里插入图片描述

docker network rm

删除1个或多个网络

语法:

docker network rm NETWORK [NETWORK...]

例子:
在这里插入图片描述

docker network ls

查看网络

网络管理基本操作

创建网络并查看:

docker network create --subnet=172.18.0.0/16 mynetwork

在这里插入图片描述
创建一个容器并加入网络:

docker run -itd --name mynginx2 --network mynetwork nginx:1.23.4

查看容器详情:

docker inspect mynginx2

在这里插入图片描述
没有加入网络的情况下:

docker run -itd --name mynginx3 nginx:1.23.4
docker inspect mynginx

在这里插入图片描述

连接网络后多出一个网络:

docker network connect mynetwork mynginx3

在这里插入图片描述
断开连接后再查看就没有了:

docker network disconnect mynetwork mynginx3

此时无法删除该网络,因为创建的两个容器都跟这网络连接着,必须先删除掉相关的容器:

docker network rm mynetwork

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

Docker Bridge

Docker Bridge网络采用内置的bridge驱动,bridge驱动底层采用的是Linux内核中Linux bridge技术。
在这里插入图片描述

下面介绍几个操作实例:

容器间的网络通信

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

docker run -itd --name c1 busybox:latest
docker run -itd --name c2 busybox:latest

在这里插入图片描述
查看两个容器的通信情况:

docker exec -it c1 ip a

在这里插入图片描述

docker exec -it c2 ip a

在这里插入图片描述
尝试c1能否与c2互通

docker exec -it c1 ping 172.17.0.4

在这里插入图片描述
查看网络bridge详情:

docker network inspect bridge

在这里插入图片描述
该网络已经连接了两个容器,即 c1 和 c2。

当把c1容器停止运行,会发现bridge会少一个容器连接

docker stop c1

创建自定义bridge

通过 create 命令来创建新的 bridge:

docker network create -d bridge new-bridge

查看新网络的详情:

docker network inspect new-bridge

在这里插入图片描述
运行新容器时,指定一个网络:

docker run -itd --name c3 --network new-bridge busybox:latest
docker inspect c3 | grep "Networks" -A 17

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

docker network inspect new-bridge

在这里插入图片描述

DNS解析

让c1、c2连接默认的bridge,c3、c4连接new-bridge

docker run -itd --name c4 --network new-bridge busybox:latest

在这里插入图片描述

docker network inspect bridge | grep "Containers" -A 20

在这里插入图片描述

docker network inspect new-bridge | grep "Containers" -A 20

在这里插入图片描述
查看c1、c2的ip:

docker exec -it c1 ip a

在这里插入图片描述

docker exec -it c2 ip a

在这里插入图片描述
看能不能互通

docker exec -it c1 ping 172.17.0.4

在这里插入图片描述

docker container exec -it c1 ping c2

c1 容器 ping c2 容器名发现找不到 IP 地址, 确定默认 bridge 网络不支持DNS

验证 c3 和 c4 是否能够使用 DNS 解析服务:
在这里插入图片描述

docker exec -it c3 ping 172.18.0.3

在这里插入图片描述

docker container exec -it c3 ping c4

c3 容器 ping c4 容器名 可通 确定自定义 bridge 支持 DNS

Docker Host

docker容器运行默认都会分配独立的Network NameSpace隔离子系统;
如果基于host网络模式,容器将不会获得一个独立的Network NameSpace,而是和宿主机共用一个Network NameSpace

在这里插入图片描述

我们可以验证下:

让容器c1连接bridge网络模式、c2连接host网络模式

docker run --name c1 -itd busybox:latest
docker run --name c2 -itd --network=host busybox:latest

分别查看c1和c2的ip

docker exec c1 ip a
docker exec c2 ip a

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

Docker Container

Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模式。
在这个模式下容器的网络隔离性会处于bridge和host模式之间。
Docker Container共享其他容器的网络环境,则至少这两个容器之间不存在隔离
在这里插入图片描述

下面我们来验证下:
创建一个busybox容器

docker run -itd --name netcontainer1 busybox:latest

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

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

docker run -itd --name netcontainer2 --network container:netcontainer1 busybox

查看netcontainer1和netcontainer2 的网络配置:

docker exec -it netcontainer1 ifconfig

在这里插入图片描述

docker exec -it netcontainer2 ifconfig

在这里插入图片描述
如果我们停止netcontainer1的容器运行,再查看netcontainer2的网络配置:
在这里插入图片描述
会发现少了eth0网卡,只有一个本地的网卡

我们对两个容器都重启一下(先启动netcontainer1):

docker restart netcontainer1
docker restart netcontainer2

在这里插入图片描述
网络配置恢复

none network

none network就是没有网络。
挂在这个网络下,除了本地lo,没有其他我网卡

下面我们来验证下:

docker run -itd --name c1 --network none busybox:latest
docker exec -it c1 ip a

在这里插入图片描述

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

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

相关文章

深入浅出 MyBatis | CRUD 操作、配置解析

3、CRUD 3.1 namespace namespace 中的包名要和 Dao/Mapper 接口的包名一致! 比如将 UserDao 改名为 UserMapper 运行发现抱错,这是因为 UserMapper.xml 中没有同步更改 namespace 成功运行 给出 UserMapper 中的所有接口,接下来一一对…

UE5材质节点Panner

Panner节点可以让贴图动起来,快捷键是P,Speed的数值大小就是贴图移动的快慢,x和y是方向 这个节点可以用来做,传送带,护盾,河流,岩浆,瀑布等 制作岩浆流动效果 创建材质,…

Kimi进行学术方向选择精讲!

目录 1.文献搜索 2.辅助选题 3.选题判断 在我们之前的文章中,小编都强调了选题在文章价值中的核心作用。一篇优秀的文章背后,肯定有一个精心挑选的选题。选题的好坏直接影响着文章能够发表的期刊等级。许多宝子们却采取了相反的做法,将大量…

Google Veo AI 视频生成工具评测:AI视频生成的未来已来

近年来,AI技术的迅猛发展使得我们对虚拟现实的认知不断发生改变,尤其是在视频生成领域。Google 最新推出的 Veo AI 视频生成工具,无疑为这一领域带来了前所未有的突破。通过与其他知名工具如 OpenAI 的 Sora 进行对比,Veo 显示出令…

idea 8年使用整理

文章目录 前言idea 8年使用整理1. 覆盖application配置2. 启动的时候设置编辑空间大小,并忽略最大空间3. 查询类的关系4. 查看这个方法的引用关系5. 查看方法的调用关系5.1. 查看被调用关系5.2. 查看调用关系 6. 方法分隔线7. 选择快捷键类型8. 代码预览插件9. JReb…

3.微服务灰度发布落地实践(组件灰度增强)

文章目录 前言调用链示图dubbo服务之间的的调链cloud 服务之间的调用链 网关servlet容器: 标签续传1.定义插件2.实现灰度增强拦截 线程池: 标签续传1.拦截Runnable或Callable,接口增强实现标签续传;Callable 插件定义Runnable 插件定义拦载Callabl或Runnable构造(可共用)拦载ru…

java基础知识22 java的反射机制

一 java反射机制 1.1 概述 Java反射,程序在运行时,动态获取类信息(类元数据),获取字段属性,动态创建对象和调用方法。Spring框架正是基于反射机制,通过我们的配置文件,在项目运行时…

[羊城杯 2024]Check in

下载附件,解压的时候发现注释:5unVpeVXGvjFah 解压得到的flag.txt文件内容如下: 注释5unVpeVXGvjFah放到随波逐流中一键解码发现base58解码得出一个正常点的字符串:Welcome2GZ,应该是某个key? 去hex解码&am…

C++Primer 控制流

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

RJ45网口模块设计

1、以太网概述及RJ45实物 2、常用网口信号介绍 3、RJ45网口布局布线要点分析 4、总结 1、变压器下面需要进行挖空处理,以免底下的铜引入干扰,(将多边形挖空区域的所在层设置为Multi-Layer多层) 2、为了更直观的看一个类中线的长…

Metagenome宏基因组,未识别的物种unclassified

1:"Bacteria|Proteobacteria|Betaproteobacteria|Neisseriales|Neisseriaceae|Kingella" 2:"Bacteria|Proteobacteria|Betaproteobacteria|Neisseriales|Neisseriaceae|unclassified" # 未识别到的/未注解到的…

深度学习笔记1:神经网络与模型训练过程

参考博客:PyTorch深度学习实战(1)——神经网络与模型训练过程详解_pytorch 实战-CSDN博客 人工神经网络 ANN:张量及数学运算的集合,排列方式近似于松散的人脑神经元排列 组成 1)输入层 2)隐…

【多模态】从零学习多模态——2024学习笔记总结

从零学习多模态——2024学习笔记总结 前言1. preliminary2. Transformer和NLP基础3. 多模态模型原理和架构学习4. 动手实验多模态模型第一步尝试Swift框架使用数据验证 5. 总结 前言 2024快结束啦,半年抽空学了学多模态还挺好玩的,学习和踩坑记录记一下&…

CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读

24年5月的论文,上一版就是ReconFusion 目录 一、概述 二、相关工作 1、2D先验 2、相机条件下的2D先验 3、多视角先验 4、视频先验 5、前馈方法 三、Method 1、多视角扩散模型 2、新视角生成 3、3D重建 一、概述 该论文提出一种CAT3D方法,实现…

Python中构建终端应用界面利器——Blessed模块

在现代开发中,命令行应用已经不再仅仅是一个简单的文本输入输出工具。随着需求的复杂化和用户体验的重视,终端界面也逐渐成为一个不可忽视的设计环节。 如果你曾经尝试过开发终端UI,可能对传统的 print() 或者 input() 函数感到不满足&#…

5.若依的角色权限控制

RBAC 基于角色的访问控制,通过角色来分配和管理用户的菜单权限。 修改课程管理的菜单到主类目下 新建角色并分配菜单 新建用户并分配角色 添加一个根菜单,父级为主类目

flutter插件开发-ios

flutter插件开发是一个重要的技能,拓展flutter与原生的通信,将一些公用的东西封装,给不同的项目使用。 阅读前置: flutter基本通道调用 objective-c基础语法 ios项目基础知识 目录 1、创建一个插件项目2、项目结构3、编写原生代码…

手机租赁平台开发全攻略打造高效便捷的租赁服务系统

内容概要 手机租赁平台开发,简单说就是让用户能轻松租赁各类手机的高效系统。这一平台不仅帮助那些想要临时使用高端手机的人们节省了不少资金,还为商家开辟了新的收入渠道。随着智能手机的普及,很多人并不需要长期拥有一部手机,…

【从零开始入门unity游戏开发之——C#篇34】C#匿名函数(delegate )和Lambda表达式

文章目录 一、匿名函数(delegate )1、什么是匿名函数?2、匿名函数的基本语法2.1 语法2.2 **没有参数的匿名函数:**2.3 **有参数的匿名函数:**2.4 **有返回值的匿名函数:** 3、匿名函数的使用示例3.1 作为参…

echarts没有map地图解决方案

在echarts4.9以后的版本中移除了map地图 使用命令npm install echarts --save它会下载最新版本 的echarts 所有我们要下载回echarts4.9版本中 如果已经下载了最新的可以卸载 // 卸载echarts运行: npm uninstall echarts然后再去下载4.9版本 // 安装4.9版本的ech…