docker Compose-网络设置

目录

一、概述

二、容器网络模型(了解)

CNM主要有三部分组成

CNM驱动接口

Docker内置网络驱动

三、Docker Compose-网络设置二

一、概述

三、自定义网络

四、配置默认网络

五、已存在的网络


一、概述

随着微服务的事件,应用的越来越多, 经常会碰到需要多个容器共同协作, 这样就需要多个容器之间能够互相访问。Docker提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。随着 docker 的快速发展,其网络架构也在不断的演进。

二、容器网络模型(了解)

Docker在 1.9 版本中引入了一整套的 docker network 子命令和跨主机网络支持。允许用户可以根据他们应用的拓扑架构创建虚拟网络并将容器接入其所对应的网络。网络部分代码就已经被抽离并单独成为了 docker 的网络库(libnetwork)。在此之后,容器的网络模式也被抽象变成了统一接口的驱动。 为了标准化网络驱动的开发步骤和支持多种网络驱动,docker 公司在 libnetwork 中使用了 CNM(Container Network Model)。CNM 定义了构建容器虚拟化网络的模型,同时还提供了可以用于开发多种网络驱动的标准化接口和组件

CNM的理念是提供可以跨不同网络基础架构可实现移植的应用。这个模型平衡了应用的可移植性同时不会损失基础架构原有的各种特性和功能。

CNM主要有三部分组成
  • 沙箱(SandBox)--一个沙箱包含了容器的网络配置。这里包括了容器接口的管理,路由表,和DNS设定。一个沙箱可以包含多个来自不同网络的端点,可以同时连接多个网络。

  • 端点(Endpoint)--沙箱通过端点来连接网络。端点结构的存在使到应用与网络的连接实现虚拟化。这样有助于维护应用的可移值性,因此一个服务可以在无须知道如何去连接网络的情况下使用不同类型的网络驱动。

  • 网络(Network)--CNM并不是OSI模型中说的网络层。而是由Linux桥接,VLan等来实现。网络收集了所有连接在其上的端点,并实现了这些端点的互连。端点如果不连接到其中一个网络,那么将无法与外界连接。

CNM驱动接口

容器连网模型提供了两个可拔插且开放的接口供用户使用,这些接口是用于通讯,利用供应商提供的附加功能,网络可见性,或网络控制等方面。目前存在以下网络驱动:

  • 网络驱动(Network Drivers)--Docker网络驱动提供了使网络可以工作的具体实现。他们是可拔插的,所以很易于支持不同的用户使用场景。多个网络驱动可同时用于指定的Docker引擎和群集。有以下两个广泛使用的CNM网络驱动:

    • 内置网络驱动(Native Network Drivers)--内置网络驱动是内置于Docker引擎,并随Docker提供的驱动。有多个驱动可供选择,以支持不同的功能,如overlay网络和local bridge网络。

    • 远程网络驱动(Remote Network Drivers)--远程网络驱动是由社区或其它供应商建立的网络驱动。这些驱动可用于与现有的软件或硬件环境进行集成。用户也可以建立自己的网络驱动以达成各种特殊需求。

  • IPAM(IP地址管理)驱动--Docker有一个内置的IP地址管理驱动,在没有特别指定IP的情况下,它会为网络和端点提供了默认的子网或IP地址。IP地址通过网络(docker network create),容器(docker container create)和服务(docker service create)创建指令来人工分配。远程IPAM驱动也存在和提供了集成到现有IPAM的工具。

Docker内置网络驱动

Docker内置网络驱动是Docker引擎的一部份不需要任何额外模块。他们可以被docker network命令所调用。以下是现存的内置网络驱动:

