docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

时间:2023-02-07 09:58:11


场景

若依前后端分离版手把手教你本地搭建环境并运行项目:

​​若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-博客_前后端分离的项目怎么运行​​

上面在搭建起来前后端分离版的项目后。

如果想通过Dockerfile的方式部署项目可以参考如下。

Docker中使用Dockerfile的方式部署SpringBoot+Vue前后端分离的项目(若依前后端分离框架为例):

​​Docker中使用Dockerfile的方式部署SpringBoot+Vue前后端分离的项目(若依前后端分离框架为例)_霸道流氓气质的博客-博客_若依 dockerfile​​

除此之外,还可以使用docker-compose的方式去编排部署各个服务。

docker-compose

简介

​Overview | Docker Documentation​

docker-compose是基于docker的开源项目,托管于github上,由python实现,

调用 docker服务的API负责实现对docker容器集群的快速编排,即通过一个单独的yaml文件,

来定义一组相关的容器来为一个项目服务。

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。

快速编排:站在项目角度将一组相关联容器整合在一起,对这组容器按照指定顺序进行启动。

Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。这里涉及2个重要的概念:

服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

项目名称

Compose 用项目名称来隔离不同的环境,在没有设置项目名称的情况下,

Compose 会用 docker-compose.yml 文件所在根目录名称做为项目名称。

每个项目有自己的 Docker network,不同项目的 Docker network 彼此不通。

在单个主机上建立多个隔离环境,Compose 使用项目名称将环境彼此隔离。

您可以在多个不同的上下文中使用此项目名称。默认项目名称是项目目录的基本名称。

您可以使用-p 命令行选项或 COMPOSE_PROJECT_NAME 环境变量设置自定义项目名称 。

默认项目目录是 Compose 文件的基本目录。可以使用–project-directory 命令行选项自定义项目目录。

Compose与Docker的兼容性

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

 

注:

博客:
​霸道流氓气质的博客_博客-C#,架构之路,SpringBoot领域博主​​

实现

1、确保服务器已经安装Docker以及Compose,可通过

docker --version

docker-compose --version

2、在服务器上新建如下目录

首先新建fzysShow目录,作为项目所在目录以及项目名称,然后进入该目录,创建如下目录以及文件

docker-compose.yml文件

java目录,目录下存放后台服务fzys.jar包

mysql目录,目录下新建data目录,作为数据挂载目录

nginx目录,目录下新建config目录,config目录下新建nginx.conf配置文件;新建font目录,目录下存放dist前端打的包;新建log目录,映射挂载日志目录。

redis目录,目录下新建data目录和redis.conf配置文件。

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

 

3、修改docker-compose.yml的内容为

version: "3.8"

services:

redis:
image: redis:latest
restart: always
ports:
- "36379:6379"
volumes:
- ./redis/redis.conf:/etc/redis/redis.conf
- ./redis/data:/data
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:latest
restart: always
ports:
- "33306:3306"
command: --lower_case_table_names=1
environment:
MYSQL_DATABASE: fzys-show
MYSQL_ROOT_PASSWORD: Fzys@123!
MYSQL_ROOT_HOST: '%'
TZ: Asia/Shanghai
volumes:
- ./mysql/data:/var/lib/mysql

kkfileview:
image: zjblovewl/kkfile:4.9
ports:
- "38012:8012"

nginx:
image: nginx:latest
ports:
- "390:390"
volumes:
- ./nginx/font/dist:/usr/share/nginx/dist
- ./nginx/log:/var/log/nginx
- ./nginx/config/nginx.conf:/etc/nginx/nginx.conf

java:
image: openjdk:8u342-oracle
restart: always
volumes:
- ./java:/home
working_dir: /home/
ports:
- "39090:39090"
- "38901:8901"
environment:
TZ: Asia/Shanghai
depends_on:
- redis
- mysql
command: [
'java',
'-jar',
'/home/fzys.jar'
]

配置讲解:

首先声明compose的版本为3.8

然后声明各服务

redis服务:

镜像为redis:latest,端口映射宿主机36379映射到容器6379,数据卷挂载宿主机当前目录下./redis/redis.conf

映射到容器内/etc/redis/redis.conf的配置文件以及数据data目录挂载。执行命令redis-server /etc/redis/redis.conf

