若依前后分离版(Ruoyi-Vue)的Docker部署

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!

你可能感兴趣的:(若依管理系统部署,docker)