Docker笔记:Docker Swarm, Consul, Gateway, Microservices 集群部署

2023-12-16 07:01

本文主要是介绍Docker笔记:Docker Swarm, Consul, Gateway, Microservices 集群部署,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于 Consul 服务

  • Consul是Go语言写的开源的服务发现软件
  • Consul具有服务发现、健康检查、 服务治理、微服务熔断处理等功能

Consul 部署方式1: 直接在linux 上面部署 consul 集群


1 )下载

  • 在各个服务器上 下载 consul 后解压并将其目录配置到环境变量中,方便调用 consul 命令

2 )部署: server端与搭建集群

  • 准备3台服务器

服务器 启动

  • server_1
    • $ consul agent -server -bootstrap-expect 3 -node=server_1 -bind=192.168.1.10 -ui -data-dir=/root/consul_dir/data -client 0.0.0.0
      • -server 表示启动的是服务端
      • -bootstrap-expect 3 表示待启动的服务数量
      • -node 指定节点的名称
      • -bind 指定绑定的当前的ip地址
      • -ui 表示可以在web中访问
      • -data-dir 指定的存储目录
      • -client 0.0.0.0 表示所有客户端都可加入
  • server_2
    • $ consul agent -server -bootstrap-expect 3 -node=server_2 -bind=192.168.1.11 -ui -data-dir=/root/consul_dir/data -client 0.0.0.0
      • 可以继续在后面追加 -join 参数来追加到集群
      • 目前不这么做,参考下面拆解
  • server_3
    • $ consul agent -server -bootstrap-expect 3 -node=server_3 -bind=192.168.1.12 -ui -data-dir=/root/consul_dir/data -client 0.0.0.0

服务器 加入

  • server_2

    • $ consul join 192.168.1.10
  • server_3

    • $ consul join 192.168.1.10

基于以上server端对应的集群搭建好了

3 )部署: client端与加入搭建集群

  • 准备1台客户端

客户端 启动

  • client_1
    • $ consul agent -data-dir=/root/consul_dir/data -node=client_1 -bind=192.168.1.13 -ui -client 0.0.0.0

客户端 加入

  • client-01:
    • $ consul join 192.168.1.10

Consul 部署方式2: Docker 上面部署 consul 集群

和 Linux 里面的部署流程,基本一致

1 )文档

  • https://hub.docker.com/_/consul

2 )下载镜像

  • $ docker pull consul

3 )部署

  • 3.1 启动创建第一个节点 consul1容器

    • $ docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul agent -server -bootstrap-expect=3 -ui -bind=0.0.0.0 -client=0.0.0.0
      • 这个指定了端口,比较麻烦
    • $ docker run --name consul1 -d -p 8500:8500 consul agent -server -bootstrap-expect=3 -ui -bind=0.0.0.0 -client=0.0.0.0
      • 这个比较推荐
  • 3.2 启动第二个容器前需要找到 consul1容器的ip地址

    • 方法1
      • $ docker network ls 找到网络列表
      • $ docker inspect NETWORKID 一般是 bridge 的网络
    • 方法2
      • $ docker inspect --format='{{.NetworkSettings.IPAddress}}' consul1
      • 推荐
    • 假设找到的 ip 是: 192.168.1.10
  • 3.3 启动第二个节点(端口8501), 加入到 consul1

    • $ docker run --name consul2 -d -p 8501:8500 consul agent -server -ui -bootstrap-expect=3 -bind=0.0.0.0 -client=0.0.0.0 -join 192.168.1.10
  • 3.4 启动第三个节点(端口8502), 加入到 consul1

    • $ docker run --name consul2 -d -p 8502:8500 consul agent -server -ui -bootstrap-expect=3 -bind=0.0.0.0 -client=0.0.0.0 -join 192.168.1.10
  • 3.5 启动一个consul客户端(端口8503), 加入到 consul1

    • $ docker run --name consul_client1 -d -p 8503:8500 consul agent -ui -bind=0.0.0.0 -client=0.0.0.0 -join 192.168.1.10
    • 客户端可以不指定端口

4 )验证

  • 目前3个服务端和1个服务器端都做好了,验证一下
    • $ docker ps
  • 进入一个consul中查看
    • $ docker exec -it consul1 consul members
    • 可查看到集群的信息
  • 访问
    • xxx.xxx.xxx.xxx:xxxx
      • 上面任意一台机器ip和端口都可访问
  • 如果里面用到了微服务,并发量不大的情况下,可以把多个consul服务端放在一台机器上
    • 如果并发量比较大,就需要把consul部署在多台服务器上
    • 部署到一台服务器的好处是,容器之间通信比较方便,默认是通过 bridge 网络桥接

