docker自定义网络实现容器之间的通信

Background

  • docker原理
  • docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。
  • docker核心三大组件:image–镜像、container-容器、 repository-仓库。
  • docker使用的cpu、内存以及系统内核等资源都是直接使用宿主物理机的硬件,所以docker的性能比虚拟机高。
  • docker容器的本质是宿主机上的一个进程。通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。
  • docker可以对哪些资源进行隔离:1、文件系统;2、网络(network);3、进程间的通信;4、针对权限的用户和用户组;5、进程内的pid和宿主机的pid;6、主机名与域名等。
  • docker网络

Docker是一种轻量级容器化技术,允许通过隔离OS级的虚拟化方式在一个操作系统上运行多个应用。网络是Docker中的一个非常重要的组件,它允许容器之间进行通信和联网访问。本文主要介绍Docker网络的基础知识以及在容器化部署java程序时的应用

1、docker网络类型

docker网络有三个基本要素:网络类型、网络驱动和网络配置。

  • bridge
    这个是默认的网络类型,建立在宿主机的网络接口之上。
  • host
    这种网络类型,直接使用宿主机的网络栈,容器和宿主机共享网络栈。
  • overlay
    这种网络类型可以跨越多个Docker守护进程,通过内置的DNS服务,允许容器之间跨主机进行通信。
  • macvlan
    这种方式可以让容器拥有自己的MAC地址,从而可以直接与物理网络中的设备进行通信。
    适用环境:希望容器能够直接与物理网络接口进行通信,或希望每个容器具有独立的 IP 地址的场景。
    创建方法:使用 docker network create 命令并选择 --driver macvlan 参数来创建 Macvlan 网络。

Macvlan是一个新的尝试,是真正的网络虚拟化技术的转折点。Linux实现非常轻量级,因为与传统的Linux Bridge隔离相比,它们只是简单地与一个Linux以太网接口或子接口相关联,以实现网络之间的分离和与物理网络的连接。

Macvlan提供了许多独特的功能,并有充足的空间进一步创新与各种模式。这些方法的两个高级优点是绕过Linux网桥的正面性能以及移动部件少的简单性。删除传统上驻留在Docker主机NIC和容器接口之间的网桥留下了一个非常简单的设置,包括容器接口,直接连接到Docker主机接口。由于在这些情况下没有端口映射,因此可以轻松访问外部服务。

  • 创建MACVLAN网络:
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my-macvlan-network
  • 在MACVLAN网络上启动容器:
docker run -d --name my-container --network my-macvlan-network my-image

2、docker网络驱动

docker支持多种网络驱动程序,每种网络驱动的实现方式都不同。下面列出了docker支持的网络驱动程序。

1、bridge驱动:此驱动为docker的默认设置,docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。但与外界通信使用NAT,增加了通信的复杂性,在复杂场景下使用会有诸多限制。每个容器启动后会通过DHCP自动获取一个IP地址,容器间可以通过 IP 地址相互通信,但是容器重启IP会发生变化。

2、host驱动:使用这种驱动的时候,Docker容器和宿主机共用同一个network namespace,使用宿主机的网卡、IP和端口等信息。但是,容器其他方面,如文件系统、进程列表等还是和宿主机隔离的。host模式不存在虚拟化网络带来的额外性能负担。但是host驱动也降低了容器与容器之间、容器与宿主机之间网络层面的隔离性,引起网络资源的竞争与冲突。容器的网络配置与宿主机相同,可以通过宿主机的 IP 地址直接访问容器

3、overlay驱动:此驱动采用IETF标准的VXLAN方式,并且是VXLAN中被普遍认为最适合大规模的云计算虚拟化环境的SDN controller模式。在使用的过程中,需要一个额外的配置存储服务, 还需要在启动docker daemon的的时候额外添加参数来指定所使用的配置存储服务地址。overlay指的就是在物理网络层上再搭建一层网络,通过某种技术再构建一张相同的逻辑网络。需要互相通信的容器链接到相同的逻辑网络就可以通过容器名称互相通信

4、remote驱动:这个驱动实际上并未做真正的网络服务实现,而是调用了用户自行实现的网络驱动插件,使libnetwork实现了驱动的可插件化。

5、null驱动:使用这种驱动的时候,Docker容器拥有自己的network namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器除了network namespace自带的loopback网卡外,没有其他任何网卡、IP、路由等信息,需要用户为Docker容器添加网卡、配置IP等。这种模式如果不进行特定的配置是无法正常使用的,但是优点也非常明显,它给了用户最大的自由度来自定义容器的网络环境。

