赞
踩
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: ws1
- build:
- context: ./ws1
- dockerfile: Dockerfile
- ports:
- - 9008:8081
- environment:
- - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/${MYSQL_DATABASE}
- - SPRING_DATASOURCE_USERNAME=root
- - SPRING_DATASOURCE_PASSWORD=${MYSQL_PASSWORD}
- volumes:
- - ./ws1/logs:/logs
- depends_on:
- mysqldb:
- condition: service_healthy
- networks:
- - springboot-mysql-network
-
- mysqldb:
- container_name: mysqldb
- build:
- context: ./mysql
- dockerfile: prod.Dockerfile
- restart: always
- command: [
- '--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/mysql
- networks:
- - springboot-mysql-network
- healthcheck:
- test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
- retries: 10
- interval: 3s
- timeout: 30s
-
- networks:
- 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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。