驱动描述
Host没有命名空间隔离,主机上的所有接口都可以直接被容器使用。
Bridge受Docker管理的Linux桥接网络。默认在同一个bridge网络的容器都可以相互通迅。 容器的外部访问也可以使用bridge驱动来设置。
Overlay提供多主机的容器网络互连。同时使用了本地Linux桥接网络和VXLAN技术实现容器之间跨物理网络架构的连接。
MACVLAN使用MACVLAN桥接模式建立容器接口和主机接口之间的连接。实现为容器提供在物理网络中可路由的IP地址。 此外VLAN可以被中继至macvlan驱动以强制实现容器的2层分段。
None容器具有属于自己的网络栈和网络命名空间,但并在容器内添加网络接口。如没有其它的设置,则容器将完全独立于其它网络。

三、Docker Compose-网络设置二

一、概述

默认情况下,Compose 会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为 Hostname 被其他容器访问

默认情况下,应用程序的网络名称基于 Compose 的工程名称,而项目名称基于 docker-compose.yml 所在目录的名称。如需修改工程名称,可使用 --project-name 标识或 COMPOSE_PORJECT_NAME 环境变量。

假如一个应用程序在名为 myapp 的目录中,并且 docker-compose.yml 如下所示:

version: '3'
services:web:build: .ports:- "8000:8000"db:image: mysql

当我们运行 docker-compose up 时,将会执行以下几步:

  • 创建一个名为 myapp_default 的网络

  • 使用 web 服务的配置创建容器,它以 web 这个名称加入网络 myapp_default

  • 使用 db 服务的配置创建容器,它以 db 这个名称加入网络 myapp_default

容器间可使用服务名称(web 或 db)作为 Hostname 相互访问。例如,web 这个服务可使用 postgres://db:5432 访问 db 容器。

当服务的配置发生更改时,可使用 docker-compose up 命令更新配置。此时,Compose 会删除旧容器并创建新容器。新容器会以不同的 IP 地址加入网络,名称保持不变。任何指向旧容器的连接都会被关闭,容器会重新找到新容器并连接上去。

默认情况下,服务之间可使用服务名称相互访问。links 允许我们定义一个别名,从而使用该别名访问其他服务。

version: '2'
services:web:build: .links:- "db:database"db:image: postgres
三、自定义网络

一些场景下,默认的网络配置满足不了我们的需求,此时我们可使用 networks 命令自定义网络。networks 命令允许我们创建更加复杂的网络拓扑并指定自定义网络驱动和选项。不仅如此,我们还可使用 networks 将服务连接到不是由 Compose 管理的、外部创建的网络。

version: '3'
services:proxy:build: nginxnetworks:- frontapp:build: ./appnetworks:- front- backdb:image: postgresnetworks:- back
​
networks:front:# Use a custom driverdriver: custom-driver-1back:# Use a custom driver which takes special optionsdriver: custom-driver-2driver_opts:foo: "1"bar: "2"

其中,proxy 服务与 db 服务隔离,两者分别使用自己的网络;app 服务可与两者通信。使用 networks 命令,即可方便实现服务间的网络隔离与连接。

四、配置默认网络
version: '3'
services:web:build: .ports:- "8000:8000"db:image: postgres
​
networks:default:driver: custom-driver-1

这样,就可为该应用指定自定义的网络驱动

五、已存在的网络

我们可以预先创建一个名为 myapp 的网络,让 Compose 加入这个新创建的网络,使所有 Compose 可以通信,此时使用 external 选项。

# 创建网络
docker network create <Network Name>
# 查看已存在的网络
docker network list
networks:default:external:name: web

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

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

相关文章

详解http请求头,响应头以及在实际开发中

HTTP (Hypertext Transfer Protocol) 协议是一种用于传输超文本的标准协议&#xff0c;它是 Web 通信的基础。HTTP 协议是无状态的&#xff0c;即每次请求是相互独立的&#xff0c;服务器不会记住上一次请求的信息。HTTP 协议采用客户端-服务器模式&#xff0c;客户端发起请求&…

深入探讨JavaScript高阶编程技巧:突破技能瓶颈的高级实践

大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 目录 学习目标&#xff1a; 学习内容&#xff1a…

ABeam Recruiting | ABeam旗下德硕管理咨询(深圳)最新社招岗位信息

