12.compose vs swarm

Docker compose vs. Docker Swarn

回顾一下docker compose,同样可以一次性启动多个docker容器。但是二者的使用场景不同。docker compose更适合与本地测试与开发,而不适合生产环境。

使用docker compose 搭建一个网站

Drupal + PostgreSQL https://hub.docker.com/_/drupal

写成docker-compose.yml的形式

version: '3.1'services:drupal:image: drupal:8-apacheports:- 8080:80volumes:- /var/www/html/modules- /var/www/html/profiles- /var/www/html/themes- /var/www/html/sitesrestart: alwayspostgres:image: postgres:10environment:POSTGRES_PASSWORD: mypasswordrestart: always

默认postgres的数据库和用户名都是postgres,密码为自己填写的字段。postgres数据库服务器地址使用DNS地址:postgres

使用docker swarm 搭建一个网站

overlay网络

服务于容器间网络,提供了可选的加密特性,允许容器处于多个网络

同样创建一个postgres数据库、一个drupal站点和一个overlay网络。

创建overlay网络

docker network create --driver overlay mydrupaldocker network ls
# NETWORK ID     NAME              DRIVER    SCOPE
# 5054aae3e6c8   bridge            bridge    local
# 98b6ebbab0f4   docker_gwbridge   bridge    local
# 847fe6f59e50   host              host      local
# ywd5ipt7qdjy   ingress           overlay   swarm
# 88kyndqnrtpf   mydrupal          overlay   swarm
# b5b109343eb3   none              null      local

启动postgres数据库

docker service create --name psql --network mydrupal -e POSTGRES_PASSWORD=mypassword postgres:10docker service ls
# ID             NAME      MODE         REPLICAS   IMAGE             PORTS
# n1rxvningqd1   psql      replicated   1/1        postgres:latest   docker container logs psql

启动drupal,加入相同的网络

docker service create --name drupal --network mydrupal -p 80:80 drupal:8-apachedocker service ps drupal
# ID             NAME       IMAGE           NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
# pyn97awt9y1r   drupal.1   drupal:latest   node2     Running         Running 15 seconds ago      docker service ps psql 
# ID             NAME      IMAGE             NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
# ldo8ydhk1wau   psql.1    postgres:latest   node1     Running         Running 8 minutes ago             

注意,drupal和psql分别处于node1和node2,这点不用于docker compose。所以我们需要额外搭建overlay网络。

postgres数据库服务器地址使用DNS地址,而这次是service name:psql

docker swarm集群可以通过overlay网络实现夸节点通信。
docker compose一般则作为单节点引擎工具。

swarm routing mesh

访问三个节点的80端口,发现都可以打开drupal的页面。然而实际上drupal在overlay网络上只有一个IP

docker service inspect drupal

在swarm集群的任意节点上都可以访问服务。这就是swarm的Routing Mesh机制。

Routing Mesh分为两类:

  • Internal Routing Mesh:容器与容器之间通过overlay网络进行访问。通过service name进行DNS解析,获得VIP(Virtual ip)

比如启动一个有三个replica的服务,三个容器分布在三个节点上。swarm会提供一个vip,并且承担流量在三个容器上的负载均衡

  • Ingress Routing Mesh:当在任何一个swarm节点去访问端口服务的时候会被本节点的IPVS(Linux ip virtual service)转发到真正的swarm节点上。

访问节点IP时,swarm会对击中节点的流量进行负载均衡。


# docker service create --name search --replicas 2 -p 9200:9200 elasticsearch:2 --detach# docker build -t s09g/node-web .docker service create --name showip --replicas 3 -p 8080:8080 s09g/node-web --detachdocker service ps showipcurl localhost:8080
  • 外部访问的均衡负载
  • 服务端口被暴露到各个swarm节点
  • 内部通过 IPVS 进行均衡负载

Stack

