基于Docker Compose部署SpringBoot应用与MySQL 8的配置咨询
我来帮你完善这套Docker配置,并解答一些你可能遇到的常见技术问题~
完整Docker配置示例
1. mysql.dockerfile
# 基于官方MySQL 8镜像构建 FROM mysql:8 # 把本地DockerImages/mysql目录下的初始化脚本复制到容器的初始化目录 # 容器首次启动时会自动执行该目录下的.sql/.sh文件,用来初始化数据库 COPY DockerImages/mysql/ /docker-entrypoint-initdb.d/ # 可选配置:设置默认的root密码、初始数据库和字符集(避免中文乱码) ENV MYSQL_ROOT_PASSWORD=your_root_password ENV MYSQL_DATABASE=users_db ENV MYSQL_CHARSET=utf8mb4 ENV MYSQL_COLLATION=utf8mb4_unicode_ci
2. springapp.dockerfile
# 基于Maven 3.5 + JDK 8镜像(如果已经提前打好jar包,换成openjdk:8-jre镜像会更轻量化) FROM maven:3.5-jdk-8 # 把本地打好的users-mysql.jar复制到容器内的/app目录 COPY target/users-mysql.jar /app/users-mysql.jar # 提前创建配置挂载目录并设置权限,避免容器启动时因权限不足报错 RUN mkdir -p /var/lib/spring-cloud/config-repo && chmod 755 /var/lib/spring-cloud/config-repo # 定义容器启动命令,运行Spring应用 CMD ["java", "-jar", "/app/users-mysql.jar"] # 声明该目录需要挂载外部存储(Docker会提示你挂载,或者在docker-compose里配置) VOLUME ["/var/lib/spring-cloud/config-repo"]
3. docker-compose.yml(版本3)
version: '3' services: # 定义MySQL数据库服务 mysql-db: build: context: . dockerfile: mysql.dockerfile ports: - "3306:3306" # 映射宿主机3306端口到容器3306端口 volumes: # 用命名卷持久化MySQL数据,防止容器删除后数据丢失 - mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: users_db restart: always # 容器意外停止后自动重启 # 定义Spring应用服务 springapp: build: context: . dockerfile: springapp.dockerfile ports: - "8888:8888" # 暴露应用的8888端口 volumes: # 把本地的config-repo目录挂载到容器内的配置目录 - ./config-repo:/var/lib/spring-cloud/config-repo depends_on: - mysql-db # 确保MySQL服务先启动再启动Spring应用 environment: # 配置Spring应用连接MySQL的参数,注意用服务名mysql-db而不是localhost SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/users_db?useSSL=false&serverTimezone=UTC SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: your_root_password restart: on-failure # 应用启动失败时自动重启 # 定义命名卷,专门用于MySQL数据持久化 volumes: mysql-data:
常见技术问题解答
Q1: MySQL的初始化脚本为啥没执行?
- 只有当MySQL的数据目录(
/var/lib/mysql)是空的时候,容器才会跑/docker-entrypoint-initdb.d/下的脚本。如果之前启动过MySQL并持久化了数据,得先删除mysql-data卷(执行docker-compose down -v),再重新启动容器。 - 还要确认脚本的后缀是
.sql或者.sh,并且文件有可读权限——可以在Dockerfile里加一句RUN chmod 644 /docker-entrypoint-initdb.d/*来确保。
Q2: Spring应用连不上MySQL怎么办?
- 虽然
depends_on能保证MySQL先启动,但没法保证MySQL服务已经完全就绪(比如刚启动还在初始化)。可以在Spring应用里加连接重试的配置,或者用wait-for-it.sh这类脚本,等MySQL的3306端口开放后再启动应用。 - 一定要注意Spring的数据库URL里用的是Docker Compose的服务名
mysql-db,而不是localhost——容器里的localhost指的是容器自己,不是宿主机。 - 核对一下MySQL的root密码、初始数据库名,和Spring配置里的是不是完全一致。
Q3: 挂载的config-repo目录权限不足报错?
- 可以像示例里那样,在
springapp.dockerfile里提前创建目录并设置755权限,这样容器启动时就不会因为权限问题卡壳。 - 或者在
docker-compose.yml的volumes配置里加上user: "你的UID:你的GID",让容器运行的用户和宿主机目录的权限匹配——可以用id -u和id -g命令查看自己的UID和GID。
Q4: 怎么减小Spring应用镜像的体积?
- 推荐用多阶段构建:先用Maven镜像构建jar包,再把jar包复制到轻量的OpenJRE镜像里,这样镜像体积能从几百MB降到几十MB。给你个示例Dockerfile:
# 第一阶段:用Maven构建jar包 FROM maven:3.5-jdk-8 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline # 提前下载依赖,加快构建速度 COPY src ./src RUN mvn package -DskipTests # 打包jar包,跳过测试 # 第二阶段:用轻量的OpenJRE镜像运行应用 FROM openjdk:8-jre-alpine WORKDIR /app COPY --from=builder /app/target/users-mysql.jar . RUN mkdir -p /var/lib/spring-cloud/config-repo && chmod 755 /var/lib/spring-cloud/config-repo CMD ["java", "-jar", "users-mysql.jar"] VOLUME ["/var/lib/spring-cloud/config-repo"]
Q5: 怎么看容器日志排查问题?
- 查看MySQL日志:
docker-compose logs mysql-db - 查看Spring应用日志:
docker-compose logs springapp - 实时跟踪日志:加个
-f参数就行,比如docker-compose logs -f springapp
内容的提问来源于stack exchange,提问作者Nitesh Sharma
相关产品推荐
相关产品推荐

