docker-compose

完成一个简单微服务集群部署

顺序启动 mysql ,redis , user服务

  1. version: "3"
  2. # 服务集群
  3. services:
  4. microUserService:
  5. image: tannnn/docker_boot_test:1.1
  6. # 给容器取个名字
  7. container_name: user
  8. privileged: true
  9. ports:
  10. - "9001:9001"
  11. # 使用网络
  12. networks:
  13. - docker_boot_test_net
  14. # 将项目产生的日志映射到宿主机 (根据自己项目来)
  15. volumes:
  16. - ./docker-compose-mysql-redis-testjar-demo/logs:/logs
  17. environment:
  18. TZ: 'Asia/Shanghai' # 设置容器时区
  19. # LANG: 'en_US.UTF-8' # 默认GBK 我这儿设置 utf8 造成了乱码
  20. # Xmx最大堆内存(物理内存的1/4(<1GB) Xms初始young内存(并行GC: 物理内存的1/64(<1GB)),可以设置与-Xmx相同。 Xmn年轻代大小
  21. JAVA_OPTS: '-Xms128m -Xmx512m -XX:+UseParallelGC -XX:+UseParallelOldGC -Dfile.encoding=UTF-8'
  22. # command: --spring.profiles.active=prod --server.port=9001 # 默认 docker 9001
  23. # 表示服务之间的依赖关系(设置启动先后顺序)
  24. depends_on:
  25. - redis
  26. - mysql
  27. # 服务 mysql
  28. mysql:
  29. # 镜像名
  30. image: mysql:8.0.26
  31. privileged: true
  32. # 给容器取个名字
  33. container_name: docker-boot-test-mysql
  34. #restart: unless-stopped # restart参数 (重启策略) docker常用命令中有说明
  35. # 配置文件有了就不用了
  36. # command: --default-authentication-plugin=mysql_native_password
  37. # 端口映射 宿主:容器
  38. ports:
  39. - "7003:3306"
  40. # 映射数据卷 宿主:容器 (只是临时测试可以不用挂载)
  41. volumes:
  42. - ./docker-compose-mysql-redis-testjar-demo/mysql8/logs:/var/log/mysql
  43. - ./docker-compose-mysql-redis-testjar-demo/mysql8/data:/var/lib/mysql
  44. - /C/Users/docker-conf/mysql/7003:/etc/mysql # 配置文件windows下必须写在c:/users下要不然失效(8.0.22-26试过如此
  45. - ./docker-compose-mysql-redis-testjar-demo/mysql8/mysql-files:/var/lib/mysql-files
  46. # 设置环境变量,相当于docker run命令中的-e
  47. environment:
  48. TZ: 'Asia/Shanghai' # 设置容器时区
  49. LANG: 'en_US.UTF-8'
  50. MYSQL_ROOT_PASSWORD: 'root' # 设置root用户密码
  51. MYSQL_ALLOW_EMPTY_PASSWORD: 'no' # 即不允许密码为空。
  52. MYSQL_DATABASE: 'docker_boot_test' # 新建数据库
  53. MYSQL_USER: 'tan' # 新增用户
  54. MYSQL_PASSWORD: 'tan' # 新增用户的密码
  55. # 使用网络
  56. networks:
  57. - docker_boot_test_net
  58. # 服务 redis
  59. redis:
  60. image: redis:6.0.8
  61. container_name: docker-boot-test-redis
  62. privileged: true
  63. #restart: unless-stopped
  64. command: redis-server /etc/redis/redis.conf
  65. # command: redis-server --requirepass 123456 --appendonly yes # 启动redis服务并添加密码为:123456,并开启redis持久化配置
  66. ports:
  67. - "6010:6379"
  68. environment:
  69. TZ: 'Asia/Shanghai'
  70. LANG: 'en_US.UTF-8'
  71. volumes:
  72. - ./docker-compose-mysql-redis-testjar-demo/redis/data:/data
  73. - ./docker-compose-mysql-redis-testjar-demo/redis/redis.conf:/etc/redis/redis.conf
  74. # 使用网络
  75. networks:
  76. - docker_boot_test_net
  77. # 定义网络
  78. networks:
  79. docker_boot_test_net:

设置java启动的一些参数

  1. command: --spring.profiles.active=prod --server.port=9001
  2. 效果如同: java -jar xx.jar --spring.profiles.active=prod --server.port=9001 >/dev/null 2>&1 &

设置JVM参数

需要在打包镜像时做处理

  1. #docker-compose.yml
  2. environment:
  3. JAVA_OPTS: '-Xms128m -Xmx512m -XX:+UseParallelGC -XX:+UseParallelOldGC -Dfile.encoding=UTF-8'
  4. // Dockerfile
  5. # java启动变量
  6. ENV JAVA_OPTS=""
  7. # 暴露端口
  8. EXPOSE 9001
  9. run bash -c 'touch /docker_boot_test.jar'
  10. 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 (映射出来的端口)
  1. # 基础配置
  2. server:
  3. port: 9001
  4. # 数据库配置
  5. spring:
  6. # docker-compose中定义的redis服务 (container_name 取的名字)
  7. redis:
  8. host: docker-boot-test-redis
  9. # password: 123456
  10. port: 6379
  11. database: 1
  12. timeout: 2000
  13. datasource:
  14. password: root
  15. username: root
  16. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
  17. # docker-compose中定义的mysql服务 (container_name 取的名字)
  18. 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
  19. hikari:
  20. connection-timeout: 30000
  21. idle-timeout: 600000
  22. max-lifetime: 120000 # 连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟(1800000).设置应该比mysql设置的超时时间短
  23. maximum-pool-size: 15 # ((core_count * 2) + effective_spindle_count)
  24. pool-name: ${spring.application.name}
  25. minimum-idle: 15 # 和最大连接数保持一致
  26. jpa:
  27. hibernate:
  28. ddl-auto: update
  29. open-in-view: false
  30. database: mysql
  31. database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
  32. # 监控
  33. management:
  34. endpoints:
  35. web:
  36. exposure:
  37. include: '*' # '*' 暴露所有 prometheus
  38. metrics:
  39. tags:
  40. application: ${spring.application.name}
  41. jdevelops:
  42. # jwt
  43. jwt:
  44. web:
  45. interceptor:
  46. exclude-path-patterns: [/**] # jwt放行接口

springboot Dockefile

简单的dockerfile

  • java:8 这个镜像又大,版本又老。
  1. # docker build -t docker_boot_test:1.1 .
  2. # docker run -d -p 6002:6002 docker_boot_test:1.1
  3. # 基础镜像使用java
  4. # FROM java:8
  5. # https://hub.docker.com/_/openjdk?tab=tags&page=1&ordering=last_updated&name=8
  6. FROM openjdk:8u312-slim-buster
  7. # 作者
  8. MAINTAINER tan
  9. # 指定临时文件目录未/tmp,在主机中新建一个tmp连接到容器的tmp
  10. VOLUME /tmp
  11. # 将jar 包添加到容器中并更名
  12. ADD ./target/docker_boot_test-0.0.1-SNAPSHOT.jar docker_boot_test.jar
  13. ADD ./src/main/resources/script/shell/start-stop.sh start-stop.sh
  14. RUN chmod +x /start-stop.sh
  15. # java启动变量
  16. ENV JAVA_OPTS=""
  17. # 暴露端口
  18. EXPOSE 9001
  19. run bash -c 'touch /docker_boot_test.jar'
  20. CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar docker_boot_test.jar
  21. #entrypoint ["java","-jar","/docker_boot_test.jar"]