Docker中的MySQL和Redis详细配置
·
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
更多推荐

所有评论(0)