本文以真实的项目为例,主要介绍在 spring-cloud 微服务项目部署过程中配置 docker-compose.yml 文件并使用 docker-compose 相关指令对项目中各个环境/模块整体部署,以及如何个别部署指定 Service 服务。
这篇文章另一方面也是为了对上次项目的一个总结。不仅配置了 mysql、redis、nacos、seata 在内的基础服务的构建配置,还就应用服务的配置也做了介绍。
docker 及 docker-compose 的安装
关于 docker 和 docker-compose 的安装根据不同宿主系统有不同的安装方式,具体参见:https://docs.docker.com/engine/install/ 就好,笔者在这次记录中使用的是 CentOS7。
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-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 配置在真实项目中的使用展现给大家,另一方也是做个总结。大家有什么好的建议和问题,记得留言给我!^,^
评论