docker-compose
完成一个简单微服务集群部署
顺序启动 mysql ,redis , user服务
version: "3"# 服务集群services:microUserService:image: tannnn/docker_boot_test:1.1# 给容器取个名字container_name: userprivileged: trueports:- "9001:9001"# 使用网络networks:- docker_boot_test_net# 将项目产生的日志映射到宿主机 (根据自己项目来)volumes:- ./docker-compose-mysql-redis-testjar-demo/logs:/logsenvironment:TZ: 'Asia/Shanghai' # 设置容器时区# LANG: 'en_US.UTF-8' # 默认GBK 我这儿设置 utf8 造成了乱码# Xmx最大堆内存(物理内存的1/4(<1GB) Xms初始young内存(并行GC: 物理内存的1/64(<1GB)),可以设置与-Xmx相同。 Xmn年轻代大小JAVA_OPTS: '-Xms128m -Xmx512m -XX:+UseParallelGC -XX:+UseParallelOldGC -Dfile.encoding=UTF-8'# command: --spring.profiles.active=prod --server.port=9001 # 默认 docker 9001# 表示服务之间的依赖关系(设置启动先后顺序)depends_on:- redis- mysql# 服务 mysqlmysql:# 镜像名image: mysql:8.0.26privileged: true# 给容器取个名字container_name: docker-boot-test-mysql#restart: unless-stopped # restart参数 (重启策略) docker常用命令中有说明# 配置文件有了就不用了# command: --default-authentication-plugin=mysql_native_password# 端口映射 宿主:容器ports:- "7003:3306"# 映射数据卷 宿主:容器 (只是临时测试可以不用挂载)volumes:- ./docker-compose-mysql-redis-testjar-demo/mysql8/logs:/var/log/mysql- ./docker-compose-mysql-redis-testjar-demo/mysql8/data:/var/lib/mysql- /C/Users/docker-conf/mysql/7003:/etc/mysql # 配置文件windows下必须写在c:/users下要不然失效(8.0.22-26试过如此- ./docker-compose-mysql-redis-testjar-demo/mysql8/mysql-files:/var/lib/mysql-files# 设置环境变量,相当于docker run命令中的-eenvironment:TZ: 'Asia/Shanghai' # 设置容器时区LANG: 'en_US.UTF-8'MYSQL_ROOT_PASSWORD: 'root' # 设置root用户密码MYSQL_ALLOW_EMPTY_PASSWORD: 'no' # 即不允许密码为空。MYSQL_DATABASE: 'docker_boot_test' # 新建数据库MYSQL_USER: 'tan' # 新增用户MYSQL_PASSWORD: 'tan' # 新增用户的密码# 使用网络networks:- docker_boot_test_net# 服务 redisredis:image: redis:6.0.8container_name: docker-boot-test-redisprivileged: true#restart: unless-stoppedcommand: redis-server /etc/redis/redis.conf# command: redis-server --requirepass 123456 --appendonly yes # 启动redis服务并添加密码为:123456,并开启redis持久化配置ports:- "6010:6379"environment:TZ: 'Asia/Shanghai'LANG: 'en_US.UTF-8'volumes:- ./docker-compose-mysql-redis-testjar-demo/redis/data:/data- ./docker-compose-mysql-redis-testjar-demo/redis/redis.conf:/etc/redis/redis.conf# 使用网络networks:- docker_boot_test_net# 定义网络networks:docker_boot_test_net:
设置java启动的一些参数
command: --spring.profiles.active=prod --server.port=9001效果如同: java -jar xx.jar --spring.profiles.active=prod --server.port=9001 >/dev/null 2>&1 &
设置JVM参数
需要在打包镜像时做处理
#docker-compose.ymlenvironment:JAVA_OPTS: '-Xms128m -Xmx512m -XX:+UseParallelGC -XX:+UseParallelOldGC -Dfile.encoding=UTF-8'// Dockerfile# java启动变量ENV JAVA_OPTS=""# 暴露端口EXPOSE 9001run bash -c 'touch /docker_boot_test.jar'CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar docker_boot_test.jar
spring boot 通过docker容器名连接 mysql,redis
首先保证在同一个网络下
networks:
docker_boot_test_net:
networks:
- docker_boot_test_net
spring配置文件
最好使用docker容器名连接 mysql,redis 一定要用容器内本身的端口,不要使用映射出来的端口
- 使用容器名连接可以保证。IP变动之后不会对程序产生影响 (redis为例 )
- host: docker-boot-test-redis (容器名)
- port: 6379 (容器内容的端口)
- 直接用宿主机IP
- host: 192.168.0.65( 宿主机IP)
- port: 6010 (映射出来的端口)
# 基础配置server:port: 9001# 数据库配置spring:# docker-compose中定义的redis服务 (container_name 取的名字)redis:host: docker-boot-test-redis# password: 123456port: 6379database: 1timeout: 2000datasource:password: rootusername: rootdriver-class-name: com.p6spy.engine.spy.P6SpyDriver# docker-compose中定义的mysql服务 (container_name 取的名字)url: jdbc:p6spy:mysql://docker-boot-test-mysql:3306/docker_boot_test?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Chongqing&allowPublicKeyRetrieval=truehikari:connection-timeout: 30000idle-timeout: 600000max-lifetime: 120000 # 连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟(1800000).设置应该比mysql设置的超时时间短maximum-pool-size: 15 # ((core_count * 2) + effective_spindle_count)pool-name: ${spring.application.name}minimum-idle: 15 # 和最大连接数保持一致jpa:hibernate:ddl-auto: updateopen-in-view: falsedatabase: mysqldatabase-platform: org.hibernate.dialect.MySQL5InnoDBDialect# 监控management:endpoints:web:exposure:include: '*' # '*' 暴露所有 prometheusmetrics:tags:application: ${spring.application.name}jdevelops:# jwtjwt:web:interceptor:exclude-path-patterns: [/**] # jwt放行接口
springboot Dockefile
简单的dockerfile
- java:8 这个镜像又大,版本又老。
# docker build -t docker_boot_test:1.1 .# docker run -d -p 6002:6002 docker_boot_test:1.1# 基础镜像使用java# FROM java:8# https://hub.docker.com/_/openjdk?tab=tags&page=1&ordering=last_updated&name=8FROM openjdk:8u312-slim-buster# 作者MAINTAINER tan# 指定临时文件目录未/tmp,在主机中新建一个tmp连接到容器的tmpVOLUME /tmp# 将jar 包添加到容器中并更名ADD ./target/docker_boot_test-0.0.1-SNAPSHOT.jar docker_boot_test.jarADD ./src/main/resources/script/shell/start-stop.sh start-stop.shRUN chmod +x /start-stop.sh# java启动变量ENV JAVA_OPTS=""# 暴露端口EXPOSE 9001run bash -c 'touch /docker_boot_test.jar'CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar docker_boot_test.jar#entrypoint ["java","-jar","/docker_boot_test.jar"]
