使用DcokerCompose部署微服务项目详解

news2024/11/23 7:17:04

一、项目结构

在这里插入图片描述

我这里准备了一个微服务项目。

里面包含三个服务模块:

card-serviceuse-rservice以及网关gateway

一个公共模块:

fegin-api

其中fegin-apicard-serviceuser-service引用。

二、基于项目构建部署目录结构

在这里插入图片描述

这个springcloud-app目录中的全部内容,之后就是要上传到服务上进行部署的源文件。

springcloud-app一级目录下包含了放gatewaycard-serviceuser-service三个微服务的文件夹。

一个放mysql数据和配置文件的文件夹。

以及一个dockercompose配置文件。

关于它们的详解如下。

2.1 gateway目录构建详解

在我提供的项目中,gatewaycard-serviceuser-service都属于微服务,构建方式是一样的。

这里就以gateway为例,解析怎么构建文件目录。

1)进入gateway目录:
在这里插入图片描述

里面只有一个我提前写好的Dockerfile文件。

要使用Docker构建镜像肯定是需要编写Dockerfile,在其中编写构建规则的。

2)打开Dockerfile文件:

里面只需要三句话即可。

# 指定java:8-alpine作为基础镜像,它包含了java程序部署的基本环境依赖
FROM java:8-alpine	
# 把当前目录下的javaApp.jar移动到/soft目录下
COPY ./javaApp.jar /soft/javaApp.jar
# 程序运行入口,就是java项目的启动命令
# 这句话也是容器成功运行后,第一个执行的命令
ENTRYPOINT java -jar /soft/javaApp.jar

card-serviceuse-rservice两个文件夹下的内容和gateway中的一致。

并且Dockerfile文件的内容也一样。因为它们三种都是基于java开发的微服务,构建镜像的方式都是一致的。

2.2 mysql 目录构建详解

在这里插入图片描述

由于所有微服务都是使用的mysql数据库。

这样也就涉及到了Docker中运行mysql容器。

而为了mysql数据和配置的可移植性和可维护性。一般都会进行数据卷挂载或者磁盘挂载。

把自定义的mysql配置合并到容器中,以及把容器内被隔离的mysql数据与宿主机进行关联。

1)conf目录
在这里插入图片描述

hmy.cnf中存放着自定义mysql配置。可以是字符集配置,主从复制中的配置等等等。

如果暂时没有自定义配置,最好也先挂载上。由于容器启动后无法再挂载新的数据卷或者磁盘。

如果第一次不挂载,今后再想给mysql添加配置。

就只能删除容器再重新运行镜像生成新容器时再去挂载配置文件了。

2)data目录在这里插入图片描述

里面包含着mysql数据库服务器下存放的所有数据库的数据。这些数据都以二进制文件的形式存储在本地磁盘。

每个电脑存放mysql本地二进制表格数据的位置不同,一般是安装的时候自己设定的。

只有找到那个文件夹,把需要的数据库二进制文件复制进来即可。

这个目录和容器磁盘进行挂载后,里面的数据会直接覆盖mysql容器中的数据。

之后容器中mysql的数据发生变化之后,也会同步更新到宿主机本地磁盘中的对应位置。

也就是说这里的data目录里的对应文件,也会随之修改。这属于Docker的基础知识了。

2.3 dcoker-compose.yml文件详解

# Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
# 目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
version: "3.0"

services:							# 具体的服务定义
  nacos:							# nacos配置 nacos也是未来naocs服务的容器名称
    image: nacos/nacos-server		# nacos镜像名称
    environment:					# nacos环境变量
      MODE: standalone				# MODE相当于之前命令行的-m参数,指代运行模式。
      								# standalone单机运行(如果有nacos集群就不是这么写了)
    ports:							# 端口映射
      - "8848:8848"					# 把宿主机8848端口和nacos容器的8848端口相关联
      
  mysql:							# mysql配置 mysql也是未来mysql服务的容器名称
    image: mysql:5.7.25				# mysql镜像名称
    environment:					# mysql环境变量
      MYSQL_ROOT_PASSWORD: root		# mysql密码为root
    volumes:						# 数据卷挂载配置
      - "$PWD/mysql/data:/var/lib/mysql"	
      								# 宿主/mysql/data目录挂载到器/var/lib/mysql目录
      - "$PWD/mysql/conf:/etc/mysql/conf.d/"	
      								# 宿主/mysql/conf目录挂载到器/etc/mysql/conf.d/目录
      								# $PWD 代表运行Linux的pwd命令,获取当前文件的路径
      								# 这样可以确保在Linux中任意位置都能找到/mysql/conf目录
     ports:							# 端口映射
       - "3306:3306"				# 把宿主机3306端口和mysql容器的3306端口相关联
      									
  userservice:						# userservice微服务配置 userservice也是未来微服务的容器名称
    build: ./user-service			# 代表在当前目录下的user-service目录下构建userservice镜像
    
  cardservice:						# cardservice微服务配置 cardservice也是未来微服务的容器名称
    build: ./card-service			# 代表在当前目录下的card-service目录下构建cardservice镜像
    
  gateway:							# gateway微服务配置 gateway也是未来微服务的容器名称
    build: ./gateway				# 代表在当前目录下的gateway目录下构建gateway镜像
    ports:							# 端口映射
      - "9999:9999"					# 把宿主机9999端口和gateway容器的9999端口相关联

