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.ymlmysql 段,我开始误将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!