Docker部署SpringBoot+Redis+RabbitMQ+MySQL+Nginx+Minio

1.项目简介

动物实验管理系统面向生物科技相关人员提供了一系列动物实验相关功能。

2.项目架构

3.部署平台

Win10->VMware->CentOS7->Docker

4.具体部署

前端部分:dist.zip
后端部分:animal.jar、animal.properties

4.1.Mysql

docker run --name=mysql -d --privileged=true -p 13307:3306 -v /share/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="123456" mysql:5.7.39

mysql的数据不是放在容器中,而是通过关联、映射而放在了Docker外CentOS中
查看Mysql容器是否启动,使用Navicat测试能否建立连接
如果连接成功,建立数据库animal_experiment,建立表,向表中插入数据
如果连接失败,根据提示进行排错(没有使用容器的外部IP、端口号;密码错误;防火墙)

4.2.Redis

docker run --privileged=true -p 16379:6379 --name=redis -v /share/redis/data:/data -d redis redis-server --requirepass 123456

Redis的数据不是放在容器中,而是通过关联、映射而放在了Docker外CentOS中
查看Redis容器是否启动,在docker外CentOS中使用redis-cli测试能否建立连接,测试是否能够使用配置的密码进行认证

4.3.RabbitMQ

docker run -d -p 5672:5672 -p 15672:15672 --name=mq1 rabbitmq:rabbitmq:3.9.22
docker exec mq1 rabbitmq-plugins enable rabbitmq_management
docker exec mq1 rabbitmqctl add_user admin 123456
docker exec mq1 rabbitmqctl set_user_tags admin administrator
docker exec mq1 rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

查看Mysql容器是否启动,测试能否使用Chrome访问RabbitMQ的外部IP、端口,在登陆界面使用账号guest、密码guest登录,查看adminstartor中是否存在admin及密码、主机

4.4.Minio

docker run -itd -p 19000:9000 -p 19090:19090 \
 --name minio1 \
 -e "MINIO_ACCESS_KEY=minioadmin" \
 -e "MINIO_SECRET_KEY=minioadmin" \
 -v /share/data:/data \
 -v /share/config:/root/.minio \
 minio/minio server /data \
 --console-address ":19090"

查看Mysql容器是否启动,Minio的数据不是放在容器中,而是通过关联、映射而放在了Docker外CentOS中
测试能否在浏览器中使用外部IP、端口号访问Minio,在登陆页面能否使用账号minioadmin、密码minioadmin

4.5.Tomcat(animal.jar)

4.5.1编辑配置文件

查看并记录容器mysql、redis、rabbitmq、minio的内部IP、地址。
编辑animal.properties

