文章目录
jeecgboot — docker 搭建 jeecgboot 项目 开发与部署环境
一、部署方式
- 部署工具:
docker - 后端部署方案:
docker:docker-compose - 前端部署:
docker:Dockerfile
二、项目依赖工具
- 后端:
- Java
- MySQL
- Redis
- 前端:
- nginx
三、端口及连接密码
-
后端
- 端口:8080
-
前端
-
MySQL数据库
-
数据库名:jeecg-boot
-
数据库账号密码:root / 123456
-
数据库ip,端口:127.0.0.1 / 3306
-
-
redis
端口:6379
三、docker 搭建项目开发环境
- 参考资料:
- https://www.kancloud.cn/zhangdaiscott/jeecg-boot/2043880
- https://juejin.cn/post/6844904142620622862
1. docker 安装 MySQL
- MySQL常见问题:https://blog.51cto.com/suifu/1942302
1.1 dockers 安装 MySQL 5.7
- 参考资料:https://my.oschina.net/jeecg/blog/4283700
-
docker 安装 mysql5.7:
查看docker仓库中的 mysql 版本:
docker search mysql
为选定需要pull到系统中的数据库镜像
docker pull mysql:5.7
-
查看并启动 Docker 镜像
列出已下载的镜像# docker images 命令列出已下载镜像 docker images
执行命令后,可看到类似于如下的表格:
-
启动Mysql容器
# 启动容器 docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 # 启动容器,并设置mysql忽略大小写 docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 --lower_case_table_names=1
启动成功(截图中端口为3316,是因为本地已装mysql,端口冲突大家忽略即可)
-
登录Mysql数据库
# 进入 mysql 终端 docker exec -it CONTAINER_ID bash #输入命令,并按提示输入密码root mysql -u root -p
登录成功效果
1.2 mysql 远程访问
- 参考资料:https://www.cnblogs.com/whoyoung/p/10988136.html
-
查看当前运行容器:
docker ps -a
-
启动docker容器:
docker start 容器ID
-
进入MySQL容器:
docker exec -it CONTAINER_ID bash
-
进入MySQL:
mysql -u root -p
-
设置远程访问:
#授权 GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root"; flush privileges;
-
注意防火墙和安全组
防火墙和安全组开启3306端口
2. docker 安装 jdk
- 参考:https://blog.csdn.net/zhujuntiankong/article/details/85157420
3. docker 安装 redis
- 参考:https://www.runoob.com/docker/docker-install-redis.html
四、docker 搭建项目部署环境
-
部署方式:
- 后端:
docker:docker-compose - 前端:
docker:Dockerfile
- 后端:
-
项目整体分为三个镜像:
- MySQL
- 后端:jeecg-boot-module-system-2.4.0.jar
- nginx:前端
1. 制作后端镜像
-
修改hosts(本地电脑配置),增加以下内容:
# jeecgboot127.0.0.1 jeecg-boot-redis127.0.0.1 jeecg-boot-mysql127.0.0.1 jeecg-boot-system
-
添加 application-docker.yml:
复制application-dev.yml,修改数据库连接和redis连接,将连接改成host名
-
修改项目配置文件 application.yml
active: docker
-
通过jeecg-boot-parent项目 maven打包
mvn clean package
-
构建镜像__容器组(当你改变本地代码,也可重新构建镜像)
docker-compose build
-
启动镜像__容器组(也可取代运行中的镜像)
docker-compose up -d
-
访问后台项目(注意要开启swagger)
http://localhost:8080/jeecg-boot/doc.html
2. 制作前端镜像
前端ant-design-vue-jeecg 镜像制作
代码路径:https://github.com/zhangdaiscott/jeecg-boot/tree/master/ant-design-vue-jeecg
-
修改前端项目的后台域名
.env.productionNODE_ENV=production VUE_APP_API_BASE_URL=https://bootapi.jeecg.com VUE_APP_CAS_BASE_URL=http://localhost:8888/cas VUE_APP_ONLINE_BASE_URL=http://fileview.jeecg.com/onlinePreview
-
先进入打包前端项目
yarn run build
-
构建镜像
docker build -t nginx:jeecgboot .
-
启动镜像
docker run --name jeecg-boot-nginx -p 80:80 -d nginx:jeecgboot
-
访问前台项目
http://localhost:80
3. 部署
-
后端
-
docker-compose.yml:
version: '2' services: jeecg-boot-mysql: build: context: ./db environment: MYSQL_ROOT_PASSWORD: root restart: always container_name: jeecg-boot-mysql image: jeecg-boot-mysql command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 --max_allowed_packet=128M --bind-address=0.0.0.0 ports: - 3306:3306 jeecg-boot-redis: image: redis:5.0 ports: - 6379:6379 restart: always container_name: jeecg-boot-redis jeecg-boot-system: build: context: ./jeecg-boot-module-system restart: always container_name: jeecg-boot-system image: jeecg-boot-system ports: - 8080:8080 volumes: - /home/pentiumcm/proj/trmis/upFiles:/home/pentiumcm/proj/trmis/upFiles
-
-
前端
-
Dockerfile:
FROM nginx MAINTAINER jeecgos@163.com VOLUME /tmp ENV LANG en_US.UTF-8 RUN echo "server { \ listen 80; \ location ^~ /jeecg-boot { \ proxy_pass http://127.0.0.1:8080/jeecg-boot/; \ proxy_set_header Host 127.0.0.1; \ proxy_set_header X-Real-IP \$remote_addr; \ proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; \ } \ #解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \ location / { \ root /var/www/html/; \ index index.html index.htm; \ if (!-e \$request_filename) { \ rewrite ^(.*)\$ /index.html?s=\$1 last; \ break; \ } \ } \ access_log /var/log/nginx/access.log ; \ } " > /etc/nginx/conf.d/default.conf \ && mkdir -p /var/www \ && mkdir -p /var/www/html ADD dist/ /var/www/html/ EXPOSE 80 EXPOSE 443
-
四、文件上传 + docker 挂载指定目录
-
参考:
https://blog.csdn.net/weixin_36586564/article/details/103805080 -
配置如下:
volumes: - ./app:/mnt/app
这样本地的当前宿主机目录下的 app 这个目录里的东西,跟容器里的 /mnt/app 这个目录就是同步的了。
-
例子:
volumes: - /home/pentiumcm/proj/trmis/upFiles:/home/pentiumcm/proj/trmis/upFiles
-
-
应用场景:
比如在项目中涉及到文件上传时,如果没有进行 挂载容器里面的目录到宿主机,那么用户上传的文件就是在docker容器里面的某一位置,当该容器删除时,对应的这些文件也会被删除,不方便进行管理。
五、版本更迭
1. 服务器重启后:启动容器
- 服务器重启后,docker容器会停止运行,此时不用重新构建,
docker ps -a
查看所有容器,docker start 容器Id
即可。
2.更换jar包
- 步骤如下:
-
docker-compose down
停止容器 -
将新的jar包上传到同一目录,名称不变
-
docker images
查看docker镜像 -
docker rmi 镜像Id
删除旧镜像 :
如,更换jar 文件,就删除对应的服务器的镜像:jeecg-boot-system -
docker-compose up -d
重新构建运行即可
-
3. MySQL 容器改密
- docker-compose 修改密码失效:
# 进入 mysql 终端 docker exec -it CONTAINER_ID bash # 修改密码 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; flush privileges;
六、部署问题
-
libc.so.6: version `GLIBC_2.28’ not found:
https://www.cnblogs.com/g2thend/archive/2004/01/13/13210026.html
-
These critical programs are missing or too old: make bison compiler:
https://www.cnblogs.com/relax-zw/p/11328453.html
https://www.cnblogs.com/relax-zw/p/11328453.html
-
iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destinatio:
重启 docker
-
数据库
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure:
解决方案:docker-compose.yml文件中添加:
–bind-address=0.0.0.0
-
后端:
ERROR com.alibaba.druid.pool.DruidDataSource:927 - init datasource error, url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
参考资料
- https://juejin.cn/post/6844904142620622862