jeecgboot — docker 搭建 jeecgboot 项目 开发与部署环境

文章目录

  • jeecgboot — docker 搭建 jeecgboot 项目 开发与部署环境
    • 一、部署方式
    • 二、项目依赖工具
    • 三、端口及连接密码
    • 三、docker 搭建项目开发环境
      • 1. docker 安装 MySQL
        • 1.1 dockers 安装 MySQL 5.7
        • 1.2 mysql 远程访问
      • 2. docker 安装 jdk
      • 3. docker 安装 redis
    • 四、docker 搭建项目部署环境
      • 1. 制作后端镜像
      • 2. 制作前端镜像
      • 3. 部署
    • 四、文件上传 + docker 挂载指定目录
    • 五、版本更迭
        • 1. 服务器重启后:启动容器
        • 2.更换jar包
        • 3. MySQL 容器改密
    • 六、部署问题
    • 参考资料

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
  1. docker 安装 mysql5.7:

    查看docker仓库中的 mysql 版本:

    docker search mysql
    

    为选定需要pull到系统中的数据库镜像

    docker pull mysql:5.7
    
  2. 查看并启动 Docker 镜像
    列出已下载的镜像

    # docker images 命令列出已下载镜像 
    docker images
    

    执行命令后,可看到类似于如下的表格: img

  3. 启动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,端口冲突大家忽略即可) img

  4. 登录Mysql数据库

    # 进入 mysql 终端
    docker exec -it CONTAINER_ID bash
    
    #输入命令,并按提示输入密码root
    mysql -u root -p
    

    登录成功效果
    jeecgboot — docker 搭建 jeecgboot 项目 开发与部署环境_第1张图片

1.2 mysql 远程访问

  • 参考资料:https://www.cnblogs.com/whoyoung/p/10988136.html
  1. 查看当前运行容器:

    docker ps -a
    
  2. 启动docker容器:

    docker start 容器ID
    
  3. 进入MySQL容器:

    docker exec -it CONTAINER_ID bash
    
  4. 进入MySQL:

    mysql -u root -p
    
  5. 设置远程访问:

    #授权
    GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root";
    flush privileges;
    
  6. 注意防火墙和安全组

    防火墙和安全组开启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. 制作后端镜像

  • 参考资料:http://doc.jeecg.com/2043889
  1. 修改hosts(本地电脑配置),增加以下内容:

    # jeecgboot127.0.0.1   jeecg-boot-redis127.0.0.1   jeecg-boot-mysql127.0.0.1   jeecg-boot-system
    

    jeecgboot — docker 搭建 jeecgboot 项目 开发与部署环境_第2张图片

  2. 添加 application-docker.yml:

    复制application-dev.yml,修改数据库连接和redis连接,将连接改成host名

  3. 修改项目配置文件 application.yml

    active: docker
    
  4. 通过jeecg-boot-parent项目 maven打包

    mvn clean package
    
  5. 构建镜像__容器组(当你改变本地代码,也可重新构建镜像)

    docker-compose build
    
  6. 启动镜像__容器组(也可取代运行中的镜像)

    docker-compose up -d
    
  7. 访问后台项目(注意要开启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

  1. 修改前端项目的后台域名
    .env.production

    NODE_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
    
  2. 先进入打包前端项目

    yarn run build
    
  3. 构建镜像

    docker build -t nginx:jeecgboot .
    
  4. 启动镜像

    docker run --name jeecg-boot-nginx -p 80:80 -d nginx:jeecgboot
    
  5. 访问前台项目

    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 [email protected]
      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;
    

六、部署问题

  1. libc.so.6: version `GLIBC_2.28’ not found:

    https://www.cnblogs.com/g2thend/archive/2004/01/13/13210026.html

  2. 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

  3. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destinatio:

    重启 docker

  4. 数据库

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure:

    解决方案:docker-compose.yml文件中添加:

    –bind-address=0.0.0.0

  5. 后端:

    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

你可能感兴趣的:(开发,docker,java,mysql,数据库)