1.MySQL配置

1.服务器上配置文件的目录结构

mysql/
├── docker-compose.yml
├── .env
├── data/              # 运行数据
├── logs/              # 运行日志
├── init/              # 仅“首次初始化”
│   └── 01_base.sql
└── migrations/        # 未来所有结构演进
    ├── V1__init.sql
    ├── V2__user.sql
    ├── V3__order.sql

2.docker-compose.yml和.env文件内容

services:
  jimidou-mysql:
    image: mysql:${MYSQL_VERSION:-8.0}
    container_name: jimidou-mysql
    restart: always
    stop_grace_period: 1m

    # =========================
    # 环境变量(初始化 & 运行)
    # =========================
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:?错误:未设置数据库 root 密码}

      # 默认初始化数据库(首次启动 data 目录为空时生效)
      - MYSQL_DATABASE=${MYSQL_DATABASE:-jimidou_db}

    # =========================
    # MySQL 启动参数
    # =========================
    command:
      # 使用传统密码插件,兼容旧版 JDBC / 框架
      - --default-authentication-plugin=mysql_native_password

      # 全局字符集,支持 emoji
      - --character-set-server=utf8mb4

      # 排序规则,中文/多语言更合理
      - --collation-server=utf8mb4_unicode_ci

      # 数据库内部时间统一为北京时间(now() / curdate())
      - --default-time-zone=+08:00

      # 表名不区分大小写(强烈推荐,防止 Linux/Windows 差异引发事故)
      - --lower_case_table_names=1

      # InnoDB Buffer Pool 大小
      # 推荐设置为容器内存的 50%~70%,防止 OOM
      - --innodb-buffer-pool-size=${MYSQL_INNODB_BUFFER_POOL:-1G}

    # =========================
    # 端口映射(仅在需要外部访问时暴露)
    # =========================
    ports:
      - "${HOST_MYSQL_PORT:-3306}:3306"

    # =========================
    # 数据 & 配置 & 日志持久化
    # =========================
    volumes:
      # MySQL 数据目录(最重要)
      - ${MYSQL_DATA_PATH:-./data}:/var/lib/mysql

      # 初始化 SQL 脚本目录
      # 仅在 data 目录为空时执行(首次启动)
      - ./init:/docker-entrypoint-initdb.d

      # MySQL 日志目录(方便排错、审计)
      - ./logs:/var/log/mysql

      # 自定义配置(需要更深度调优时启用)
      # - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf

    # =========================
    # 资源保护(防止 MySQL 吃光宿主机内存)
    # =========================
    mem_limit: ${MYSQL_MEM_LIMIT:-2G}

    # =========================
    # 健康检查(生产必备)
    # =========================
    healthcheck:
      # mysqladmin ping 能真实反映数据库是否“可用”
      test:
        [
          "CMD",
          "mysqladmin",
          "ping",
          "-h", "127.0.0.1",
          "-u", "root",
          "-p${MYSQL_ROOT_PASSWORD}"
        ]
      # 每 10 秒检查一次
      interval: 10s
      # 单次检查超时时间
      timeout: 5s
      # 连续失败 5 次才判定 unhealthy
      retries: 5
      # 给 MySQL 启动和 crash recovery 预留时间
      start_period: 30s

    # =========================
    # 网络
    # =========================
    networks:
      - jimidou-net

networks:
  jimidou-net:
    external: true
TZ=Asia/Shanghai

MYSQL_VERSION=8.0
HOST_MYSQL_PORT=3306

MYSQL_ROOT_PASSWORD=mysql密码
MYSQL_DATABASE=jimidou_db

MYSQL_MEM_LIMIT=2G
MYSQL_INNODB_BUFFER_POOL=1G

MYSQL_DATA_PATH=./data

2.Redis配置

1.服务器上配置文件的目录结构

redis/
├── docker-compose.yml
├── .env
├── data/              # 运行数据

2.docker-compose.yml和.env文件内容

services:
  jimidou-redis:
    image: redis:${REDIS_VERSION:-7.0.15-alpine}

    # 固定容器名(单机部署友好,未来上 Swarm / K8s 时需移除)
    container_name: jimidou-redis

    # 容器停止时的宽限期,避免 Redis(AOF)被强杀导致数据不一致
    stop_grace_period: ${STOP_TIMEOUT:-30s}

    # Redis 进程异常退出时自动拉起(不用于高可用,仅用于单机自恢复)
    restart: always

    # Docker 层面的内存硬限制,防止 Redis 进程无上限吃内存
    mem_limit: ${REDIS_MEM_LIMIT:-1G}

    # 容器内时区,保证日志时间、慢日志、AOF 时间戳正确
    environment:
      - TZ=Asia/Shanghai

    # Redis 启动参数(不使用 redis.conf,避免配置分散)
    command:
      # 启动 Redis Server
      - redis-server

      # 显式绑定监听地址,避免依赖镜像默认行为
      # 跨服务器访问依赖宿主机安全组 / 防火墙控制
      - --bind 0.0.0.0

      # 开启 AOF 持久化,保证服务异常重启后数据可恢复
      - --appendonly yes

      # 强制开启密码认证
      - --requirepass "${REDIS_PASSWORD:?错误:必须设置密码}"

      # Redis 自身内存上限(必须小于 Docker mem_limit)
      # 预留内存给 fork / AOF rewrite / jemalloc / OS
      - --maxmemory ${REDIS_MAX_MEMORY:-750M}

      # 内存淘汰策略:在所有 key 中按 LRU 淘汰
      - --maxmemory-policy allkeys-lru

    # 将 Redis 端口映射到宿主机
    ports:
      - "${HOST_REDIS_PORT:-6379}:${CONTAINER_REDIS_PORT:-6379}"

    # Redis 数据目录挂载
    # AOF / RDB 数据持久化到宿主机,容器销毁不丢数据
    volumes:
      - ${REDIS_DATA_PATH:-./data}:/data

    # Redis 健康检查
    healthcheck:
      test:
        [
          "CMD",
          # 使用 redis-cli 主动发起 PING
          "redis-cli",
          # 关闭密码警告,避免日志噪音
          "--no-auth-warning",
          # 明确连接本机 Redis
          "-h", "127.0.0.1",
          "-p", "6379",
          # 使用与 Redis Server 一致的密码
          "-a", "${REDIS_PASSWORD}",
          # Redis 正常响应应返回 PONG
          "ping"
        ]

      # 每 10 秒检查一次
      interval: 10s

      # 单次检查超时时间
      timeout: 5s

      # 连续失败 5 次才判定为 unhealthy,避免短暂抖动误判
      retries: 5

      # 容器启动后给予 10 秒缓冲时间,再开始健康检查
      start_period: 10s
      
    # 接入外部 Docker 网络,便于与同机其他服务通信
    networks:
      - jimidou-net

# 使用已存在的 Docker 网络(避免 Compose 自动创建多个网络)
networks:
  jimidou-net:
    external: true

# 版本与资源
REDIS_VERSION=7.0.15-alpine
STOP_TIMEOUT=30s
REDIS_MEM_LIMIT=1G
REDIS_MAX_MEMORY=750mb

# 端口
HOST_REDIS_PORT=6379
CONTAINER_REDIS_PORT=6379

# 安全与路径
REDIS_PASSWORD=redis密码
REDIS_DATA_PATH=./data

更多推荐