在多台服务器搭建consul集群

1 )直接在 linux 服务器上运行 consul

  • 同上方式,不再复述

2 )仍旧选择 docker 平台

  • 注意,在 -join 时,涉及到不同主机的通信,需要借助物理的ip
  • 可以把docker容器直接映射在当前物理机上,使用 --net=host 参数,例如
    docker run --net=host -e CONSUL_BIND_INTERFACE=ens33 -h=192.168.1.10 --name consul1 -v /consul_server/data:/consul/data consul agent -server -bootstrap-expect=3 -ui -bind=192.168.1.10 -client=0.0.0.0
    
    docker run --net=host -e CONSUL_BIND_INTERFACE=ens33 -h=192.168.1.11 --name consul2 -v /consul_server/data:/consul/data consul agent -server -bootstrap-expect=3 -ui -bind=192.168.1.11 -client=0.0.0.0 -join 192.168.1.10
    
    docker run --net=host -e CONSUL_BIND_INTERFACE=ens33 -h=192.168.1.12 --name consul3 -v /consul_server/data:/consul/data consul agent -server -bootstrap-expect=3 -ui -bind=192.168.1.12 -client=0.0.0.0 -join 192.168.1.10
    
  • 如果要后台运行 nohup + 上面命令 + &
    nohup docker run --net=host -e CONSUL_BIND_INTERFACE=ens33 -h=192.168.1.10 --name consul1 -v /consul_server/data:/consul/data consul agent -server -bootstrap-expect=3 -ui -bind=192.168.1.10 -client=0.0.0.0 &
    
    nohup docker run --net=host -e CONSUL_BIND_INTERFACE=ens33 -h=192.168.1.11 --name consul2 -v /consul_server/data:/consul/data consul agent -server -bootstrap-expect=3 -ui -bind=192.168.1.11 -client=0.0.0.0 -join 192.168.1.10 &
    
    nohup docker run --net=host -e CONSUL_BIND_INTERFACE=ens33 -h=192.168.1.12 --name consul3 -v /consul_server/data:/consul/data consul agent -server -bootstrap-expect=3 -ui -bind=192.168.1.12 -client=0.0.0.0 -join 192.168.1.10 &
    
    nohup docker run --net=host -e CONSUL_BIND_INTERFACE=ens33 -h=192.168.1.13 --name consul4 consul agent -bind=192.168.1.13 -client=0.0.0.0 -join 192.168.1.10 &
    
  • 相当于在物理机上运行consul, 注意上述ip可替换成hostname, 需要配置hostname, 因为ip可能会变化
  • 以上consul集群部署好之后,就可以准备微服务集群和API网管集群了

Consule集群结合Swarm集群部署微服务项目


关于整体架构分层

  • A. 各个客户端 访问nginx

  • B. nginx 服务器,用于总体转发服务

  • C. API服务网关集群

    • API服务网关可以配置到微服务集群中,这样就可以减少通信相关配置,具体看当时网络环境
    • 需要注册到 consul
  • D. 微服务集群: 各类应用程序微服务

    • 每个微服务需要注册到consul
  • E. consul服务注册集群

    • 用于服务发现管理
  • F. 数据库集群

    • 目前数据库没有做集群处理
  • 以下步骤是大体步骤,比较粗略,忽略一些细节赘述,仅供参考

1 )将各个微服务项目打包,比如goWeb应用, 这个步骤是前置任务

  • 检查各个服务提供连接的配置信息,检查部署环境对应的配置信息是否正确
  • 如果微服务镜像中配置了支持打包, 比如 Dockerfile中, 则忽略此步骤
  • 如果在windows下开发,需要打包成linux程序
    • filename : 文件名
      set CGO_ENABLED=0
      set GOOS=linux
      set GOARCH=amd64
      go build -o filename main.go
      
  • 将文件上传,如果不是docker部署,需要将服务器的目录设置为可执行
    • $ chmod -R 777 目录
  • 执行项目 $ nohup ./filename &
  • 验证可正常运行

2 )准备mysql以及redis数据库等环境

  • 启动 mysql
    • $ docker run --name ityingMysql -p 3306:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
  • 启动 redis
    • $ docker run -p 6379:6379 --name redis -v /docker/redis/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data --restart=always -d redis redis-server /etc/redis/redis.conf