关于mysql端口映射的说明:

mysql只在微服务集群内部进行访问,只需要在userservicecardserviceapplication.yml文件中。

mysql的注册中心的地址,由ip格式改为dcoker-compose.yml文件中配置的服务命名称即可。

compose-file文件的官方文档:

https://docs.docker.com/compose/compose-file/

自定义的微服务配置可以在这里找配置怎么写。

nacos这种地三方镜像,就去它们对应的官网或者dockerHub上看看。

三、准备各个微服务的jar包

这里主要涉及了三个微服务userservicecardservicegateway

在打jar包前,需要先修改配置文件。

修改各个微服务的application.yml文件或者bootstrap.yml文件中的mysqlnacos的地址配置。

ip格式改为dcoker-compose.yml文件中配置的服务命名称。

这是因为使用dcoker-compose配置时。

所有的服务之间都可以直接使用dcoker-compose.yml文件中配置的服务命名称来访问对方。

这里就以打包user-service这个模块为例。

3.1 修改mysql和nacos地址

1)修改bootstrap.yml文件
在这里插入图片描述

# 把红框处的localhost改为dcoker-compose.yml文件中配置的nacos
spring:
  application:
    name: userservice             # 服务名称
  profiles:
    active: dev                   #开发环境,这里是dev
  cloud:
    nacos:
      server-addr: nacos:8848 	  # Nacos地址
      config:                     # discovery 代表注册中心配置 config代表配置中心配置
        file-extension: yaml      # 文件后缀名

2)修改application.yml
在这里插入图片描述

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://mysql:3306/cloud_user?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

card-service和gateway模块中的配置也按上面的方式修改即可。

3.2 在pom.xml文件中添加打包插件

<!-- finalName中的配置就能确定打出来的jar包是什么名称 -->
<!-- plugins中配置的就是常规的maven打包插件 -->
<build>
    <finalName>javaApp</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3.3 使用Idea的Maven打包工具打包微服务

在这里插入图片描述

点击右侧Maven工具栏的package即可。

打包完成后到对应模块的target目录下获取jar包。

card-service和gateway模块的jar包也按上面的方式打出来即可,jar包名字都叫javaApp。

四、把jar包复制到springdata-app下的对应子目录中

user-service为例。

idea中的user-service模块下,找到target目录。

把打好的jar包复制到springdata-app目录下的userservice目录里。
在这里插入图片描述

card-service和gateway模块的jar包也按上面的方式制到springdata-app下的对应子目录中。

五、使用finallshell上传文件夹到服务器

在这里插入图片描述
可以选择任意自己想放的位置。只要便于查找即可。

六、compose相关命令

1)部署命令

# 对命令不熟悉可以查看命令文档
docker-compose --help
# docker-compose 是有非常多命令选项参数的,这里涉及到的两个
# up 创建并启动一个容器
# -d 后台运行
docker-compose up -d

2)停止命令

docker-compose stop

3)停止并删除

docker-compose down

4)重启

docker-compose restart
# 重启某些具体服务的写法
docker-compose restart gateway userservice

5)查看日志

docker-compose logs
# 查看具体的服务日志
# -f 持续更新日志变化,按ctrl+c可以结束
docker-compose logs -f userservice

上述都是常用命令,还有更多操作,不一一列举。

使用docker-compose --help就能知道所有docker-compose的用法。

七、具体部署操作

1)进入springdata-app文件目录

# 这个位置看自己把东西放哪,是不固定的
cd /usr/local/composrApp

2)执行部署命令

docker-compose up -d

3)部署后查看日志

docker-compose logs

4)部署问题解决方案

首次部署时日志中会出现如下错误:
在这里插入图片描述

主要是因为nacos容器启动速度比其他依赖nacos的微服务慢。

