下载若依前后端分离项目
使用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命令查看后端容器日志,出现"若依启动成功"就好了。

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