Dokcer Compose部署若依前后端分离项目

下载若依前后端分离项目

使用docker-compose方式去编排部署各个服务,通过docker-compose.yml文件来定义一组关联的各个服务。

可以把github上的若依项目克隆到linux服务器上和本地目录中。在linux环境下运行docker,启动docker服务。

在服务器上新建目录,作为项目所在目录。进入该目录查看下载的项目,其中,ruoyi-ui是前端项目,剩下的是后端项目。

linux服务器上是安装好了docker的,可以查看下:

我想用Docker Cocmpose部署若依前后端分离项目,在服务器上新建一个目录doccker-compose-ruoyi。这个目录用来放运行项目需要的内容,比如:前端打包的dist文件夹、后端打包后的jar包、conf配置文件、dockerfile文件、docker-compose.yml文件等。

前端打包

修改了前端项目ruoyi-ui的vue.congif.js中的devSerVer下的代理部分的host为docker-compose.yml中的前端服务名称,修改了target对应的IP为docker-compose.yml中的后端服务名称。

写成服务名称的好处是,以后迁移到别的电脑上,只要用docker compose运行,就可以运行起来。

打包项目,将dist目录压缩并上传到Linux服务器上; 在服务器中解压dist到docker-compose-zxx/html目录下。

打包前端项目:进入 ruoyi-ui 目录,运行npm run build:prod命令来打包前端项目。这将生成一个 dist 目录,其中包含了打包后的前端静态文件。

接着,应该把dist目录放到linux服务器中对应的目录下。把本地的dist压缩以后再上传到服务器上,项目右击选择"Upload to current folder"即可(我使用的是MobaXterm 工具远程连接Linux服务器)。

在服务器上,把上传的dist压缩包解压一下。在服务器上的docker-compose-ruoyi/html目录下新建一个文件夹dist,用来存放解压的内容。

然后,使用 unzip 命令来解压缩 ZIP 文件:

linux 复制代码
unzip 压缩文件 -d 解压的目标文件

查看目标文件dist,可以看到解压缩成功了。

后端打包

要改ruoyi-admin项目中的两个文件,文件路径如下所示:

修改application.yml文件,把redis的host改成docker-compose.yml中定义的redis服务名称,端口还是用的若依官方写好的6379。

修改application-druid.yml文件,把原本的localhost改成docker-compose.yml中定义的mysql服务名称。

ruoyi-mysql是mysql服务,3306是端口号,ry-vue是数据库名称。mysql的用户名和密码我没改,用户名还是root,密码是password。

打包的指向的是ruoyi-mysql这个服务;也就是说,在docker-compose.yml中,数据库服务的名称是ruoyi-mysql,并且端口是3306,就能连上数据库了。

在本地打包后端完成,会出现一个jar包,如下所示:

在docker-compose-ruoyi下新建一个jar目录,直接把打包的jar包放到了jar目录下(项目根目录空白处右键选择"Upload to current folder"),不用解压缩,如下所示:

数据库

在docker-compose-ruoyi目录下新建一个db目录。

把在服务器下载好的若依项目的sql目录下所有.sql文件复制到docker-compose-ruoyi/db目录下(利用linux的cp命令即可)。

在几个数据库文件的开头中都添加了内容以防乱码 SET NAMES 'utf-8'

conf

在docker-compose-ruoyi目录下新建conf目录,用来放nginx.conf和redis.conf文件。

Nginx.conf文件作用:用于配置nginx服务器的行为和功能。将来自客户端的请求分发到不同的处理逻辑,例如静态文件请求会被定向到 /home/ruoyi/projects/ruoyi-ui 目录下的文件,而以 /prod-api/ 开头的请求会被转发到 ruoyi-server 服务(这个服务就是在docker-compose.yml文件中定义的后端服务)。它还定义了一些默认的行为,如默认的 MIME 类型和错误页面处理。

编写Dockerfile文件

新建下面几个dockerfile文件,分别用来创建对应服务的镜像。

mysql-dockerfile文件

基础镜像是mysql5.7。

将当前目录下 ./db/ 文件夹中的所有以 .sql 结尾的文件复制到 MySQL 容器内部的 /docker-entrypoint-initdb.d/ 目录下;那么,当数据库容器启动时,它会自动执行这些 SQL 脚本,以便初始化数据库。这种方式非常方便,因为它允许在容器启动时自动执行初始化脚本,而无需手动登录到容器内部执行 SQL 命令。

redis-dockerfile文件

nginx-dockerfile文件

使用nginx作为基础镜像。

VOLUME /home/ruoyi/projects/ruoyi-ui:这是创建一个挂载点,将主机的目录 /home/ruoyi/projects/ruoyi-ui 与容器内的目录进行挂载,实现主机和容器之间的文件共享。

RUN mkdir -p /home/ruoyi/projects/ruoyi-ui:这是在容器内创建一个目录 /home/ruoyi/projects/ruoyi-ui。使用 -p 参数可以递归创建目录,如果目录已存在则不会报错。

WORKDIR /home/ruoyi/projects/ruoyi-ui:这是指定容器的工作目录为 /home/ruoyi/projects/ruoyi-ui,后续的指令都会在该目录下执行。

COPY ./conf/nginx.conf /etc/nginx/nginx.conf:这是将主机当前目录的 ./conf/nginx.conf 文件复制到容器内的 /etc/nginx/nginx.conf 路径下。这样做是为了将主机上的 Nginx 配置文件复制到容器内,以便在容器中使用自定义的 Nginx 配置。