其它微服务已经启动了却连接不上nacos,也获取不到nacos中的配置信息。

解决方案:重启所有依赖nacos的微服务

docker-compose restart gateway userservice cardservice

重启完成后查看cardservice的日志

docker-compose logs -f cardservice

发现新出现的日志已经没有任何错误了。

八、基于自定义的jdk镜像部署微服务(推荐)

上面的方式有的人可能会觉得繁琐,每个微服务都有一个单独的文件夹,而且里面都有一个Dockerfile文件。

确实文件有点多。

还有一种方法可以让所有jar包放在一个文件夹中,并且不需要这么多重复的Dockerfile文件。

越来越多人也会选用这种方式来部署,并且这种方式,未来如果使用portainer管理docker时会很容易移植。

具体选择哪种方式,可以结合自己实际情况决定。

1)新建存放目录和文件

# 进入目录/usr/local/
cd /usr/local
# 新建app目录
mkdir app
# 新建Dockerfile文件
touch Dockerfile

存放位置可以根据部署需求自行指定

2)编写Dockerfile文件

# 构建镜像,执行命令:【docker build -t openjdk:8 .】
FROM openjdk:8u212-jre  # 基础镜像
MAINTAINER xxx			# 作者

# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

ENTRYPOINT ["java", "-server", "-Xms512M", "-Xmx512M", "-Djava.security.egd=file:/dev/./urandom", "-Dfile.encoding=UTF-8", "-XX:+HeapDumpOnOutOfMemoryError", "-jar", "/app/app.jar" ]

3)使用Dockerfile文件构建一个openjdk镜像

docker build -t openjdk:8 .

4)编写docker-compose.yml文件

version: '3'
services:
  mysql:
    image: mysql:8
    container_name: gddst-mysql-dev
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=89225300
      - MYSQL_DATABASE=nacos_config
      - MYSQL_USER=gddst
      - MYSQL_PASSWORD=123456
    ports:
      - "3306:3306"
    volumes:
      - /usr/local/workspace/mysql/data:/var/lib/mysql
      - /usr/local/workspace/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
      
  nacos:
    image: nacos/nacos-server:v2.1.1-slim
    container_name: gddst-nacos-dev
    environment:
      - MODE=standalone
      - PREFER_HOST_MODE=hostname
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=89225300
      - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9555:9555"
    volumes:
      - /usr/local/workspace/nacos/logs:/home/nacos/logs
      - /usr/local/workspace/nacos/data:/home/nacos/data
    depends_on:
      - mysql
      
 gateway:
    image: openjdk:8
    container_name: gateway
    ports:
      - 8080:8080
    environment:
      - nacos_host=nacos
      - nacos_port=8848
    volumes:
      - /usr/local/workspace/app/gddst-cloud-gateway.jar:/app/app.jar
     
  userservice:
    image: openjdk:8
    container_name: userservice
    environment:
      - nacos_host=nacos
      - nacos_port=8848
    volumes:
      - /usr/local/workspace/app/userservice.jar:/app/app.jar
    depends_on:
      - mysql
      - nacos
      
  cardservice:
    image: openjdk:8
    container_name: cardservice
    environment:
      - nacos_host=nacos
      - nacos_port=8848
    volumes:
      - /usr/local/workspace/app/cardservice.jar:/app/app.jar
    depends_on:
      - mysql
      - nacos     

如文件中所示:

执行编排容器命令时,会创建一个mysqlnacosuserservicecardservice四个容器。

其中userservicecardservice是自己编写的基于SpringBoot的微服务项目。

这里的部署配置会复杂一些,和文章上部分有所不同,更偏向于实际开发。

按照这个配置,微服务中的pom文件中mysql的依赖需要改成8的版本,同时yml文件的驱动也需要更改。

这些都属于项目基本配置,就不再这里缀述了。

这样编写docker-compose.yml有一些明显的好处:

  • 更容易管理每个微服务的端口、容器名称、环境变量、数据卷等何种参数,可维护性是大大提升的

  • 不再需要把每个微服务的jar搞成一样的名字,可以通过直接看jar包名称就知道是哪个微服务了

  • 不再有那么多重复的Dockerfile文件

  • 今后部署只有在docker-compose.yml中按userservice新增一项配置,并且把它的jar包上传到/usr/local/app下即可

5)上传需要部署的jar文件

根据docker-compose的配置内容,把网关和业务模块所的jar包,

gddst-cloud-gateway.jaruserservice.jarcardservice.jar的三个jar包上传到以下目录:

/usr/local/workspace/app/

6)执行部署命令