docker stack 其实就是swarm版的docker-compose.yml,要求使用version >= 3

  • 使用docker stack deploy代替docker service create
  • Swarm不支持build标签,build标签失效
  • Compose不支持deploy标签,deploy标签失效

修改之前的docker-compose.yml
vim docker-stack.yml

version: '3.1'services:drupal:image: drupal:8-apacheports:- 8080:80volumes:- /var/www/html/modules- /var/www/html/profiles- /var/www/html/themes- /var/www/html/sitespostgres:image: postgres:10environment:POSTGRES_PASSWORD: mypassword
docker stack deploy -c docker-stack.yml mystackdocker stack ls
# NAME      SERVICES   ORCHESTRATOR
# mystack   2          Swarmdocker stack services mystack 
# ID             NAME               MODE         REPLICAS   IMAGE             PORTS
# xj7vyueoqcmt   mystack_drupal     replicated   1/1        drupal:8-apache   *:8080->80/tcp
# wiqj2536orpr   mystack_postgres   replicated   1/1        postgres:10    docker stack ps mystack 
# ID             NAME                 IMAGE             NODE       DESIRED STATE   CURRENT STATE                ERROR     PORTS
# sbk4up0fotdj   mystack_drupal.1     drupal:8-apache   manager1   Running         Running 58 seconds ago                 
# j3e06itrvpsr   mystack_postgres.1   postgres:10       worker1    Running         Running about a minute ago    

Docker Swarm Visualizer

加入Visualizer

git clone https://github.com/dockersamples/docker-swarm-visualizer
cd docker-swarm-visualizer
docker-compose up -d

访问8080端口,查看仪表盘

还可以加入yaml文件,随集群一起启动

version: '3.1'services:drupal:image: drupal:8-apacheports:- 80:80volumes:- /var/www/html/modules- /var/www/html/profiles- /var/www/html/themes- /var/www/html/sitespostgres:image: postgres:10environment:POSTGRES_PASSWORD: mypasswordvisualizer:image: dockersamples/visualizerports:- 8080:8080volumes:- /var/run/docker.sock:/var/run/docker.sockdeploy:placement:constraints: [node.role == manager]

Docker secret

在之前的yaml文件中,我们将postgres的密码以明文形式存储在了文件中。这种做法并不安全。因此我们需要引入docker secret

Swarm模式下manager节点通过Raft Database保持状态一致。
Raft DB本身是一个在磁盘上加密的介质,并且信息仅保存于manager节点。我们可以利用这个数据库将一些敏感信息,例如账号、密码等信息保存在这里,然后通过给service授权的方式允许它进行访问,这样达到避免密码明文显示的效果。

echo "my_psql_user" >> psql_user.txt
# echo "my_psql_password" >> psql_password.txtdocker secret create psql_user psql_user.txtecho "myDBpassWORD" | docker secret create psql_pass -docker secret ls
# ID                          NAME        DRIVER    CREATED              UPDATED
# c6r82dvx39ljj3xm33b94g7qz   psql_pass             20 seconds ago       20 seconds ago
# rpugt2xwoid20iw6r186tvw6t   psql_user             About a minute ago   About a minute agodocker secret inspect psql_user
# [
#     {
#         "ID": "rpugt2xwoid20iw6r186tvw6t",
#         "Version": {
#             "Index": 33
#         },
#         "CreatedAt": "2023-01-28T20:36:38.812337222Z",
#         "UpdatedAt": "2023-01-28T20:36:38.812337222Z",
#         "Spec": {
#             "Name": "psql_user",
#             "Labels": {}
#         }
#     }
# ]docker service create --name psql --secret psql_user --secret psql_pass -e POSTGRES_PASSWORD_FILE=/run/secrets/psql_pass -e POSTGRES_USER_FILE=/run/secrets/psql_user postgres:10docker service ps psqldocker exec -it psqldocker exec -ti psql.1.s6bfy7awutzxq87cgrmkwwjfl bash
# ls /run/secrets
# cat /run/secrets/psql_user 
#   my_psql_user
# exit
  • secret存在于Swarm Manager节点的的Raft Database里
  • secret可以分配给service,然后这个service就可以看到这个secret
  • 在container内部secret看起来像文件,实际上就是内存