COPY ./html/dist /home/ruoyi/projects/ruoyi-ui:这是将主机当前目录的 ./html/dist 目录复制到容器内的 /home/ruoyi/projects/ruoyi-ui 路径下。这样做是为了将主机上的静态 HTML 文件复制到容器内,以供 Nginx 服务器提供静态网页服务。

这样,使用该镜像创建的容器就可以运行 Nginx 服务器,并提供指定的配置和静态网页。

ruoyi-dockerfile文件

使用openjdk:8-jre作为基础镜像。

在容器中新建了/home/ruoyi目录,并将当前目录下的jar文件夹中的所有jar文件都复制到容器的/home/ruoyi目录下,并将复制的jar文件重命名为ruoyi.jar。

ENTRYPOINT 是 Dockerfile 中的一个指令,用于设置容器启动时要执行的命令。

ENTRYPOINT ["java","-jar","ruoyi.jar"] 指定了容器启动时要执行的命令。具体来说,它告诉 Docker 在容器内部执行 java -jar ruoyi.jar 命令。

解释一下这个命令的含义:

  • java 是 Java 运行时的可执行文件,用于执行 Java 应用程序。
  • -jar 是 Java 命令的一个选项,表示要执行的是一个可执行的 JAR 文件。
  • ruoyi.jar 是要执行的 JAR 文件的名称。

因此,当使用ruoyi-dockerfile文件创建镜像、容器并运行容器时,容器将自动执行 java -jar ruoyi.jar 命令,启动并运行 ruoyi.jar 这个 Java 应用程序。

编写docker-compose.yml脚本

在根目录下创建一个docker-compose.yml文件。

下面的docker-compose.yml文件定义了四个服务:ruoyi_mysql、ruoyi_redis、ruoyi_server 和 ruoyi_nginx。

其中,ruoyi_mysql 和 ruoyi_redis 是用于存储数据的服务,ruoyi_server 是后台服务,ruoyi_nginx是前端服务。

注意:后台服务依赖于数据库服务和redis服务(ruoyi-mysql和ruoyi-redis启动了,ruoyi-server才会启动)。

前端服务依赖于后台服务(ruoyi-server启动了,ruoyi-nginx才会启动)。

这个 Docker Compose 文件中,每个服务都基于各自的dockerfile文件构建镜像,把这4个dockerfile 文件都放到docker-compose.yml中运行,好处就是这几个服务都会处于同一个网段。

在服务容器都启动时,可以利用docker inspect 容器id 查看几个容器的IP地址,会发现它们都是在同一个网段的。 也就是,docker-compose.yml里面定义的这几个服务就是一个个主机,它们各自有自己的IP,并且它们都在同一个网段

这几个服务的执行顺序是:

ruoyi-mysql-----ruoyi-redis-----ruoyi-server-----ruoyi-nginx

注意:每个服务的镜像都是根据不同的Dockerfile文件构建的,在起镜像名称之前,先用docker images查看下已经存在的镜像名称。

镜像名称不要和本地已经存在的镜像重名了。

如果在本地或者docker仓库能找到这个镜像,那么就会直接用这个镜像启动容器。也就是,不会用我们写好的Dockerfile文件去构建镜像了,而是会直接使用已经有的镜像。

如果没有,就会根据dockerfile文件去构建新的镜像,基于新的镜像启动容器。
自定义的镜像名称最好避开和官方镜像相同的名称,可以加前缀去区分开,tag也可以起一个自己能区分的。

运行docker-compose.yml文件

在docker-compose.yml所在目录运行命令:

js 复制代码
docker-compose up -d

可以在运行过程中看到这几个服务的执行顺序是:

ruoyi-mysql-----ruoyi-redis-----ruoyi-server-----ruoyi-nginx

用docker ps -a查看容器:

运行以后,目录会出现新的4个目录,这是运行过程中产生的。

访问前端服务的端口可以看到项目界面,登录可以看到数据:

部署遇到的问题

后端服务与数据库服务通信失败的问题

查看容器,可以看到后端容器已经退出了:

访问项目报错:

原因和解决方法:

第一次报错没启动起来,是因为首次ruoyi-mysql这个容器还没启动完成,所以后端服务连接不上。 虽然加了depends_on,但只能保证 ruoyi-mysql服务和ruoyi-redis服务启动了,后端服务才能启动,并不能保证ruoyi-mysql启动完成了再启动后端服务。

需要重启一下后端服务这个容器,这样就可以了。

重启后端服务的容器:

再次查看容器运行状态,可以看到后端服务的容器正常运行了。

利用docker logs命令查看后端容器日志,出现"若依启动成功"就好了。

这样,再次访问项目就正常了。

相关推荐
wellshake23 分钟前
在 Docker 中部署无头 Chrome:在 Browserless 中运行
chrome·docker·容器
Jason-河山1 小时前
「铭记历史 珍爱和平」勿忘9.18!
前端
国王不在家1 小时前
keyof和infer
前端
猿大撒1 小时前
Spring-data-redis
前端·bootstrap·html
帅过二硕ฅ2 小时前
uniapp点击跳转到对应位置
前端·javascript·uni-app
正小安5 小时前
URL.createObjectURL 与 FileReader:Web 文件处理两大法宝的对比
前端·javascript
赵广陆5 小时前
SprinBoot+Vue宠物寄养系统的设计与实现
前端·vue.js·宠物
A黄俊辉A6 小时前
vue3中把封装svg图标为全局组件
前端·javascript·vue.js
老贾爱编程6 小时前
VUE实现刻度尺进度条
前端·javascript·vue.js
F2E_Zhangmo6 小时前
vue如何做到计算属性传参?
前端·javascript·vue.js