写点什么

使用 docker compose 快速部署前后端分离项目案例

用户头像
皮特王
关注
发布于: 2021 年 05 月 11 日
使用docker compose快速部署前后端分离项目案例

一、为什么写这篇文章

在我的上一篇文章(如何使用 docker-compose 快速部署 SpringCloud 项目)中介绍了使用 docker compose 快速部署 spring cloud 项目,但有时我们需要发布仅仅是一个单体项目。另外上面文章配置在容器间的通信没有充分使用自定义的 networks、并且对于 docker 及 docker-compose 的安装进行了跳过,本篇文章算是对之前的一个补充与修正,但是项目案例是普通 SpringBoot + VUE 项目。

二、环境准备

1、docker 的安装及配置

我使用的操作系统是 centos 7.6,这里使用的脚本进行安装(root 用户)

# curl -fsSL https://get.docker.com -o get-docker.sh# sh get-docker.sh
复制代码

执行完上面命令后,运行 docker version 可以看到下图的相关信息说明成功安装。


2、docker compose 的安装

#curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose#chmod +x /usr/local/bin/docker-compose
复制代码

执行完上面两个命令后,执行 docker-compose version 出现下图说明 docker-compose 安装完成:


3、docker 镜像源及自启动配置

在正式使用 docker 前一般需要配置镜像源为国内的镜像源,这里可以直接使用 vim 命令创建/修改 /etc/docker/daemon.json 配置文件,我这里编辑后的内容为:

{"registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]}
复制代码

最后,就是启动与自启动命令了:

启用/停用自启动: systemctl enable/disable docker.service

启动/停止: systemctl start/restart/stop docker

三、项目实例

改项目使用的是 SpringBoot + VUE 前后端分离的模块进行开发的,前端部分包括 H5_webapp 和 Boss_web ,两个 web 前端一起部署在 Nginx 上面,所以 Nginx 既是 web 服务器又是 Boss_Server 和 App_Server 的代理服务器。

1、项目部署结构及 docker-compose 结构

项目部署拓补图



docker-compose 部署代码的目录结构

2、Dockerfile 及 docker-compose.yml 文件配置

2.1、app 目录下的 Dockerfile 的配置:

FROM openjdk:8-jreWORKDIR /usr/local/tit-appADD njk-app.jar app.jarEXPOSE 8081VOLUME /home/njk/logsENTRYPOINT ["java", "-jar"]CMD ["app.jar"]
复制代码

2.2、boss 目录下的 Dockfile 的配置:

FROM openjdk:8-jreWORKDIR /usr/local/tit-bossADD njk-admin.jar boss.jarEXPOSE 8080VOLUME /home/njk/logsENTRYPOINT ["java", "-jar"]CMD ["boss.jar"]
复制代码

2.3、 web 目录下的 Dockfile 的配置:

FROM nginx:1.19COPY nginx.conf /etc/nginx/EXPOSE 443
复制代码

2.4、docker-compose.yml 的配置

version: "3.8"
services: redis: # redis 服务 image: redis:6.0.12 container_name: redis ports: - 6378:6379 networks: - njk restart: always volumes: - "redisdata:/data" environment: TZ: Asia/Shanghai
mysql: # mysql master服务 image: mysql:5.7.33 container_name: mysql ports: - 3307:3306 networks: - njk volumes: - "mysqldata:/var/lib/mysql" environment: - "MYSQL_ROOT_PASSWORD=Passw0rd_weiqin" - "TZ=Asia/Shanghai" command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --lower_case_table_names=1 --default-time-zone=+8:00
boss: # 后台管理模块 build: context: boss dockerfile: Dockerfile container_name: boss_server networks: - njk ports: - 20001:8080 depends_on: - mysql - redis volumes: - "/data/logs/tit/boss:/home/njk/logs" - "/data/uploadPath:/home/njk/uploadPath" environment: - "spring.redis.host=redis" - "spring.redis.port=6379" - "njk.domain=https://xxxxxxxx.com" - "spring.datasource.druid.master.url=jdbc:mysql://mysql:3306/njk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8" - "spring.datasource.druid.master.password=Passw0rd_weiqin" - "TZ=Asia/Shanghai" restart: on-failure
app: #H5后台服务 build: context: app dockerfile: Dockerfile container_name: app_server networks: - njk ports: - 20002:8081 depends_on: - mysql - redis volumes: - "/data/logs/tit/app:/home/njk/logs" environment: - "spring.redis.host=redis" - "spring.redis.port=6379" - "spring.datasource.druid.master.url=jdbc:mysql://mysql:3306/njk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8" - "spring.datasource.druid.master.password=Passw0rd_weiqin" - "TZ=Asia/Shanghai" restart: on-failure
web: # nginx web 服务 build: context: web dockerfile: Dockerfile container_name: nginx_h5 networks: - njk volumes: - "/data/nginx/certs:/etc/nginx/certs" - "/data/webH5:/usr/share/nginx/html/elskt" - "/data/admin:/usr/share/nginx/html/elsadmin" ports: - 443:443 depends_on: - app - boss environment: - "TZ=Asia/Shanghai"
volumes: mysqldata: redisdata:
networks: njk:
复制代码

2.4、最后 njk-app.jar 、njk-admin.jar 分别是 app 和 boss 后台相关的服务 jar 文件,web 目录下的 h5.zip 和 pc.zip 分别对应的 app_server 和 boss_server 的前端编译后的代码。

四、web 端代码部署配置

Nginx.conf 文件配置如下:

user       nginx;  ## Default: nobodyworker_processes  5;  ## Default: 1error_log  /var/log/nginx/error.log warn;pid        /var/run/nginx.pid;worker_rlimit_nofile 8192;
events { worker_connections 4096; ## Default: 1024}
http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; client_max_body_size 10M; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; server { listen 443 ssl; server_name xxxx1.com; root /usr/share/nginx/html/elsadmin; ssl_certificate /etc/nginx/certs/xxxx1.com.pem; ssl_certificate_key /etc/nginx/certs/xxxx1.com.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; # 指定密码为openssl支持的格式 ssl_protocols SSLv2 SSLv3 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; # 密码加密方式 ssl_prefer_server_ciphers on; # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码 index index.html; #定义index页面 error_page 404 /index.html; #将404错误页面重定向到index.html可以解决history模式访问不到页面问题 #charset koi8-r; #access_log /var/log/nginx/host.access.log main;
location ^~/api/ { proxy_pass http://boss:8080/; } }
server { listen 443 ssl; server_name xxxx2.com; root /usr/share/nginx/html/elskt; ssl_certificate /etc/nginx/certs/xxxx2.com.pem; ssl_certificate_key /etc/nginx/certs/xxxx2.com.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; # 指定密码为openssl支持的格式 ssl_protocols SSLv2 SSLv3 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; # 密码加密方式 ssl_prefer_server_ciphers on; # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码 index index.html; #定义index页面 error_page 404 /index.html; #将404错误页面重定向到index.html可以解决history模式访问不到页面问题 #charset koi8-r; #access_log /var/log/nginx/host.access.log main;
location ^~/api/ { proxy_pass http://app:8081/; } }}
复制代码

五、整个服务启动

$ cd /tit$ docker-compose up -d 
复制代码

最后,记得导入自己的业务表及相关数据。大家有问题可以留言,后面我会更新一下关于 java 大数据方面的知识点。 谢谢 ^,^

发布于: 2021 年 05 月 11 日阅读数: 31
用户头像

皮特王

关注

还未添加个人签名 2016.01.06 加入

还未添加个人简介

评论

发布
暂无评论
使用docker compose快速部署前后端分离项目案例