一、为什么写这篇文章
在我的上一篇文章(如何使用 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-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 大数据方面的知识点。 谢谢 ^,^
评论