skip to content
Wentao Zhang

🚀 Docker 部署 Redis 常见问题排查与解决方案记录

/ 5 min read

📝 前言

记录 Docker 部署 Redis 过程,留作参考。

使用版本

  • CentOS 7.9
  • Docker 20.10.9
  • Redis 6.2.16

1. ⚙️ 基础部署配置

1.1 📂 目录结构

首先,我们需要创建必要的目录结构:

Terminal window
mkdir -p /docker/redis/{conf,data}

1.2 📄 基础配置文件

下载指定版本 redis.conf1,解压后将 redis.conf 放到 /docker/redis/conf/ 目录下,并在 /docker/redis/conf/redis.conf 中配置以下基本项:

redis.conf
bind 0.0.0.0
port 6379
requirepass your_password
protected-mode yes
daemonize no
appendonly yes
配置项示例值作用含义注意事项
bind0.0.0.0指定 Redis 监听的网络接口允许从任何 IP 地址访问 Redis 服务生产环境建议指定具体 IP,以增加安全性
port6379指定 Redis 服务器监听的端口号6379 是 Redis 的默认端口客户端通过此端口与 Redis 建立连接
requirepassyour_password设置 Redis 访问密码客户端连接需要提供密码验证增加基本的访问安全保护
protected-modeyes保护模式配置启用保护模式,增加安全性当 bind 配置为 0.0.0.0 时,必须设置密码才能从外部访问
daemonizeno是否以守护进程方式运行设为 no 表示在前台运行常用于容器化部署,便于容器管理
appendonlyyes持久化策略配置启用 AOF 持久化机制• 实时记录写操作
• 数据更安全
• 可以实现数据恢复
• 降低数据丢失风险

这些配置组合在一起,形成了一个基本的、安全的 Redis 服务配置,适合容器化部署环境

1.3 🔨 初始运行命令

Terminal window
docker run -d \
--name redis \
--restart always \
-p 10130:6379 \
-v /docker/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /docker/redis/data:/data \
redis:latest \
redis-server /etc/redis/redis.conf

2. 🔍 问题排查与解决

2.1 🌐 TCP backlog 问题

问题现象

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128

💡 解决方案

Terminal window
# 临时解决
sysctl -w net.core.somaxconn=1024
# 永久解决
echo "net.core.somaxconn=1024" >> /etc/sysctl.conf
sysctl -p
# Docker 运行命令添加参数
--sysctl net.core.somaxconn=1024

2.2 💾 内存过度使用警告

问题现象

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.

💡 解决方案

Terminal window
# 临时解决
sysctl vm.overcommit_memory=1
# 永久解决
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p
# Docker 运行命令添加参数
--sysctl vm.overcommit_memory=1

2.3 🔑 后台任务权限问题

问题现象

Fatal: Can't initialize Background Jobs. Error message: Operation not permitted

💡 解决方案

  1. 在 Docker 运行命令中添加 --privileged=true 参数,给予容器必要的系统权限。2
  2. 升级 Docker 版本到 20.10.10 3

2.4 📝 PID 文件写入权限问题

问题现象

Failed to write PID file: Permission denied

💡 解决方案

Terminal window
chmod -R 777 /docker/redis/data
chmod -R 777 /docker/redis/conf

3. ✅ 最终可用配置

3.1 🛠️ 完整的 Docker 运行命令

Terminal window
docker run -d \
--name redis \
--restart always \
-p 10130:6379 \
-v /docker/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /docker/redis/data:/data \
--privileged=true \
redis:latest \
redis-server /etc/redis/redis.conf

3.2 ✔️ 验证部署

Terminal window
# 检查容器状态
docker ps | grep redis
# 查看容器日志
docker logs redis
# 测试连接
docker exec -it redis redis-cli -a your_password ping

4. 📚 最佳实践建议

  1. 🏷️ 版本选择

    • 生产环境建议使用指定版本而不是 latest
    • 可以选择较为稳定的版本,如 Redis 6.2.16
  2. 🔐 安全性考虑

    • 修改默认端口
    • 设置强密码
    • 限制容器资源使用
  3. 📊 监控与维护

    • 定期备份数据
    • 监控容器运行状态
    • 定期检查日志

📌 总结

通过逐步排查和解决各种问题,最终实现了 Redis 的稳定运行。关键在于正确处理权限问题和系统参数配置。在实际部署中,建议根据具体环境和需求适当调整配置参数。

Footnotes

  1. Redis Releases

  2. Redis GitHub Issues

  3. GitHub Wiki