将secret加入stack

需要version >= '3.1'

version: '3.1'services:drupal:image: drupal:8-apacheports:- 80:80volumes:- /var/www/html/modules- /var/www/html/profiles- /var/www/html/themes- /var/www/html/sitespostgres:image: postgres:10environment:POSTGRES_PASSWORD_FILE: /run/secrets/psql_passwordPOSTGRES_USER_FILE: /run/secrets/psql_uservisualizer:image: dockersamples/visualizerports:- 8080:8080volumes:- /var/run/docker.sock:/var/run/docker.sockdeploy:placement:constraints: [node.role == manager]
secrets:psql_user:file: ./psql_user.txtpsql_password:file: ./psql_password.txt

启动stack

docker stack deploy -c mystack.yml mydbdocker secret lsdocker stack rm mydb

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

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

相关文章

微服务理解篇

一 :架构演变 1 单体架构: 简单理解为一个服务涵盖所有需求功能2 垂直架构: 按照业务功能将单体架构拆分成小模块服务, 如:订单系统,用户系统,商品系统 ##缺点 引入分布式事务,分布式锁等,优点:模块解耦## 垂直拆分:根据业务层级拆分,比如商城的订单系统,用户系统,商品系统…

Leetcode—2696. 删除子串后的字符串最小长度【简单】

