当前位置:   article > 正文

Docker Compose 中spring boot服务连接 mysql

Docker Compose 中spring boot服务连接 mysql

  Docker compose 启动两个docker ,一个是mysql, 另一个是spring boot 服务。spring boot 服务要连接mysql8 。传统的做法: 在application.properties 文件中配置 

  1. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydatabase
  2. spring.datasource.username=root
  3. spring.datasource.password=123456
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

   但 在docker compose 环境下,mysql 的docker 是动态的一个ip地址,spring boot 是无法使用固定的ip 连接。

正确的做法:

一、制做mysql 的Dockerfile 

  1. FROM docker.io/mysql
  2. MAINTAINER gym "393909065@qq.com"
  3. EXPOSE 3306
  4. ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
  5. # 数据库创建脚本
  6. ENV INIT_SQL admin.sql
  7. COPY admin.sql ./$INIT_SQL $AUTO_RUN_DIR/
  8. RUN chmod 777 $AUTO_RUN_DIR/$INIT_SQL

备: 脚本文件中不包括 create database , 创建数据库命令在docker compose 定义。

二、制做spring boot 服务 Dockerfile

  1. FROM openjdk:18
  2. ADD *.jar app.jar
  3. ENTRYPOINT ["java", "-Xms1024m", "-Xmx1024m", "-Dspring.profiles.active=dev", "-jar", "/app.jar"]
  4. EXPOSE 8081

三、制做 docker compose 文件

  1. version: '3.7'
  2. services:
  3. ws1:
  4. container_name: ws1
  5. build:
  6. context: ./ws1
  7. dockerfile: Dockerfile
  8. ports:
  9. - 9008:8081
  10. environment:
  11. - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/${MYSQL_DATABASE}
  12. - SPRING_DATASOURCE_USERNAME=root
  13. - SPRING_DATASOURCE_PASSWORD=${MYSQL_PASSWORD}
  14. volumes:
  15. - ./ws1/logs:/logs
  16. depends_on:
  17. mysqldb:
  18. condition: service_healthy
  19. networks:
  20. - springboot-mysql-network
  21. mysqldb:
  22. container_name: mysqldb
  23. build:
  24. context: ./mysql
  25. dockerfile: prod.Dockerfile
  26. restart: always
  27. command: [
  28. '--character-set-server=utf8mb4',
  29. '--collation-server=utf8mb4_unicode_ci',
  30. '--default-authentication-plugin=caching_sha2_password'
  31. ]
  32. environment:
  33. - MYSQL_DATABASE=${MYSQL_DATABASE}
  34. - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
  35. volumes:
  36. - ./mysql/data:/var/lib/mysql
  37. networks:
  38. - springboot-mysql-network
  39. healthcheck:
  40. test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
  41. retries: 10
  42. interval: 3s
  43. timeout: 30s
  44. networks:
  45. springboot-mysql-network:
  46. name: springboot-mysql-network

四、.env 文件

  1. MYSQL_DATABASE=mysql_db
  2. MYSQL_PASSWORD=123456

为什么要用.env , 在docker compose 文件中直接填入不行吗?答案是不行的。 因为spring boot 是注入机制。docker 启动后,会根据depends_on  的docker 获取该docker 的ip。通过.env 的方式替换时, 重新注入环境变量中的mysql host。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/304806
推荐阅读
相关标签
  

闽ICP备14008679号