文章目录

  • 前言
  • Docker-compose部署redis的正确方式
  • Docker-compose.yml 文件
  • 文件目录结构
  • redis.conf 关键信息
  • docker-compose 启动
  • 启动后用redis-cli连接server
  • 问题列表
  • redis启动失败
  • 原因 & 解决方案
  • 误打误撞地启动成功了
  • redis /data 数据目录挂载失败
  • 原因
  • 设置权限的两种方式
  • 小结


前言

     最近在尝试用docker部署项目,在尝试启动Redis容器时各种起不来,卡了一段时间,特此记录下解决过程。

Docker-compose部署redis的正确方式

Docker-compose.yml 文件

services:
  redis:
    image: redis:6.2
    container_name: redis6
    restart: always
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "6378:6379"
    volumes:
      - ./redis.conf:/usr/local/etc/redis/redis.conf
      - ./data:/data:rw
      - ./logs:/logs
    command:  redis-server /usr/local/etc/redis/redis.conf --requirepass "123456"

文件目录结构

docker redis 部署报错 docker启动redis失败_docker redis 部署报错

说明:

文件名

描述

redis.cnf

配置文件

data

数据文件目录

docker-compose.yml

用来启动redis容器

logs

日志文件目录

redis.conf 关键信息

# bind 127.0.0.1
daemonize no
logfile /logs/redis.log
appendonly yes

说明:

配置项

描述

bind

指定本机网卡对应的IP地址,限制本机访问,默认 bind 127.0.0.1

daemonize

指定是否为守护进程方式运行,默认值为no

logfile

指定日志文件路径,默认值为 logfile ’ ', 默认为控制台打印,并没有日志文件生成

appendonly

是否开启持久化,默认值为no

docker-compose 启动

# 前台启动容器,控制台会打印容器启动的日志信息,方便看异常信息
docker-compose up

docker redis 部署报错 docker启动redis失败_容器_02

启动后用redis-cli连接server

docker redis 部署报错 docker启动redis失败_docker redis 部署报错_03

     至此,一切顺利的话,redis服务就成功启动啦!

问题列表

redis启动失败

docker redis 部署报错 docker启动redis失败_redis_04


     redis 启动失败,status 在不断的重启中,端口连接失败。

docker redis 部署报错 docker启动redis失败_docker redis 部署报错_05

原因 & 解决方案

     redis.conf 中设置了 daemonize yes

     当daemonize 设置了yes,表示redis在后台运行,当执行docker-compose执行启动redis进程时,docker发现自己无事可做,容器自动结束,所以导致redis启动失败。

误打误撞地启动成功了

docker redis 部署报错 docker启动redis失败_容器_06


配置信息:

redis.conf 中 daemonize yes

docker-compose.yml:

docker redis 部署报错 docker启动redis失败_docker-compose_07


目录结构:

docker redis 部署报错 docker启动redis失败_redis_08


可以看到新增redis目录,并且新增redis目录下 redis.conf 文件大小为0;

docker redis 部署报错 docker启动redis失败_docker_09


我分析启动成功的原因是在设置挂载目录时,设置了一个不存在的/redis/xx的目录,同样/redis/redis.conf 也不存在,推测可能是redis在启动的时候找不到配置文件,用了内置的默认文件,启动成功了~ 噗~

redis /data 数据目录挂载失败

     观察到的现象是设置了appendonly=yes ,正常情况下会在data目录下生成appendonly.aof,但是在宿主机的data目录下未发现任何文件,这时候看redis日志如下:

docker redis 部署报错 docker启动redis失败_docker redis 部署报错_10

原因

     对于appendonly.aof文件没有写的权限

设置权限的两种方式

  • 在宿主机的挂载目录下设置读写权限和操作用户组
  • 在volumes 中设置读写权限

1、在宿主机的挂载目录下设置读写权限和操作用户组

sudo chown 999:999 /data
sudo chmod 777 /data

docker redis 部署报错 docker启动redis失败_redis_11

2、在volumes 中设置读写权限

volumes:
      - ./data:/data:rw

进入容器查看/data目录权限:

docker redis 部署报错 docker启动redis失败_docker redis 部署报错_12


在宿主机查看/data 目录:

docker redis 部署报错 docker启动redis失败_容器_13

小结

     平时对于组件中间件的信息拿来就用,了解的少,思考的也少,导致了一个又一个的问题,希望自己越来越专业~