ABeam Recruiting 职等你来 POSITION 招聘岗位 1 SAP项目经理 &#xff08;FICO/PP/MM/SD模块背景&#xff09; 职责描述 1.PD&Management&#xff1a;负责项目PD和落地实施管理 2.Business&#xff1a;熟悉了解业务需求、判断并合理地将业务需求转化成信息技术需求…

CMake是什么

文章目录 一.什么是CMake二.CMake安装三.CMake一个HelloWord-的语法介绍3.1 PROJECT关键字3.2 SET关键字3.3 MESSAGE关键字3.4 ADD_EXECUTABLE关键字3.5 include_directories关键字3.6 aux_source_directory 四.语法的基本原则4.1 语法注意事项 五.内部构建和外部构建5.1 外部构…

解读传奇补丁什么是Pak文件什么是WIL序列号

Pak文件是GOM引擎自定义图片资源格式&#xff0c;支持密码功能,可以使用工具包中的WIL编辑器创建修改等编辑&#xff0c;很多脚本命令和功能都会使用这个WIL序号&#xff0c;M2-查看-列表信息二这里可以自定义添加&#xff0c;Pak文件读取规则详细查看登录器配置器 Pak文件读取…

【C语言】mmap函数

mmap是一种在Unix/Linux操作系统中将文件映射到进程的地址空间的方法&#xff0c;它允许程序像访问内存一样访问文件。这种方法可以提高文件访问的速度和效率&#xff0c;特别是对于大文件而言。 以下是mmap的基本使用方法&#xff1a; 1. 包含头文件&#xff1a; 在使用mma…

H264帧内预测介绍

4x4 luma宏块的预测模式 4x4 luma宏块有9种预测模式 16x16 luma宏块的预测模式 16 x16 luma宏块有四种预测模式 帧内预测模式信令(Signalling intra prediction modes) 4x4 或者8x8 luma prediction 对4x4或者8x8 luma因为每一个宏块都要指明预测模式,且有9种预测模式可…

YOLOv7保姆级教程(个人踩坑无数)----训练自己的数据集

目录 一、前言&#xff1a; 二、YOLOv7代码下载 三、环境配置 四、测试结果 五、制作自己的数据集 六、训练自己的数据集 一、前言&#xff1a; 上一篇已经详细讲解了如何安装深度学习所需要的环境&#xff0c;这一篇则详细讲解如何配置YOLOv7&#xff0c;在本地电脑或者…

为什么说AI现在还不行!

AI最近有点被妖魔化了&#xff0c;很像一个老虎在还没有橘猫大的时候&#xff0c;就已经被天天当成虎力大仙来讨论。这种普遍的高预期其实是有害的&#xff0c;尤其是当事情本身还需要耐心细致深耕且长跑的时候。资本、品牌可以匹配高预期所对应的增长倍数&#xff0c;业务则不…

ubuntu22.04安装 nvidia-cudnn

nvidia-cudnn 是 NVIDIA CUDA 深度神经网络库&#xff08;CUDA Deep Neural Network library&#xff09;的缩写。这是一个由 NVIDIA 提供的库&#xff0c;用于加速深度学习应用程序。它包含了针对深度神经网络中常用操作&#xff08;如卷积、池化、归一化、激活层等&#xff0…

数据结构--二叉树

目录 1.二叉树链式结构的实现 1.1 前置说明 1.2 二叉树的遍历 1.2.1 前序、中序以及后序遍历 1.2.2 层序遍历及判断是否为完全二叉树 1.3 节点个数&#xff0c;叶子节点个数&#xff0c;第k层节点个数以及高度等 1.4 二叉树的创建和销毁 1.二叉树链式结构的实现 1.1 前置说…

记一次mybatis-plus的argument type mismatch报错

起初以为是boolean和数据库的tinyint不匹配导致&#xff0c;找了一天之后想起来把整个lambda注释掉发现list直接无法运行&#xff0c;说明问题不在boolean List<BmsBillboard> list bmsBillboardService.list(new LambdaQueryWrapper<BmsBillboard>().eq(BmsBillb…