Spring Boot部署之基于Docker的云部署

  本文对docker应用进行实践——微服务项目部署,主要使用技术有:1. springboot技术;2. mysql数据库;3. springboot项目docker容器化部署;4. mysql数据库容器化部署。
  数据准备:

    创建数据库dockerDB,同时建表tbuser。具体表结构如下:
      CREATE TABLE `tbuser` (
        `userid` int(11) NOT NULL AUTO_INCREMENT,
        `username` varchar(20) COLLATE utf8_bin DEFAULT NULL,
        `password` varchar(20) COLLATE utf8_bin DEFAULT NULL,
        `userroles` varchar(2) COLLATE utf8_bin DEFAULT NULL,
        `nickname` varchar(50) COLLATE utf8_bin DEFAULT NULL,
        PRIMARY KEY (`userid`)
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

    添加数据测试,如下(但不限于如下):

      INSERT INTO tbuser (username,password,userroles,nickname) VALUES('admin','xxxx','04','管理员'),('zoe','xxx','02','小破孩')

          

  测试数据库链接:

    配置文件:

      pom.xml

         

      application.yml

         

    测试:
      父类:

         

      测试类:

         

       测试结果:

         

   项目编码

    在此项目中运用了mybatisplus,其为是一个 MyBatis (opens new window)的增强工具。具体使用可参考官网MyBatis-Plus (baomidou.com)

    配置文件pom.xml增加:

         

    编码:

      实体类:

         

       mapper接口:

         

      通过注解@MapperScan进行定位:

         

      UserService:

         

         

        UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper,所以不填写就是无任何条件。

       测试:

         

         

       控制器:

         

      服务端口设置为8082:

         

    本地测试:http://localhost:8082/users

         

   Docker部署:

    部署前准备:

      1、脱离开发环境部署、测试项目

        参考Spring Boot部署之jar包运行 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)

        

        

      2部署mysql容器

        

         导入sql数据

        

        

       3、修改数据源为容器mysql进行测试:java -jar *.jar --spring.datasource.url=jdbc:mysql://xxx:3306/dockerDB?characterEncoding=utf-8&useSSL=false&useTimezone=true&serverTimeZone=GMT%2B8

         

         

    说明应用服务使用mysql容器作为数据持久化完全没有问题,下面通过Docker优化mysql镜像的方式进行部署:

  制作mysql自定义镜像并启动容器:

    1、编写Dockerfile文件

        FROM mysql:8.0

        #Author

        MAINTAINER mysql from date UTC by Asia/Hubei "Shirley@163.com"

        ENV TZ Asia/Shanghai

        COPY inituser.sql /docker-entrypoint-initdb.d

        

    2、构建镜像

        docker build --rm -t mysql:lifish01 .

        

    3、上传之私服

        

         

     启动mysql容器,可以看到sql中相关操作在启动时全部完成,如下:

      docker run -itd --name docker_mysql -v /home/docker/data/mysql:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=XXXX 192.168.X.1XX:5000/mysql:lifish01

        

         

   打包项目部署:

    1、清理docker主机的容器:

      

    2、编写Dockerfile制作Springboot项目镜像

        

       docker build --rm -t 192.168.X.1XX:5000/deploy4docker:lifish01 --build-arg JAR_FILE=docker4deploy-0.0.1-SNAPSHOT.jar .

        

    3、安装docker-compose:可以参考Docker工具之docker-compose安装及配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com),编写docker-compose.yml文件,运行项目

        

    4、编写docker-compose.yml,如下:

        

     5、启动docker-compose up -d,并测试curl localhost:8082/users

        

         

       可以看到测试结果返回500,看看日志吧,如下:

        

       从日志看是数据库链接失败,也就是说app.jar并没有成功链接到容器dockerdemo-db-1 。下面查看原因并解决吧,如下:

      通过docker logs dockerdemo-dockerdemo-1查看,一步步解决问题:

      1)无法链接到无数据,这是因为app.jar中默认的配置不再适用于当前MySQL容器,需要通过环境变量设置新的链接url:

        SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/dockerDB?useSSL=false&characterEncoding=utf-8&useTimezone=true&server TimeZone=GMT%2B8

      2)com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed,链接url中添加加密相关的设置allowPublicKeyRetrieval=true,如下:

        

      注意这个变量就是之前测试执行java -jar *.jar 后面跟的变量,与编码中application.yml中url一致。

    以上环境变量设置完成后重新启动,并测试:

      

 

  

posted on 2022-05-20 19:53  池塘里洗澡的鸭子  阅读(794)  评论(0编辑  收藏  举报