原创

Docker Compose 部署 Spring Boot、MySQL 与 Redis:配置和验证

整理 Java 服务与依赖容器的部署示例,修正 Redis 认证、服务停止与数据卷处理,补充配置一致性和启动就绪检查。

原环境与修订范围

原记录使用 CentOS 7.6、Docker 1.13.1、Compose 1.29.2、MySQL 5.7 和 JDK 8。它描述的是历史环境,不能仅因文章发布日期较新就视为当前部署基线。

下文给出一个用于理解配置关系的 Compose 示例,命令采用 docker compose 形式。它没有在原服务器运行,也不宣称与 Docker 1.13.1 兼容。使用前应选择匹配的 Docker、Compose、数据库与 Java 镜像版本。

1. Java 镜像

ARG JAVA_BASE_IMAGE
FROM ${JAVA_BASE_IMAGE}
WORKDIR /app
COPY target/app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

JAVA_BASE_IMAGE 应提供已核验的具体镜像标签或摘要,且运行时须支持应用编译目标。构建前先产生 target/app.jar;EXPOSE 仅声明端口,应用仍需实际监听 8080。

2. Compose 配置

下面使用应用专用数据库用户,不把数据库与 Redis 端口映射到宿主机。Redis 通过挂载配置文件启用认证;原文仅声明 REDIS_PASSWORD 环境变量的方式并不能自动配置官方 Redis 镜像的服务端密码。

services:
  mysql:
    image: ${MYSQL_IMAGE:?set MYSQL_IMAGE}
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?set root password}
      MYSQL_DATABASE: blog_demo
      MYSQL_USER: blog_app
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:?set application password}
    volumes:
      - mysql_data:/var/lib/mysql

  redis:
    image: ${REDIS_IMAGE:?set REDIS_IMAGE}
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    volumes:
      - ./redis.conf:/usr/local/etc/redis/redis.conf:ro
      - redis_data:/data

  app:
    build:
      context: .
      args:
        JAVA_BASE_IMAGE: ${JAVA_BASE_IMAGE:?set JAVA_BASE_IMAGE}
    environment:
      SERVER_PORT: "8080"
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/blog_demo
      SPRING_DATASOURCE_USERNAME: blog_app
      SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD:?set application password}
      SPRING_REDIS_HOST: redis
      SPRING_REDIS_PORT: "6379"
      SPRING_REDIS_PASSWORD: ${REDIS_PASSWORD:?set redis password}
    ports:
      - "127.0.0.1:8080:8080"
    depends_on:
      - mysql
      - redis

volumes:
  mysql_data:
  redis_data:

这里的 SPRING_REDIS_* 对应 Spring Boot 2 风格配置;其他版本应核对 Redis 属性前缀。JDBC 驱动也需与 MySQL 版本匹配。

redis.conf 的最小示意如下:

bind 0.0.0.0
protected-mode yes
dir /data
appendonly yes
requirepass "REPLACE_WITH_YOUR_TEST_PASSWORD"

启动前将占位密码替换为实际测试凭据,并确保它与应用的 REDIS_PASSWORD 一致。不要将真实配置提交仓库,也不要认为 ${REDIS_PASSWORD} 写进 redis.conf 后会自动被 Compose 展开。

3. 启动顺序不等于依赖就绪

短格式 depends_on 表达启动依赖,并不保证 MySQL 已能接受业务连接。应用应有适合自身的启动重试,或为依赖配置并验证就绪检查;健康检查需要匹配真实镜像能力,不能机械复制一个不一定存在的工具命令。

docker compose config --quiet
docker compose up -d --build
docker compose ps
docker compose logs --tail=100 app

检查日志时避免输出配置中的密码。随后通过应用的真实健康入口验证连接,不把 running 直接当作业务成功。

4. 停止、移除与删除数据要分别说明

# 停止服务,保留容器与数据
docker compose stop

# 恢复已存在的容器
docker compose start

# 移除该项目的容器与网络;默认不删除命名卷
docker compose down

down -v 还会删除 Compose 声明的命名卷及附加的匿名卷,不能放进普通停服步骤。本示例的 MySQL 和 Redis 数据都依赖命名卷,删除卷前必须明确其数据用途并完成所需备份。

5. 验证记录应该包含什么

在隔离测试环境中写入一笔可识别数据,执行停止与启动后再次读取;验证 Redis 无密码连接不能执行受保护命令;检查应用只能通过所需网络入口访问。记录镜像版本、命令、结果和失败日志,而不是只附一张启动截图。

参考

正文到此结束