自动初始化表结构和数据
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: ${DATASOURCE_DRIVER_CLASS_NAME:com.mysql.cj.jdbc.Driver}url: ${DATASOURCE_URL:jdbc:mysql://localhost:3306/service-factory-backend?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true}username: ${DATASOURCE_USERNAME:root}password: ${DATASOURCE_PASSWORD:root}schema: classpath:db/schema-mysql.sql # 每次启动程序,都会运行以对数据库操作data: classpath:db/data-mysql.sql # 每次启动程序,都会运行以对数据库的数据操作schema-username: ${DATASOURCE_USERNAME:root}schema-password: ${DATASOURCE_USERNAME:root}data-username: ${DATASOURCE_USERNAME:root}data-password: ${DATASOURCE_USERNAME:root}platform: mysqlcontinue-on-error: trueinitialization-mode: always
使用环境变量控制环境参数
# 数据源配置spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: ${DATASOURCE_DRIVER_CLASS_NAME:com.mysql.cj.jdbc.Driver}druid:# 主库数据源master:url: ${DATASOURCE_URL:jdbc:mysql://localhost:3306/light-ama?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true}username: ${DATASOURCE_USERNAME:root}password: ${DATASOURCE_PASSWORD:root}# redis 配置redis:# 地址host: ${REDIS_HOST:localhost}# 端口,默认为6379port: ${REDIS_PORT:6379}# 密码password:${REDIS_PASSWORD}
编写Dockerfile
# 基础镜像使用javaFROM frolvlad/alpine-oraclejdk8:slim# openjdk:8-jdk-alpine 代码去除了一些加密和图形的部分的非开源的组件。导致验证码显示会有问题。# 作者MAINTAINER zhukaiyuan <zhukaiyuan@hniii.com># VOLUME 指定了临时文件目录为/tmp。# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmpVOLUME /tmpARG JAR_FILE=target/*.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["sh","-c","java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。该步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
项目的 jar 文件作为 “app.jar” 添加到容器的
ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/./urandom” 作为 Entropy Source
如果是第一次打包,它会自动下载java 8的镜像作为基础镜像,以后再制作镜像的时候就不会再下载了。
添加构建Docker镜像的Maven插件
<build><plugins>...<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version><configuration><imageName>example</imageName><dockerDirectory>docker</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>...</plugins></build>
使用Maven命令构建并Push镜像
mvn clean install
使用Docker命令启动Docker容器
docker run -p "8080:8080" xcrj/backend:1.0.0
使用DockerCompose部署应用
version: '3'services:mysqlDb:container_name: mysqlDb # 指定容器的名称image: mysql:5.7.21ports:- "3307:3306"command: ['--character-set-server=utf8mb4','--collation-server=utf8mb4_unicode_ci','--lower-case-table-names=1']environment:MYSQL_ROOT_PASSWORD: "root"MYSQL_ROOT_HOST: "%"MYSQL_DATABASE: backendredisDb:image: redis:5.0.0container_name: redisDbrestart: alwaysdockeports:- "16379:6379"volumes:- ./data:/datacommand: redis-server --requirepass 123456serviceFactory:container_name: serviceFactory #配置容器名build:context: .dockerfile: Dockerfile #指定dockerFile文件image: xcrj/backend:1.0.0ports:- "8080:8080"environment:DATASOURCE_DRIVER_CLASS_NAME: com.mysql.cj.jdbc.DriverDATASOURCE_URL: jdbc:mysql://mysqlDb:3306/backend?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=trueDATASOURCE_USERNAME: rootDATASOURCE_PASSWORD: rootREDIS_HOST: redisDbREDIS_PORT: 6379JAVA_OPTS: -Dspring.redis.password=123456depends_on:- mysqlDb- redisDb