docker-compose.yml文件所在目录下执行:

docker-compose up -d

即可完成部署。

写这步更多的是为了这套步骤的完整性、实际一般会使用portainer来进行微服务的可视化部署管理

九、拓展

1)关于能否在一个文件中配置多个相同服务的问题

关于userservicecardservice在一个dcoker-compose.yml文件里也是可以配置多个的。

只需要打出不同端口号的jar包即可。

包括mysql也是,这里只使用了一个,是最简单的格式。即使以后有了主从复制,也可以配置多个mysql

这样就能完成一个更完善一些的集群配置。

2)关于fegin-api模块为什么不需要部署

fegin-api模块只是一个公共模块,被其它微服务所引用。

使用Maven打包SpringBoot项目的时候,有关的Maven依赖会自动打包进当前微服务项目的jar包中。

也就是说,每个依赖了fegin-api模块的微服务的jar包中内部,就已经有了fegin-api模块的内容。

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

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

相关文章

电子档案备份相对于数据备份的特别之处

最近在和档案馆信息部门领导交流过程中&#xff0c;他们提出了一个很实际的困惑&#xff1a;《“十四五”全国档案事业发展规划》&#xff08;以下简称&#xff1a;《十四五规划》&#xff09;中明确提出了“电子档案备份中心”建设&#xff0c;并且要求“扎实做好档案数字资源…

检索业务:排序和价格区间及库存

排序 点击某个排序时首先按升序显示&#xff0c;再次点击再变为降序&#xff0c;并且还会显示上升或下降箭头 页面排序跳转的思路是通过点击某个按钮时会向其class属性添加/去除desc&#xff0c;并根据属性值进行url拼接 点击排序时 $(".sort_a").click(function () …

如何恢复回收站被清空的文件?你必须要知道的4种方法

电脑回收站里面有很多我们之前删除的文件&#xff0c;如果想要恢复这些文件&#xff0c;直接还原就可以了。但是回收站里面的数据被清空了怎么办&#xff1f;如何恢复回收站被清空的文件&#xff1f;接下来就给大家分享一些恢复回收站文件被删除的方法&#xff01; 方法一、使用…

AcWing 1068. 环形石子合并(环形区间DP)

AcWing 1068. 环形石子合并&#xff08;环形区间DP&#xff09;一、问题二、思路三、代码一、问题 二、思路 在讲解这道题之前&#xff0c;我们需要先掌握线性的区间DP问题&#xff0c;如果对于线性区间DP的解决方式还不了解的话&#xff0c;建议先看一下这篇文章&#xff1a;…

概论第7章_参数估计_点估计的评价标准_相合性_无偏性_有效性

点估计的评价标准包括&#xff1a; 相合性&#xff0c; 无偏性&#xff0c; 有效性。 一. 相合性 衡量一个估计是否可行的必要条件&#xff0c; 就是估计的相合性。 本文不提其定义了。直接给出一些结论。 结论 设有正态总体N(μ,σ2\mu, \sigma^2μ,σ2) 的样本&#xff0c;…

数据结构资料汇编:栈

数据结构资料汇编&#xff1a;栈 定义 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入或删除操作的线性表。 表尾称为栈顶&#xff08;top&#xff09;&#xff0c;可以进行插入或删除操作 栈的插入操作称为进栈或入栈&#xff08;push&#xff09;栈的删除操作成为出…

Google Play 上的 Shady Reward 应用累积了 2000 万次下载

一种新的活动跟踪应用程序类别最近在 Android 的官方应用程序商店 Google Play 上取得了巨大成功&#xff0c;已在超过 2000 万台设备上下载。 这些应用程序将自己宣传为健康、计步器和养成良好习惯的应用程序&#xff0c;承诺为用户在日常生活中保持活跃、达到距离目标等提供…

字节青训前端笔记 | 跨端技术概述

本节课程内容会分为以下几个方面&#xff1a; 跨端是什么&#xff0c;给大家介绍跨端产生的背景及解决的问题跨端技术方案介绍&#xff0c;给大家介绍目前主流的跨端技术方案&#xff08;hybrid 方案/原生渲染方案/自渲染方案/小程序方案&#xff09;以及对比基于小程序跨端实…

苹果或将打造 “空气键盘”

苹果MR头显玩法大揭秘前言苹果MR头显要来了打造 “空气键盘”眼动追踪与手部追踪一键切换VR/AR模式前言 随着2021年10月FaceBook正式改名Meta后&#xff0c;标志着元宇宙元年的正式到来&#xff0c;元宇宙行业开始出现井喷式的爆发。再到2022年10月&#xff0c;“飞天云动”在…

