Bootstrap

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

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

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

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

这次的项目中我编写了两个 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-jre
WORKDIR /usr/local/njk-miniapp
ADD njk-miniapp-1.0.jar miniapp.jar
EXPOSE 9205
VOLUME /logs/njk-miniapp
ENTRYPOINT ["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 配置在真实项目中的使用展现给大家,另一方也是做个总结。大家有什么好的建议和问题,记得留言给我!^,^