使redis通过读取配置文件的方式启动。这里需要注意redis的版本与redis.conf配置文件的版本对应问题,以及

需要赋予宿主机./redis/redis.conf的权限问题。进入到./redis目录下执行

chmod -R 777 redis.conf

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

 

DockerCompose编排Redis6.2.6以及遇到的那些坑:

​​DockerCompose编排Redis6.2.6以及遇到的那些坑_霸道流氓气质的博客-博客​​

mysql服务:

这里mysql为版本8,所以需要执行command使其忽略表名大小写。然后配置初始化需要的库以及root用户密码和限制访问的

ip等相关环境变量。

kkfileview服务:

这个为系统中用到的文件预览服务,如果用不到可以去掉这个。

nginx服务:

端口映射以及数据卷映射。映射宿主机当前目录下./nginx/font/dist至容器内usr/share/nginx/dist目录,这个就是用来存放前端包的;映射配置文件./nginx/config/nginx.conf:/etc/nginx/nginx.conf。

修改配置文件nginx.conf的内容为:

worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 390;
server_name localhost;
client_max_body_size 300M;

location / {
root /usr/share/nginx/dist;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}

location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://你的服务器ip:39090/;
}

location /websocket/ {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://你的服务器ip:39090;
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
proxy_read_timeout 5s;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

注意:

这里在配置文件中添加了websockt的代理的相关配置,如果不需要可以去掉,只关注反向代理的部分。

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

 

注意这里映射的目录,前端是容器内的/usr/share/nginx/dist目录,已经在yml中将其映射到宿主机

./nginx/font/dist目录,所以需要将前端项目打包,并上传至宿主机./nginx/font/dist,注意dist目录就是打包后

的目录,不要在dist下再有一层dist目录。

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

 

可通过本地dist压缩并上传至服务器解压的方式。

java服务:

这里用的jdk的镜像,映射当前目录下./java到容器内home目录下。然后将当前工作目录切换至home目录下,这里端口映射

根据自己的后台服务需要的接口进行映射。depends_on指定java需要依赖redis和mysql这两个服务,避免启动顺序问题。然后

command执行命令,启动jar包。

所以需要将后台jar包上传至宿主机java目录下。

4、yml文件编排完成,需要启动项目并查看日志

来到docker-compose.yml所在的目录下,输入

docker-compose up

启动项目,不加-d参数可以使其不要后台启动,可以直接查看各服务的日志。

此时mysql只是初始化了库并没有导入sql,所以后台java会进行包括,可以先忽略,待mysql启动成功之后

使用客户端工具,将需要的表进行同步结构和数据到服务器上即可。

当然mysql还可以通过dockerfile以及脚本的方式导入sql文件,但是这里需要将部分表的接口以及部分表的数据

同步到服务器上,所以没有初始化sql,而是选择手动传输数据库表和数据的方式。

同步完数据库之后,按ctrl+c可以结束所有服务,停掉整个项目,再输入一遍

docker-compose up

此时后台不再报错,各服务均启动正常。

也可以单独针对一个项目中某个服务进行重启,比如需要更新前端dist包,只要将原来宿主机下

./nginx/font/dist的dist删除并上传最新的dist包,然后重启nginx服务。

docker-compose restart nginx

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

 

5、docker-compose常用命令

docker compose ps

可以列出「当前项目」下所有的服务

docker compose build

格式:docker compose build [SERVICE...] 构建 docker-compose.yml文件中的服务,生成镜像。

docker compose up

启动的容器都在前台,控制台将实时打印所有容器的输出信息(以不同的颜色标识不同的服务),

可以很方便进行调试。当按下 Ctrl+C 时,所有容器都会被停止。

如果使用 docker compose up -d,则所有服务将在后台启动。

docker compose stop

停止项目中的所有服务容器。

docker compose start

启动项目中的所有服务容器。

docker compose restart

重启项目中的所有服务容器。

注意上面的启动、停止、重启都可以后面跟具体的服务名,进而对单个服务进行操作。

docker compose down

此命令将会『停止并删除』docker-compose.yml中定义的所有服务容器和网络,但保留数据卷。

docker compose logs

查看当前项目下所有服务容器的日志输出。也可跟具体服务名。

6、查看当前项目服务运行状态是否正常

状态均为Up,各服务启动成功

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

 然后访问服务器的390端口,显示系统页面并出现验证码,则部署成功。

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例