spring.application.name=Leiren-AnimalExperiment
server.port=8188
ispring.profiles.active=test
#访问排除路径 (不用动)
access.token.exclude.path.patterns=/,/error,/actuator/**,/login,/getTransEncryptKey,/validateCode/**,/swagger-ui.html,/verifyCode/**,/register,/isRegistered/**,/file/download/**
#ws-extends-starter配置
ws.extends.always-force-close=false
ws.extends.enable-api-doc=true
#redis config redis配置
spring.session.store-type=redis
spring.redis.host=172.17.0.5
spring.redis.port=6379
spring.redis.password=123456
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.min-idle=0
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=-1
spring.redis.timeout=3000
#mysql config mysql配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://172.17.0.2:3306/animal_experiment?useSSL=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL
spring.datasource.username=root
spring.datasource.password=123456
#spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.jpa.database=MYSQL
spring.jpa.show-sql=true
#解决事务中懒加载session关闭问题
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
#动物实验管理系统的用户默认密码
default-password=123456
#rabbitmq 配置信息
spring.rabbitmq.host=172.17.0.4
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=/
spring.rabbitmq.listener.simple.retry.enabled=true
##### minio配置 
minio.server.endpoint=172.17.0.6
minio.server.port=9000
minio.server.secure=false
minio.server.access-key=minioadmin
minio.server.secret-key=minioadmin
##### 项目需要用到的bucket 创建对应的bucket
minio.server.must-buckets=system,ethics,experiment,room-cage,animal

4.5.2 创建、启动容器

docker run -dit --name=animal \
-p 18188:8188 \
-v /opt/animalExperiment:/opt \
kdvolder/jdk8 \
java -jar -Dspring.config.location=/opt/animal.properties /opt/animal.jar

查看容器animal是否启动,日志是否没有ERROR

4.6.Nginx

4.6.1 编辑配置文件

查看并记录容器animal的IP
创建一个animal_experiment.conf

server {
 listen 8009;
 location /{
 root /var/www/dist; #对应dist的绝对路径
 index index.html index.htm;
 }
 location ^~ /api/{
 rewrite /api/(.*) /$1 break; #去掉路径中的/api 不然无法访问到服务器
 proxy_pass http://172.17.0.7:8188;
 }
}

修改nginx.conf文件中 user 使用root,linux做什么都要和权限打交道,tomcat的部署都是用的是root,所以这里就要修改权限.

打开dist目录中 static/js/app.6cc84a26.js文件,全局查找 ws://172.172.172.102 替换为你的 后端的服务器的IP地址 (有两处):
sed -e "s|ws://172.172.172.102|ws://192.17.0.7|g" -i.bak app.6cc84a26.js

4.6.2 创建、启动容器

docker run -p 18880:80 -p 18889:8009 --name mynginx \
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /etc/nginx/conf.d:/etc/nginx/conf.d \
-v /var/www:/var/www \
-d nginx

Nginx通过关联、映射实际使用Docker外CentOS中的配置文件、前端部分

检查容器nginx是否启动,测试能否使用外部IP、端口号在浏览器中访问nginx,登陆页面是否有验证码,输入账号admin、密码123456、验证码之后点击登录是否登陆成功

5.总结

5.1本次部署具有一定的先后顺序:

根据项目架构中的各个服务之间关系(Nginx访问Tomcat(animal.jar),Tomcat访问Mysql、Nginx、Redis、Minio),先测试Mysql、Redis、RabbitMQ、Minio是否正常,再测试Tomcat是否正常,最后测试Nginx是否正常。

5.2 Docker网络模式

本次docker部署项目使用的是默认网络模式,各个服务之间相互访问使用的是Docker内部IP。由于容器重启可能会发生IP改变的情况,导致在调试过程经常需要更改配置文件的中各个服务的IP,带来很大的不便,后期考虑使用静态IP。

5.3 出现问题、原因、解决

5.3.1在最后测试Nginx时,可能会出现各种问题:

(1.)在登录页面没有验证码;
(2.)在登录页面输入正确的账号、密码、验证码,点击登录,页面报错;
(3.)所有的配置都正确,但是登陆页面还是没有验证码;
(4.)所有的配置都正确,点击登录仍然报错502;

5.3.2 可能原因:

(1.1)Nginx的配置文件中Tomcat(animal)的IP、端口号与实际不符,Nginx连接Tomcat失败;
(1.2)Tomcat(animal)配置文件中Minio的IP、端口号与实际不符,Tomcat连接Minio出错;
(2.1)Tomcat(animal)配置文件中MySQL的IP、端口号、账号、密码与实际不符,Tomcat连接MySQL出错;
(2.2)Tomcat(animal)配置文件中要连接的MySQL中具体数据库名字与实际不符,登录页面、Tomcat日志显示“unknowned database XXX”;
(2.3)MySQL中忘记建立数据库;
(3.)Tomcat(animal)访问Minio需要一点点时间,稍等十几秒、几十秒就会有验证码;
(4.)某些服务的配置文件在调试过程中被修改,但没有重启该服务使用最新配置参数。

5.3.3 解决方案:

(1.1)Nginx的配置文件中Tomcat(animal)的IP、端口号与实际不符,Nginx连接Tomcat失败;
(1.2)Tomcat(animal)配置文件中Minio的IP、端口号与实际不符,Tomcat连接Minio出错;
(2.1)Tomcat(animal)配置文件中MySQL的IP、端口号、账号、密码与实际不符,Tomcat连接MySQL出错;
(2.2)检查MySQL中具体数据库的名字,确保Tomcat配置文件中MySQL DataSource URL中的具体数据库名字与实际数据库名字一致;
(2.3)MySQL中建立数据库、建立表、插入数据;
(3.)稍等十几秒、几十秒再看登陆页面或刷新登录页面;
(4.)Docker容器中六个服务全部重启。

作者:城中月原文地址:https://segmentfault.com/a/1190000042506518

%s 个评论

要回复文章请先登录注册