写点什么

如何使用 docker-compose 快速部署 SpringCloud 项目

用户头像
皮特王
关注
发布于: 2021 年 03 月 24 日
如何使用docker-compose快速部署SpringCloud项目

本文以真实的项目为例,主要介绍在 spring-cloud 微服务项目部署过程中配置 docker-compose.yml 文件并使用 docker-compose 相关指令对项目中各个环境/模块整体部署,以及如何个别部署指定 Service 服务。

这篇文章另一方面也是为了对上次项目的一个总结。不仅配置了 mysql、redis、nacos、seata 在内的基础服务的构建配置,还就应用服务的配置也做了介绍。


  1. docker 及 docker-compose 的安装

关于 docker 和 docker-compose 的安装根据不同宿主系统有不同的安装方式,具体参见:https://docs.docker.com/engine/install/ 就好,笔者在这次记录中使用的是 CentOS7。

  1. docker-compose 对应配置文件编写

这次的项目中我编写了两个 yml 文件,来启动我们的微服务项目。

为什么写了两个 yml 文件,主要就是想把基础服务和应用服务区分开来。基础服务就是我们常说的数据库、缓存服务等供应用服务使用的服务。

上 yml 配置文件之前,先把 docker-compose 工程的目录结够贴出来看下整体项目结构, 如下图:


前面 6 个目录为应用服务部分,包括 auth(鉴权)、boss(后台管理)、cert(业务服务)、fileserver(文件服务)、gateway(网关服务)、miniapp(小程序服务);后面 4 个为基础服务包括 mysql、redis、nacos、seata;

1)基础服务;

基础服务统一在 docker-composeBase.yml 里面配置,详细配置如下:

version: "3.8"
services: redis: # redis 服务 image: redis:6.0.12 container_name: redis ports: - 6379:6379 networks: - njk-net restart: always volumes: - "redisdata:/data"
mysql: # mysql 服务 image: mysql:5.7.33 container_name: mysql ports: - 3306:3306 networks: - njk-net volumes: - "mysqldata:/var/lib/mysql" environment: MYSQL_ROOT_PASSWORD: mysqlPWD command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
nacos: image: nacos/nacos-server:1.4.1 ports: - 8848:8848 networks: - njk-net volumes: - "nacoslogs:/home/nacos/logs/" env_file: - nacos/nacos-standlone-mysql.env depends_on: - mysql
seata: image: seataio/seata-server:1.4.1 environment: - "SEATA_CONFIG_NAME=file:/root/seata-config/registry" ports: - 8091:8091 networks: - njk-net volumes: - "./seata/:/root/seata-config/" restart: on-failure depends_on: - nacos - mysql
networks: njk-net:
volumes: certfile: redisdata: nacoslogs: mysqldata:
复制代码

2)应用服务

这里应用服务只包含了后台相关的服务(前端部署包括小程序代码的提交审核、后台管理系统的前端代码这里不给出,有需要配置的可以在下面留言哦),在基础服务启动后就可以启动应用服务了,应用服务的配置在 docker-compose.yml 下,具体配置如下:

version: "3.8"
services: gateway: # 网关服务 build: context: gateway dockerfile: Dockerfile container_name: gateway_server ports: - 8080:8080 networks: - njk-net restart: on-failure volumes: - "/data/logs/gateway:/logs/my-gateway" environment: - "spring.cloud.nacos.discovery.server-addr=nacos:8848" - "spring.cloud.nacos.config.server-addr=nacos:8848" - "spring.cloud.sentinel.transport.dashboard=nacos:8718" - "spring.cloud.sentinel.datasource.ds1.nacos.server-addr=nacos:8848"
auth: # 权限模块 build: context: auth dockerfile: Dockerfile container_name: auth_server ports: - 9200:9200 networks: - njk-net volumes: - "/data/logs/auth:/logs/njk-auth" depends_on: - gateway environment: - "spring.cloud.nacos.discovery.server-addr=nacos:8848" - "spring.cloud.nacos.config.server-addr=nacos:8848" restart: on-failure
boss: # 后台管理模块 build: context: boss dockerfile: Dockerfile container_name: boss_server ports: - 9021:9021 networks: - njk-net volumes: - "/data/logs/boss:/logs/njk-system" depends_on: - gateway environment: - "spring.cloud.nacos.discovery.server-addr=nacos:8848" - "spring.cloud.nacos.config.server-addr=nacos:8848" restart: on-failure
certfile: #证书文件相关 build: context: certfile dockerfile: Dockerfile container_name: file_server ports: - 9300:9300 networks: - njk-net volumes: - "/data/logs/file:/logs/njk-file" - "certfile:/data" depends_on: - gateway environment: - "spring.cloud.nacos.discovery.server-addr=nacos:8848" - "spring.cloud.nacos.config.server-addr=nacos:8848" restart: on-failure
miniapp: #小程序后台 build: context: miniapp dockerfile: Dockerfile container_name: miniapp_server ports: - 9205:9205 networks: - njk-net volumes: - "/data/logs/miniapp:/logs/njk-miniapp" depends_on: - gateway environment: - "spring.cloud.nacos.discovery.server-addr=nacos:8848" - "spring.cloud.nacos.config.server-addr=nacos:8848" restart: on-failure
cert: build: context: cert dockerfile: Dockerfile container_name: cert_server ports: - 9204:9204 networks: - njk-net volumes: - "/data/logs/cert:/logs/njk-cert" depends_on: - gateway environment: - "spring.cloud.nacos.discovery.server-addr=nacos:8848" - "spring.cloud.nacos.config.server-addr=nacos:8848" restart: on-failure
networks: njk-net:
volumes: certfile: redisdata: nacoslogs: mysqldata:
复制代码

注意:应用服务启动,在使用 docker-compose 时,一般需要自定义 Dockerfile 文件来构建镜像。所以两个 yml 配置上应用服务部署采用的是 build 模式。

比如在我的项目中 miniapp 应用使用的是 spring-boot 进行构建的,如果你也是用的 spring-boot 可以参数如下的 Dockerfile 配置文件:

FROM openjdk:8-jreWORKDIR /usr/local/njk-miniappADD njk-miniapp-1.0.jar miniapp.jarEXPOSE 9205VOLUME /logs/njk-miniappENTRYPOINT ["java", "-jar"]CMD ["miniapp.jar"]
复制代码


项目整体启动和个别项目重启

1、根据 docker-composeBase.yml 文件启动基础服务:


2、通过 docker ps 查看上面的服务,然后就可以根据 docker-compose.yml 启动应用服务了, 如下图:


3、正常情况下,我们的某个模块可能会持续迭代,所以有时候我们要独立更新;这里我要单独更新 cert 服务,首先要 docker stop cert_server , 然后删除 img ,最后使用 docker-compose 单独指定 cert 服务,如下图:


结语

在容器中部署项目已经是非常普遍的技术了,这里主要是想把 docker-compose 配置在真实项目中的使用展现给大家,另一方也是做个总结。大家有什么好的建议和问题,记得留言给我!^,^

发布于: 2021 年 03 月 24 日阅读数: 7
用户头像

皮特王

关注

还未添加个人签名 2016.01.06 加入

还未添加个人简介

评论

发布
暂无评论
如何使用docker-compose快速部署SpringCloud项目