You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:09:47