欧科云链链上卫士:2023年1月安全事件盘点

一、基本信息 2023年1月安全事件共造成约1438万美元损失&#xff0c;相比上个月的安全事件损失金额大幅度下降。其中多链项目LendHub 被攻击&#xff0c;损失高达600万美元&#xff0c;为本月资金损失最大的安全事件。本月RugPull数量基本与上月持平。社媒诈骗等事件依然频发&a…

分布式微服务3

目录 Feign远程调用 基于Feign远程调用 Feign替代RestTemplate 1.引入依赖 2.添加注释 3.编写Feign的客户端 4.测试 5.总结 自定义配置 1.引入依赖 2.配置连接池 3.总结 Gateway网关 Gateway快速入门 1.创建gateway服务&#xff0c;引入依赖 2.编写启动类 3.编写…

【微服务】Nacos集群搭建

Nacos集群搭建1.集群结构图2.搭建集群2.1.初始化数据库2.2.下载nacos2.3.配置Nacos2.4.启动2.5.nginx反向代理2.6.优化1.集群结构图 官方给出的Nacos集群图&#xff1a; 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。 我们…

实战:进入Linux系统 紧急模式,重置root密码

实战:进入CentOS 7紧急模式,重置root密码 实战场景:公司的一台CentOS 7系统忘记root密码了,需要快速把root密码修改为 qwer,找回root身份。 (1)重启系统,在出现内核选择界面时(在此界面中,如果不按键盘的上下方向键,则在默认时间过去后,自动选择光标所选的内核并…

题库——“计算机基础”

小雅兰为开学考试而奋斗 模块一 计算机基础概述 &#xff08;1&#xff09;信息技术基本知识 &#xff08;2&#xff09;计算机的发展与应用 &#xff08;3&#xff09;计算机的工作原理 &#xff08;4&#xff09;计算机系统的组成 &#xff08;5&#xff09;微型计算机主要硬…

九龙证券|AIGC彻底火了,概念股全线上涨,走势领先者三连板!

一夜之间&#xff0c;AIGC走红A股&#xff0c;谁会成为商场宠儿&#xff1f; A股历来盛行炒作新体裁&#xff0c;尤其是新体裁诞生的初期&#xff0c;资金参与热心高涨&#xff0c;诞生牛股概率更高。诞生不足两月的ChatGPT便是今年以来最抢手体裁之一&#xff0c;由ChatGPT带动…

Bug:浏览器一直访问旧资源

Bug&#xff1a;浏览器一直访问旧资源 1 问题阐述 今天在查看自己部署的项目时候&#xff0c;发现浏览器总是访问旧的资源 2 排查思路 2.1 浏览器缓存问题 清除浏览器缓存 ctrl shift del2.2 tomcat问题 我的项目是部署在tomcat上的&#xff0c;因此我怀疑是tomcat的配置问…

C语言学习-ProtoThread

一、简介随着RTOS的应用&#xff0c;程序在开发的时候&#xff0c;程序逻辑也变得越来越清晰。但是RTOS因为体量比较大&#xff0c;在一些内存比较小的MCU中无法应用。所以&#xff0c;在裸机的开发中&#xff0c;通常是使用一个while(1)来作为整个程序的大循环。当有条件需要执…

Vue路由传递query参数的两种方式

路由是可以传递参数的&#xff0c;一般使用query进行传参&#xff0c;有两种方式&#xff0c;接下来一一展示 案例展示 先编写一个简单的案例 我这里用的一个三级路由 这里使用三级路由以及展示路由视图 这样点击就跳转对应的路径了&#xff0c;接下来进行路由跳转的时候传参…

python之selenium入门教程

selenium&#xff0c;一个第三方库&#xff0c;可以通过给driver发送命令来操作浏览器&#xff0c;以达到模拟人操作浏览器&#xff0c;实现网页自动化、测试等&#xff0c;减少了重复性工作。 selenium的工作的基本架构如下&#xff1a; 安装 本文是在python环境下使用sele…

聚观早报 | 保时捷回应12.4万帕纳梅拉遭抢购;英特尔大规模降薪

今日要闻&#xff1a;保时捷回应12.4万帕纳梅拉遭抢购&#xff1b;特斯拉大力生产4680电池和Semi电动重卡&#xff1b;Spotify 月活用户预计下季度将达5亿里程碑&#xff1b;PayPal将裁员约2000人约占员工总数7%&#xff1b;英特尔大规模降薪 CEO基本薪酬削减25%保时捷回应12.4…