Docker compose 启动两个docker ,一个是mysql, 另一个是spring boot 服务。spring boot 服务要连接mysql8 。传统的做法: 在application.properties 文件中配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
但 在docker compose 环境下,mysql 的docker 是动态的一个ip地址,spring boot 是无法使用固定的ip 连接。
正确的做法:
一、制做mysql 的Dockerfile
FROM docker.io/mysql MAINTAINER gym "393909065@qq.com" EXPOSE 3306
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
# 数据库创建脚本
ENV INIT_SQL admin.sql
COPY admin.sql ./$INIT_SQL $AUTO_RUN_DIR/
RUN chmod 777 $AUTO_RUN_DIR/$INIT_SQL
备: 脚本文件中不包括 create database , 创建数据库命令在docker compose 定义。
二、制做spring boot 服务 Dockerfile
FROM openjdk:18
ADD *.jar app.jar
ENTRYPOINT ["java", "-Xms1024m", "-Xmx1024m", "-Dspring.profiles.active=dev", "-jar", "/app.jar"]
EXPOSE 8081
三、制做 docker compose 文件
version: '3.7'
services:ws1:container_name: ws1build:context: ./ws1dockerfile: Dockerfileports:- 9008:8081environment:- SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/${MYSQL_DATABASE}- SPRING_DATASOURCE_USERNAME=root- SPRING_DATASOURCE_PASSWORD=${MYSQL_PASSWORD}volumes:- ./ws1/logs:/logsdepends_on:mysqldb:condition: service_healthynetworks:- springboot-mysql-networkmysqldb:container_name: mysqldbbuild:context: ./mysqldockerfile: prod.Dockerfilerestart: alwayscommand: ['--character-set-server=utf8mb4','--collation-server=utf8mb4_unicode_ci','--default-authentication-plugin=caching_sha2_password' ]environment:- MYSQL_DATABASE=${MYSQL_DATABASE}- MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}volumes:- ./mysql/data:/var/lib/mysqlnetworks:- springboot-mysql-networkhealthcheck:test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]retries: 10interval: 3stimeout: 30snetworks:springboot-mysql-network:name: springboot-mysql-network
四、.env 文件
MYSQL_DATABASE=mysql_db MYSQL_PASSWORD=123456
为什么要用.env , 在docker compose 文件中直接填入不行吗?答案是不行的。 因为spring boot 是注入机制。docker 启动后,会根据depends_on 的docker 获取该docker 的ip。通过.env 的方式替换时, 重新注入环境变量中的mysql host。