使用docker-compose,springboot、mysql、redis全部容器化一键启动,mysql数据挂载到宿主机持久化。
环境
:
jdk: 1.8
maven: 3.2
centos: 7
docker: 20.10.8
docker-compose: 1.29.2
代码(码云):
docker-compose-springboot-mysql-redis
贴上关键代码,全部代码见码云。
application.yml:
server:
servlet:
context-path: /dockercomposespringbootmysqlredis
# spring http端口
port: 8899
tomcat:
uri-encoding: UTF-8
spring:
application:
name: dockercomposespringbootmysqlredis
#SpringBoot2根据我们自定义的建表语句创建数据库表;在resources目录下创建schema.sql文件
datasource:
initialization-mode: always
jpa:
database: MySQL
show-sql: true
generate-ddl: true
hibernate:
ddl-auto: none
profiles:
# 引入另外一个同路径下yml配置文件,该配置文件必须以application-开头
active: pro
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
mybatis-plus:
mapper-locations: classpath:com/hsj/mapper/xml/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-aliases-package: com.hsj.entity
springboot根路径:dockercomposespringbootmysqlredis,外网端口:8899,
SpringBoot2根据我们自定义的建表语句创建数据库表;在resources目录下创建schema.sql文件(docker-compose启动时候会自动创建表结构)
schema.sql:
/*
Navicat Premium Data Transfer
Date: 26/08/2021 12:56:08
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure
-- ----------------------------
CREATE TABLE IF NOT EXISTS `user` (
`id` bigint(64) NOT NULL COMMENT '主键',
`tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户ID',
`code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户编号',
`user_type` int(2) NULL DEFAULT NULL COMMENT '用户平台',
`account` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账号',
`password` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称',
`real_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真名',
`avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像',
`email` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`phone` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机',
`birthday` datetime(0) NULL DEFAULT NULL COMMENT '生日',
`sex` int(2) NULL DEFAULT NULL COMMENT '性别',
`role_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色id',
`dept_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门id',
`post_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位id',
`create_user` bigint(64) NULL DEFAULT NULL COMMENT '创建人',
`create_dept` bigint(64) NULL DEFAULT NULL COMMENT '创建部门',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_user` bigint(64) NULL DEFAULT NULL COMMENT '修改人',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`status` int(2) NULL DEFAULT NULL COMMENT '状态',
`is_deleted` int(2) NULL DEFAULT 0 COMMENT '是否已删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
在application.yml中,我们使用application-pro.yml进行部署,模拟生产环境:
profiles:
# 引入另外一个同路径下yml配置文件,该配置文件必须以application-开头
active: pro
application-pro.yml:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
#docker-compose方式启动MySQL,只需要指定host=mysql
#docker 内部访问3306,Navicat外部访问3336
url: jdbc:mysql://mysql:3306/docker-compose-springboot-mysql-redis?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: root
initial-size: 3
min-idle: 3
max-active: 18
max-wait: 60000
time-between-eviction-runs-millis: 60000
validation-query: SELECT 1 FROM DUAL
filters: stat,wall,log4j
# Hikari 连接池配置
# 最小空闲连接数量
hikari:
minimum-idle: 5
# 空闲连接存活最大时间,默认600000(10分钟)
idle-timeout: 180000
# 连接池最大连接数,默认是10
maximum-pool-size: 10
# 此属性控制从池返回的连接的默认自动提交行为,默认值:true
auto-commit: true
# 连接池名称
pool-name: MyHikariCP
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
max-lifetime: 1800000
# 数据库连接超时时间,默认30秒,即30000
connection-timeout: 30000
connection-test-query: SELECT 1
redis:
#docker-compose方式启动redis,只需要指定host=redis
host: redis
#docker内部6379,Redis desk manager 外部是7379
port: 6379
password: root
database: 0
jedis:
pool:
min-idle: 0
max-idle: 8
max-active: 8
max-wait: -1ms
timeout: 1000ms
方便测试,mysql、Redis账号密码全部都是:root。重点在链接mysql和Redis的host处:
mysql url:
#docker-compose方式启动MySQL,只需要指定host=mysql
#docker 内部访问3306,Navicat外部访问3336
url: jdbc:mysql://mysql:3306/docker-compose-springboot-mysql-redis?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
redis host:
#docker-compose方式启动redis,只需要指定host=redis
host: redis
发现不是ip,是名字,这是什么?原理就是docker的自定义网络,不知道的朋友请自己学习docker自定义网络。自定义的网络可以通过容器名称进行同一网络内部互相访问。
docker-compose就是基于此。
看看docker-compose.yml吧,你会豁然开亮!上面mysql
和redis
不就是docker-compose的服务名称吗?
docker-compose.yml:
version: "3.9"
services:
#指定服务名称mysql、redis
mysql:
#自己构建的镜像,参见:docker-entrypoint-initdb.d -> build.sh
# image: mysql:V5.7.30
image: mysql:5.7.30
#指定容器名称
container_name: dockercomposespringbootmysqlredis-mysql
#restart: always
#指定服务运行的端口
ports :
- "3336:3306"
#指定容器的环境变量
environment:
#数据库密码
- MYSQL_ROOT_PASSWORD=root
#创建的库
- MYSQL_DATABASE=docker-compose-springboot-mysql-redis
#允许多IP连接数据库
- MYSQL_ROOT_HOST=%
#挂载数据卷
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql
# - ./mysql/datad:/var/run/mysqld
- ./mysql/datal:/var/log/mysql
redis:
#官方的Redis镜像image
image: redis
#指定容器名称
container_name: dockercomposespringbootmysqlredis-redis
#restart: always
command: redis-server --requirepass root
ports:
- "7379:6379"
#挂载数据卷
#Redis 的密码需要自己在与容器共享的配置 redis.conf 中加入,即更改配置中 requirepass 为: requirepass yourpassword
volumes:
- ./redis/data:/data
#指定服务名称
springboot:
# 镜像名:版本
#自己构建的镜像,当前路径Dockerfile
build: .
#打包之后的镜像名字
image: dockercomposespringbootmysqlredis:v1.0.0
container_name: dockercomposespringbootmysqlredis-springboot
#restart: always
#指定服务运行的端口
ports:
- "8899:8899"
#依赖的服务
depends_on:
- mysql
- redis
springboot 依赖于mysql、redis启动之后才会启动:
#依赖的服务
depends_on:
- mysql
- redis
mysql和Redis我们直接使用官方的镜像,唯一的是springboot我们自己制作镜像,Dockerfile就是我们自己的springboot镜像:
#自己构建的镜像,当前路径Dockerfile
build: .
#打包之后的镜像名字
image: dockercomposespringbootmysqlredis:v1.0.0
最后:
start.sh脚本仅仅启动了docker-compose而已,
#!/bin/bash
docker-compose up