每个网络类型都具有自己的特点和适用场景,根据实际需求选择合适的网络创建方法非常重要。此外,还有其他网络驱动和网络插件可供选择,以满足不同环境的需求,例如 Calico、Weave 等。

3、docker网络配置

docker网络配置官方文档:https://docs.docker.com/reference/cli/docker/network

  • docker安装后会自动创建3种网络:bridge、host、none
# 查看命令
docker network ls

在这里插入图片描述

  • 创建一个自定义的Docker网络
docker network create yunlu

在这里插入图片描述

  • 将容器连接到一个已存在的Docker网络
# 第一种方式,my-container容器已经启动了
docker network connect yunlu my-container
# 第二种方式,my-container容器启动时通过 `--network yunlu` 或 `--net=yunlu`连接自定义网络
docker run -d --restart=always --name my-container --network yunlu -p 8080:8080 -v $(pwd):/app -w /app yunlu/openjdk:1.8-alpine java -Duser.timezone=GMT+08 -Dfile.encoding=utf-8 -Dspring.config.location=/app/application.yml -jar /app/app.jar
  • 查看一个Docker网络的详细信息
docker network inspect yunlu
  • 查看一个Docker网络下的所有容器
docker network inspect --format='{{.Containers}}' yunlu
  • 删除一个已存在的Docker网络
docker network rm yunlu

4、docker容器网络配置

我们可以在容器启动时通过 --network yunlu--net=yunlu连接自定义网络。bridge 网络是 docker 默认的网络类型,当创建容器时,如果不指定网络类型,则会自动创建一个桥接网络并将容器连接到该网络上。

在这里插入图片描述

  1. 查看某个容器的网络信息
# 第一种方式
docker inspect my-container | grep "NetworkMode"
# 第二种方式
docker inspect --format='{{.HostConfig.NetworkMode}}' my-container

5、容器化部署java程序

实现目标

容器化部署一个java程序huhang-server,该程序用到mysql、redis等服务,这些服务也是采用容器化部署。

两种实现思路
  1. huhang-server部署时网络使用host模式,mysql、redis等服务容器化部署时把所需端口映射出来供huhang-server使用;
  2. 使用自定义网络模式,先创建一个自定义网络yunlu,然后mysql、redis等服务所有容器都加入自定义网络yunlu,huhang-server也加入自定义网络yunlu,然后通过容器名称去访问mysql、redis等服务。
容器化部署java程序的两种方式:
  1. 对于一些简单的单体项目,可以使用 docker run 命令可以直接在命令行中运行容器,无需事先构建镜像;
  2. 如果项目较为复杂,涉及多个组件和配置,或者需要在不同环境中部署,建议使用 Dockerfile 构建自定义镜像。这样可以更好地管理和复用代码,并确保在不同环境中的一致性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

A Novel Two-Layer DAG-based Reactive Protocol for IoT Data Reliability in Metaverse

在IOT 场景中,需要保证数据的完整性和可靠性。通常区块链可以用来做这件事,但是IoT 设备的计算能力和贷款都是有限的。 对于PBFT 要求的通信量太大。 本文提出的 two layer directed acycle graph (2LDAG) 是一种被动共识协议,除非有节点主动…

快速构建 Debezium MySQL Example 数据库

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

EXCEL 在列不同单元格之间插入N个空行

1、第一步数据,要求在每个数字之间之间插入3个空格 2、拿数据个数*(要插入空格数1) 19*4 3、填充 4、复制数据到D列 5、下拉数据,选择复制填充这样1-19就会重复4次 6、全选数据D列排序,这样即完成了插入空格 以…

SQL语法-DQL-测试练习

因篇幅原因,本篇承接此篇->第八篇:SQL语法-DQL-数据查询语言-CSDN博客 本篇是对于SQL语法DQL语句的练习,因水平和精力有限(就不像前两篇的DDL,DML那样自出练习了)直接照搬了【黑马程序员】在哔哩哔哩的…

基于卷积神经网络的图像去噪

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 基于卷积神经网络的图像去噪 完整代码:基于卷积神经网络的图像去噪.rar资源-CSDN文库 https://download.csdn.net/download/abc9918351…

如何在java中使用 Excel 动态函数生成依赖列表

前言 在Excel 中,依赖列表或级联下拉列表表示两个或多个列表,其中一个列表的项根据另一个列表而变化。依赖列表通常用于Excel的业务报告,例如学术记分卡中的【班级-学生】列表、区域销售报告中的【区域-国家/地区】列表、人口仪表板中的【年…

vue3 + ts + echart 实现柱形图表

首先封装Echart一个文件 代码如下 <script setup lang"ts"> import { ECharts, EChartsOption, init } from echarts; import { ref, watch, onMounted, onBeforeUnmount } from vue;// 定义props interface Props {width?: string;height?: string;optio…

网工内推 | 信息安全售前,国企、上市公司,补贴福利多

01 中电科网络安全科技有限公司 招聘岗位&#xff1a;信息安全售前工程师 职责描述&#xff1a; 1.负责为客户提供整体信息安全规划、IT治理需求调研、现状分析、蓝图规划与实施路线设计&#xff0c;为客户提供设计方案&#xff1b; 2.承担行业信息安全发展研究、行业业务规划…

vue3 vuex

目录 Vuex 是什么 什么是“状态管理模式”&#xff1f; 什么情况下我应该使用 Vuex&#xff1f; 使用方法&#xff1a; 提交载荷&#xff08;Payload&#xff09; 对象风格的提交方式 使用常量替代 Mutation 事件类型 Mutation 必须是同步函数 在组件中提交 Mutation …

sentinel中监听器的运用--规则管理

sentinel中监听器的运用–规则管理 规则结构 类图关系 类关系图如下 Rule 将规则抽象成一个类, 规则与资源是紧密关联的, 也就是说规则作用于资源。因此, 我们需要将规则表示为一个类, 并包含一个获取资源的方法 这里采用接口的原因就是规则是一个抽象概念而非具体实现。…

导入excel某些数值是0

目录 导入excel某些数值是0数据全部都是0原因解决 部分数据是0原因解决 导入excel某些数值是0 数据全部都是0 有一列“工单本月入库重量”全部的数据都是0 原因 展示的时候&#xff0c;展示的字段和内表需要展示的字段不一致&#xff0c;导致显示的是0。 解决 修改展示的字…

Vue | (四)使用Vue脚手架(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;初始化脚手架&#x1f407;创建初体验&#x1f407;分析脚手架结构&#x1f407;关于render&#x1f407;查看默认配置 &#x1f4da;ref与props&#x1f407;ref属性&#x1f407;props配置项 &#x1f4da;混入&#x1f4da;插件&#x1f4da;scoped样…

DBeaver的下载安装和连接MySQL数据库

DBeaver的下载安装和连接MySQL数据库 1、dbeaver的下载 dbeaver是一款的数据库连接工具&#xff0c;免费&#xff0c;跨平台。 官网&#xff1a;https://dbeaver.io/ 下载地址&#xff1a;https://dbeaver.io/download/ GitHub下载地址&#xff1a;https://github.com/dbeav…

使用向量数据库pinecone构建应用02:检索增强生成RAG

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

记一次 Flink 作业启动缓慢

记一次 Flink 作业启动缓慢 背景 应用发现&#xff0c;Hadoop集群的hdfs较之前更加缓慢&#xff0c;且离线ELT任务也以前晚半个多小时才能跑完。此前一直没有找到突破口所以没有管他&#xff0c;推测应该重启一下Hadoop集群就可以了。今天突然要重启一个Flink作业&#xff0c…

基于springboot+vue的中小型医院网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Nginx解决单页应用刷新报错404的问题

一、问题 1.1 问题概述 将React应用打包后&#xff0c;部署到服务器上&#xff0c;在非首页的地方使用浏览器自带的刷新功能&#xff0c;页面刷新失败&#xff0c;显示404&#xff1b; 如果你的问题和我类似&#xff0c;可以往下看~ 1.2 问题详细描述 在项目开发完成后&am…

【深度学习】微调通义千问模型:LoRA 方法,微调Qwen1.8B教程,实践

官网资料: https://github.com/QwenLM/Qwen/blob/main/README_CN.md 文章目录 准备数据运行微调设置网络代理启动容器执行 LoRA 微调修改 finetune/finetune_lora_single_gpu.sh运行微调 执行推理 在本篇博客中&#xff0c;我们将介绍如何使用 LoRA 方法微调通义千问模型&#…

【动态规划专栏】背包问题:分割等和子集

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

百面嵌入式专栏(经验篇)如何在面试中介绍自己的项目经验

文章目录 1. 在面试前准备项目描述,别害怕,因为面试官什么都不知道2. 准备项目的各种细节,一旦被问倒了,就说明你没做过3.不露痕迹地说出面试官爱听的话4.一定要主动,面试官没有义务挖掘你的亮点5.一旦有低级错误,可能会直接出局6.引导篇:准备些加分点,在介绍时有意提到…