3 )整理微服务应用

3.1 microA程序的 A微服务

配置dockerfile,简单示例仅供参考 micro_a_Dockerfile

FROM centos
ADD /wwwroot/micro_a.tar.gz /root
WORKDIR /root
RUN chmod -R 777 micro_a
WORKDIR /root/micro_a
ENTRYPOINT ["./micro_a"]

3.2 microB程序 B微服务

配置dockerfile,简单示例仅供参考 micro_b_Dockerfile

FROM centos
ADD /wwwroot/micro_b.tar.gz /root
WORKDIR /root
RUN chmod -R 777 micro_b
WORKDIR /root/micro_b
ENTRYPOINT ["./micro_b"]

3.3 microC程序 C微服务

配置dockerfile,简单示例仅供参考 micro_c_Dockerfile

FROM centos
ADD /wwwroot/micro_c.tar.gz /root
WORKDIR /root
RUN chmod -R 777 micro_c
WORKDIR /root/micro_c
ENTRYPOINT ["./micro_c"]

4 )对微服务进行 镜像build

  • $ docker build -f micro_a_Dockerfile -t micro_a_img:latest .
  • $ docker build -f micro_b_Dockerfile -t micro_b_img:latest .
  • $ docker build -f micro_c_Dockerfile -t micro_c_img:latest .

5 )配置微服务 docker-compose.yml

version: "3"
services:# 配置 redis 数据库redis:image: redisrestart: alwaysdeploy:replicas: 1 #副本数量# 配置 a 微服务micro_a:image: micro_a_imgrestart: alwaysdeploy:replicas: 6 # 副本数量resources: # 资源limits: #配置cpucpus: "0.3" # 设置该容器最多只能使用 30% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: #定义容器重启策略, 用于代替 restart 参数condition: on-failure #只有当容器内部应用程序出现问题才会重启# 配置 b 微服务micro_b:image: micro_b_imgrestart: alwaysdeploy:replicas: 6 #副本数量resources: #资源limits: #配置cpucpus: "0.3" # 设置该容器最多只能使用 30% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: #定义容器重启策略, 用于代替 restart 参数condition: on-failure #只有当容器内部应用程序出现问题才会重启depends_on:- captcha_micro# 配置 c 微服务micro_c:image: micro_c_imgrestart: alwaysports:- 8080:8080deploy:replicas: 6 #副本数量resources: #资源limits: #配置cpucpus: "0.3" # 设置该容器最多只能使用 30% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: #定义容器重启策略, 用于代替 restart 参数condition: on-failure #只有当容器内部应用程序出现问题才会重启depends_on:- micro_b # 依赖b微服务
  • 注: 上面用到了redis数据库, 但不是集群,当前只是一个简单的服务

6 )创建集群

  • 关键命令如下
    • $ docker swarm init --advertise-addr 192.168.1.10
    • $ docker swarm join-token worker
    • $ docker swarm join-token manager
  • 具体配置不再赘述,参考前文描述

7 )部署项目

  • $ docker stack deploy --compose-file docker-compose.yml microSwarm
    • microSwarm 是你给这套微服务集群起的响亮亮的名字
  • 进行各个服务的启动后的验证,不再赘述

8 )调用测试

  • 客户端连接 consul 服务器实现调试, 不再赘述

9 )注意事项

  • 如果是前后端分离的项目
    • 先集成运维环境,并测试, 这里一般包含集群
    • 再部署后端服务,并测试服务的连通性
    • 再部署前端服务,并测试接口服务的正常
  • 如果,微服务环境运维环境复杂
    • 还要检查微服务的版本迭代是否正常,否则上线可能会遇到问题

这篇关于Docker笔记:Docker Swarm, Consul, Gateway, Microservices 集群部署的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/499563

相关文章

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

k8s部署MongDB全过程

《k8s部署MongDB全过程》文章介绍了如何在Kubernetes集群中部署MongoDB,包括环境准备、创建Secret、创建服务和Deployment,并通过Robo3T工具测试连接... 目录一、环境准备1.1 环境说明1.2 创建 namespace1.3 创建mongdb账号/密码二、创建Sec

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Python项目打包部署到服务器的实现

《Python项目打包部署到服务器的实现》本文主要介绍了PyCharm和Ubuntu服务器部署Python项目,包括打包、上传、安装和设置自启动服务的步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录一、准备工作二、项目打包三、部署到服务器四、设置服务自启动一、准备工作开发环境:本文以PyChar

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke