Ruoyi-Vue是若依前后端分离版,如何像Ruoyi-Cloud那样进行Docker部署,可以参照Ruoyi-Cloud的docker样例,进行Ruoyi-Vue的docker改造。
Docker模块分析
Ruoyi-Cloud包括以下docker容器:
ruoyi-nacos --微服务注册与发现
ruoyi-mysql --mysql数据库
ruoyi-redis --redis缓存
ruoyi-nginx --代理服务
ruoyi-gateway --网关服务
ruoyi-auth --认证服务
ruoyi-modules-system --系统管理模块
ruoyi-modules-gen --代码生成模块
ruoyi-modules-job --定时任务模块
ruoyi-modules-file --文件服务模块
ruoyi-visual-moniter --监控服务
1、若依前端代码部署在ruoyi-nginx容器下,此部分可沿用;
2、外部服务(mysql、redis)在分离版也是必须的,这两部分容器可沿用;
3、后端代码可直接springboot启动,那么就可以拿一个类似容器改造即可,选定ruoyi-gateway。
经过一通Ctrl+C、Ctrl+V,大致整理出如下docker结构:
docker
| mysql
| | db
| | └─ readme.txt -- git use.
| └─ dockerfile
| nginx
| | conf
| | └─ nginx.conf
| | html
| | └─ dist --前端代码发布路径
| | └─ readme.txt -- git use.
| └─ dockerfile
| redis
| | conf
| | └─ redis.conf
| └─ dockerfile
| ruoyi
| | jar
| | └─ readme.txt -- git use.
| └─ dockerfile
| docker-compose.yml
| copy.sh
└─ deploy.sh
Docker部署步骤
Docker部署流程如下:
前提条件:前端、后端成功编译完成。
- 1、进入docker目录,运行:
sh copy.sh
- 2、返回docker目录上层,压缩整个docker目录;
tar zcvf docker.tar.gz docker
- 3、上传并解压
docker.tar.gz
包到配置服务器; - 4、进入docker目录,运行以下命令部署服务:
sh deploy.sh base
sh deploy.sh modules
- 5、查看服务运行状态,确认四个docker容器运行状态是否正常;
docker ps -a
- 6、以上都正常的情况下,浏览器确认系统运行是否正常。
Docker改造过程中可能遇到的坑及解决办法
- 1、mysql连接问题
这里大致分为以下几个原因:
①、容器与宿主机端口映射错误;
本项目中容器的mysql端口是默认端口3306,笔者发布宿主机中3306端口已经被占用,于是映射在3307端口上,在docker-compose.yml
的mysql
段,我开始误将ports
设定为如下形式:
ports:
- "3307:3307"
应用在进行数据库连接时报如下异常日志:
ERROR c.a.d.p.DruidDataSource - [init,931] - init datasource error, url: jdbc:mysql://172.17.0.1:3307/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
此时,通过宿主机mysql命令:
mysql -uroot -P3307 -p
报如下异常:
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
要解决这个问题,将最初的 ports
属性设定正确即可:
ports:
- "3307:3306"
②、mysql root 用户密码错误;
一般在宿主机通过以下命令:
mysql -hlocalhost -uroot -P3307 -p
输入密码后判断应用中设定的密码是否正确。错误输出一般是:
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
这里需要注意一点,-h
和-P
参数最好设定,宿主机如果已经安装mysql服务时,非常容易被干扰 : )
③、应用中数据库连接字符串设定错误;
笔者开始在配置应用数据库连接信息的时候,一直报数据库连接异常如下:
ERROR c.a.d.p.DruidDataSource - [init,931] - init datasource error, url: jdbc:mysql://localhost:3307/ry-vue?useUnicode=true\u0026characterEncoding=utf8\u0026zeroDateTimeBehavior=convertToNull\u0026useSSL=true\u0026serverTimezone=GMT%2B8
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link
此时的应用配置为:
druid:
# 主库数据源
master:
url: jdbc:mysql://localhost:3307/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
而在宿主机控制台用mysql连接时也是异常如下:
mysql -hlocalhost -P3307 -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
通过以下命令进入mysql docker容器内,测试数据库可以正常连接:
docker exec -it mysql容器id /bin/bash
mysql -hlocalhost -P3306 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.38 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
由此基本判定是连接字符串设定不正确的原因。
错误现象表现为:在容器内部用localhost
可以正常连接,而在宿主机和应用中同样使用 localhost
却是连接失败!
之后我试着将localhost
修改为 127.0.0.1
以及 ruoyi-vue-mysql
(容器名称)还是同样的结果。
既然是ip地址的问题,那就看看宿主机的ip设定吧:
ifconfig
突然发现以下信息:
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:92ff:fe79:e81e prefixlen 64 scopeid 0x20<link>
ether 02:42:92:79:e8:1e txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 32 bytes 2832 (2.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这里有一段名叫 docker0
的桥接信息,ip是:172.17.0.1
,果断使用该ip,在宿主机中使用 mysql
命令成功连接!同样,应用中配置修改为该ip后,异常排除。
- 2、应用容器异常退出问题
在配置应用服务docker的时候,如果应用中有异常信息,一般docker容器会异常退出,此时我们如何排查容器是什么原因退出的呢?
此时如果使用docker exec -it 容器ID /bin/bash
命令肯定是不可行的,容器已经异常退出了,想进入到容器里找寻应用的l日志文件也不现实。
这时,需要使用docker inspect
命令来查看容器的日志信息,直接获得应用程序启动时的后台输出排查即可。
命令如下:
docker ps -a
# 该命令可获取异常退出容器的容器ID
docker inspect 要调查的容器ID | grep LogPath
一般会输出以下信息:
"LogPath": "/var/lib/docker/containers/xxxxxxxx-json.log",
查看 /var/lib/docker/containers/xxxxxxxx-json.log
文件内容即可排查问题所在。
源码
以上Docker部署所需脚本几乎来自若依微服务版的改写,特别感谢若依的无私奉献,笔者只做记录。如大家有所需,请移步至:
码云
有问题也请在码云里提交,3ks!