Bootstrap

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

一、为什么写这篇文章

在我的上一篇文章()中介绍了使用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-jre
WORKDIR /usr/local/tit-app
ADD njk-app.jar app.jar
EXPOSE 8081
VOLUME /home/njk/logs
ENTRYPOINT ["java", "-jar"]
CMD ["app.jar"]

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

FROM openjdk:8-jre
WORKDIR /usr/local/tit-boss
ADD njk-admin.jar boss.jar
EXPOSE 8080
VOLUME /home/njk/logs
ENTRYPOINT ["java", "-jar"]
CMD ["boss.jar"]

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

FROM nginx:1.19
COPY 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: nobody
worker_processes  5;  ## Default: 1
error_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 大数据方面的知识点。 谢谢 ^,^