2023每日刷题(八十八) Leetcode—2696. 删除子串后的字符串最小长度 实现代码 class Solution { public:int minLength(string s) {string sub " ";for(auto c: s) {if((c B && sub.back() A) || (c D && sub.back() C…

BACnet转OPC UA网关BA112

随着通讯技术和控制技术的发展,为了实现楼宇的高效、智能化管理,集中监控管理已成为楼宇智能管理发展的必然趋势。在此背景下,高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生,广泛应用于楼宇自控和暖通空调系统应用中…

Flutter Image库详细介绍与使用指南

1. 介绍 在Flutter中,图片是应用程序中不可或缺的一部分,而 image 库是一个强大而灵活的图片加载和处理库。通过使用 image^ 4.1.4,您可以轻松地实现图片的加载、缓存、调整大小和裁剪等功能,同时还支持各种图片格式。 2. 安装 …

JDBC数据库连接

JDBC(Java DataBase Connectivity)就是用Java语言操作关系型数据库的一套API JDBC的步骤固定,大体分为8个步骤,以MySQL数据库为例 1.创建工程并导入驱动jar包 2.注册驱动 注册驱动的目的是告诉代码要执行哪一个jar包 Class.forName(com.mysql.jdbc.D…

【并发编程】活锁

📝个人主页:五敷有你 🔥系列专栏:并发编程 ⛺️稳重求进,晒太阳 活锁 定义:活锁出现在两个线程互相改变对象的结束条件,最后谁也无法结束 代码示例 public class TestLiveLock {stati…

LabVIEW准分子激光器控制系统

LabVIEW准分子激光器控制系统是为了实现准分子激光光源在工业、医疗和科研领域的应用集成及其功能的扩展。系统由PC端和激光器端两部分构成,通过光隔离的RS232通讯连接,以实现稳定可靠的控制与通信。 系统主要由微控制单元(MCU)主…

SpringBoot实现自定义异常+全局异常统一处理

目录 前言 一、使用教程 1.自定义异常类。 2.全局统一处理类 3.ResultVO类 4.StatusCodeEnum 枚举类 二、 结束语 前言 在SpringBoot中,实现自定义异常和全局异常统一处理是确保应用程序稳定性和用户体验的关键。通过定义自定义异常类,我们可以为应…

数据库(MySQL的备份和恢复)

目录 1.1 MySQL 日志管理 1.1.1 MySQL日志类型 1.1.2 错误日志 错误日志中主要记录的几种日志 错误日志的定义 1.1.3 通用查询日志 1.1.4 慢查询日志 和慢查询相关的变量设置 1.1.5 二进制日志 二进制日志是记录执行的语句还是执行后的数据 日志滚动 1.2 MySQL备份…

前端echarts图形报表常见的样式配置

文章目录 🐒个人主页🏅Vue项目常用组件模板仓库📖前言:🐕1.深色主题🐕2.改变柱状图颜色🐕突然发现去问ai,更容易理解,那就不总结了 🐒个人主页 🏅…

scratch——运动积木

一、运动积木概念 在Scratch编程中,运动积木是至关重要的一类积木,它能使我们的角色动起来!运动积木是创造动感项目的关键。 二、运动积木的位置 点击左上角的“代码”按钮,然后在界面最左边找到“运动”按钮,这个按…

uniapp复选框 实现排他选项

选择了排他选项之后 复选框其他选项不可以选择 <view class"reportData" v-for"(val, index) in obj" :key"index"> <view v-if"val.type 3" ><u-checkbox-group v-model"optionValue" placement"colu…

数据结构顺序表力扣例题AC——代码以及思路记录

顺序表力扣例题 27.移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不…

arm 汇编调用C

arm64 汇编调用C函数 main.s .section .text .globl main main:stp x29, x30, [sp, -16]! //store fp x29 lr x30mov x0, #0mov x1, #1bl addmov x1, x0 // x0 return ldp x29, x30, [sp], 16 //restore fp lrretadd.c #include <stdio.h> int add(int a, int…

go使用docker sdk停止和删除docker

go使用docker sdk停止和删除docker 代码参考 代码 package mainimport ("context""fmt""github.com/docker/cli/cli/connhelper""github.com/docker/docker/api/types/container""github.com/docker/docker/client""n…

性能优化-HVX 指令介绍

「发表于知乎专栏《移动端算法优化》」 本文主要介绍了 HVX 指令相关的知识&#xff0c;包括 HVX 寄存器相关内容&#xff0c;指令的背景依赖&#xff0c;部分常用 intrinsic HVX 指令。具体指令的详细内容及使用还需阅读 HVX 的指令文档&#xff0c;以及细致的实践操作。 &…

【node】关于npm、yarn、npx的区别与使用

文章目录 npm (Node Package Manager):安装依赖运行脚本 npx:执行项目依赖中的命令 yarn:安装依赖eg.使用npx yarn install 的作用 npm (Node Package Manager): 用途&#xff1a; npm 是 Node.js 官方提供的包管理工具&#xff0c;用于安装、管理和分享 JavaScript 代码包。安…

C语言—fopen和ab+

在C语言中&#xff0c;fopen(“data”,“ab”) 是使用 fopen 函数以追加和读写模式打开一个名为 “data” 的文件的方法。 下面是对这个函数调用的各个部分的解释&#xff1a; fopen 函数 fopen 是一个标准库函数&#xff0c;用于打开文件。它的原型定义在 <stdio.h> 头…

库函数的模拟实现

目录 模拟实现strlen 模拟实现strcpy 模拟实现strcmp 模拟实现strcat 模拟实现strstr 模拟实现memcpy 模拟实现memmove 模拟实现strlen #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int MyStrlen(char* str) {int len 0;while (str[len] ! \0)len;retu…

GitLab升级版本(任意用户密码重置漏洞CVE-2023-7028)

目录 前言漏洞分析影响范围查看自己的GitLab版本升级路程 升级过程13.1.1113.8.8 - 14.0.1214.3.614.9.5 - 16.1.6 前言 最近GitLab发了个紧急漏洞需要修复&#xff0c;ok接到命令立刻着手开始修复&#xff0c;在修复之前先大概了解一下这个漏洞是什么东西 漏洞分析 1、组件…