docker-compose
完成一个简单微服务集群部署
顺序启动 mysql ,redis , user服务
version: "3"
# 服务集群
services:
microUserService:
image: tannnn/docker_boot_test:1.1
# 给容器取个名字
container_name: user
privileged: true
ports:
- "9001:9001"
# 使用网络
networks:
- docker_boot_test_net
# 将项目产生的日志映射到宿主机 (根据自己项目来)
volumes:
- ./docker-compose-mysql-redis-testjar-demo/logs:/logs
environment:
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
# 服务 mysql
mysql:
# 镜像名
image: mysql:8.0.26
privileged: 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命令中的-e
environment:
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
# 服务 redis
redis:
image: redis:6.0.8
container_name: docker-boot-test-redis
privileged: true
#restart: unless-stopped
command: 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.yml
environment:
JAVA_OPTS: '-Xms128m -Xmx512m -XX:+UseParallelGC -XX:+UseParallelOldGC -Dfile.encoding=UTF-8'
// Dockerfile
# java启动变量
ENV JAVA_OPTS=""
# 暴露端口
EXPOSE 9001
run 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: 123456
port: 6379
database: 1
timeout: 2000
datasource:
password: root
username: root
driver-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=true
hikari:
connection-timeout: 30000
idle-timeout: 600000
max-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: update
open-in-view: false
database: mysql
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
# 监控
management:
endpoints:
web:
exposure:
include: '*' # '*' 暴露所有 prometheus
metrics:
tags:
application: ${spring.application.name}
jdevelops:
# jwt
jwt:
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=8
FROM openjdk:8u312-slim-buster
# 作者
MAINTAINER tan
# 指定临时文件目录未/tmp,在主机中新建一个tmp连接到容器的tmp
VOLUME /tmp
# 将jar 包添加到容器中并更名
ADD ./target/docker_boot_test-0.0.1-SNAPSHOT.jar docker_boot_test.jar
ADD ./src/main/resources/script/shell/start-stop.sh start-stop.sh
RUN chmod +x /start-stop.sh
# java启动变量
ENV JAVA_OPTS=""
# 暴露端口
EXPOSE 9001
run 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"]