1. springboot技术;2. mysql数据库;3. springboot项目docker容器化部署;4. mysql数据库容器化部署。
数据准备:
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:
Docker部署:
部署前准备:
脱离开发环境部署、测试项目
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
打包项目部署:
清理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 .
安装docker-compose:编写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一致。
以上环境变量设置完成后重新启动,并测试: