docker run redis STATUS Exited (1)

博客记录了使用 Docker 启动 Redis 的过程。启动时查看状态出现问题,起初以为是权限问题,修改权限后仍未解决。经查找发现是防火墙问题,通过临时关闭 selinux 并修改配置,再次尝试启动,最终 Redis 状态为 Up,启动完成。

1、用 docker 启动redis 

docker run --name redis -p 6379:6379 -v /data:/data -d redis

启动redis或其他组件使用docker ps -a 发现

[root@localhost ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                     PORTS           
bf250c9e3ea6        redis               "docker-entrypoint..."   About a minute ago   Exited (1) 4 seconds ago

2、查看docker-redis状态

docker logs redis
[root@localhost ~]# docker logs redis
find: '.': Permission denied
chown: changing ownership of '.': Permission denied

以为是权限问题

尝试修改权限

chown -R roor /data
chmod -R 777 /data
docker start redis

仍然出现该问题

3、查找类似问题发现是防火墙问题

先临时关闭 selinux 

setenforce 0

再修改 把SELINUX改成 SELINUX=disable

vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disable
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

4、再次尝试启动docker - redis 

[root@localhost ~]# docker start redis
redis
[root@localhost ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   
b016af4516e9        redis               "docker-entrypoint..."   3 minutes ago       Up 3 seconds        0.0.0.0:6379->6379/tcp  

状态为Up启动完成。

<think> 我们正在分析用户提供的docker run命令,并排查可能的问题。 命令是: docker run -d -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data redis:6.0.8 redis-server /etc/redis/redis.conf 根据引用内容,类似的命令在引用[1][3][5]中都有出现,但我们的命令中缺少了`-d`后面的镜像标签(在引用中,`-d`后面都紧跟着`redis:6.0.8`,然后才是`redis-server`命令)。然而,我们的命令中`-d`后面直接是`redis:6.0.8`,再是`redis-server`,这是正确的。 但是,我们注意到命令中`-d`选项后面直接是镜像名,然后是要在容器内执行的命令,这是标准的写法。 常见问题及排查步骤: 1. 容器未启动Exited状态): 使用`docker ps -a`查看容器状态,如果状态为Exited,则使用`docker logs myr3`查看日志。 2. 配置文件问题: 由于我们挂载了宿主机的配置文件到容器内,如果配置文件有错误,可能导致redis-server启动失败。 例如,引用[3]中提到,需要修改配置文件中的两个地方: - 注释掉`daemonize yes`(因为如果以daemon方式运行,容器启动后就会退出,所以应该设置为`daemonize no`,或者不设置,因为默认是no) - 设置`protected-mode no`(如果需要远程连接,则关闭保护模式) 另外,引用[5]提到,如果想开启持久化,可以设置`appendonly yes`。 如果配置文件有误,可以修改宿主机上的配置文件(位于`/app/redis/redis.conf`),然后重启容器。 3. 目录权限问题: 挂载的宿主机目录`/app/redis`必须存在,并且redis进程在容器内需要有读写权限。如果目录不存在,或者权限不足,可能导致启动失败。 可以使用`mkdir -p /app/redis`创建目录,并确保目录可读写(通常需要给目录适当的权限,比如`chmod 777`,但生产环境需谨慎)。 4. 端口冲突: 如果宿主机上已经有其他进程占用了6379端口,那么容器将无法启动。可以使用`netstat -tunlp | grep 6379`查看。 5. 容器名称重复: 如果已经有一个名为`myr3`的容器存在,那么需要先删除(`docker rm -f myr3`)或者使用不同的名称。 6. 查看容器日志: 使用`docker logs myr3`查看具体错误信息。 7. 检查配置文件挂载: 确保宿主机上的配置文件路径正确,且是一个文件(不是目录)。挂载的源路径是`/app/redis/redis.conf`,目标路径是`/etc/redis/redis.conf`。 8. 如果配置文件修改后需要重启容器: `docker restart myr3` 9. 如果容器启动成功,但无法连接,检查防火墙设置(宿主机防火墙是否开放6379端口)。 根据引用[3]中的经验,配置文件中的`daemonize`必须设置为`no`,否则容器启动后会立即退出,因为后台模式会导致docker容器认为主进程已经退出。 因此,我们首先应该检查容器状态和日志。 步骤: 1. 运行`docker ps -a | grep myr3` 查看容器状态。 2. 如果容器已退出,使用`docker logs myr3`查看日志。 3. 根据日志排查问题(通常是配置文件错误)。 如果日志中显示配置文件错误,则修改宿主机上的配置文件,然后重启容器。 另外,注意命令中挂载的配置文件路径:宿主机的`/app/redis/redis.conf`挂载到容器的`/etc/redis/redis.conf`。确保宿主机上该路径存在且是文件。 如果宿主机上还没有配置文件,可以先获取一个默认的redis.conf。例如,可以临时运行一个redis容器,将其配置文件复制出来: docker run -d --name temp-redis redis:6.0.8 docker cp temp-redis:/etc/redis/redis.conf /app/redis/redis.conf docker rm -f temp-redis 然后修改宿主机的配置文件,再重新运行命令。 总结:常见的启动失败原因是配置文件错误(特别是daemonize设置)和目录权限问题。 根据引用[1][3][5]中的命令,他们的命令中在`-d`后面都指定了镜像,然后是要执行的命令,我们的命令格式是符合的。 因此,请用户按照上述步骤排查。 注意:在命令中我们使用了`--privileged=true`,这给了容器特权,通常不是必须的,但如果有权限问题,这个选项可能会有帮助。不过,出于安全考虑,生产环境应避免使用特权模式。 另外,引用[4]中挂载的目录是`/mytest-docker/redis/data`,而我们的是`/app/redis/data`,所以确保宿主机存在该目录。 生成相关问题: </think> ### Docker 运行 Redis 容器命令问题排查 您提供的命令格式基本正确,但执行时可能遇到以下常见问题: ```bash docker run -d -p 6379:6379 --name myr3 --privileged=true \ -v /app/redis/redis.conf:/etc/redis/redis.conf \ -v /app/redis/data:/data \ redis:6.0.8 \ redis-server /etc/redis/redis.conf ``` #### 常见问题及解决方案: 1. **容器启动后立即退出** - ✅ **检查点**:执行 `docker logs myr3` 查看日志 - 🔍 **主要原因**: - Redis 配置文件错误(特别是 `daemonize` 和 `protected-mode` 设置) - 挂载的宿主机配置文件路径不存在(确保 `/app/redis/redis.conf` 已创建) - 🔧 **解决方案**: ```bash # 确保配置文件存在且配置正确 mkdir -p /app/redis echo "daemonize no" >> /app/redis/redis.conf # 必须设为 no(与-d冲突) echo "protected-mode no" >> /app/redis/redis.conf # 允许远程连接 ``` 2. **端口冲突错误** - ✅ **检查点**:`netstat -tunlp | grep 6379` - 🔧 **解决方案**: ```bash # 更换主机端口或停止占用进程 docker run -p 6380:6379 ... # 修改映射端口 ``` 3. **文件权限问题** - ✅ **检查点**:`ls -ld /app/redis` - 🔧 **解决方案**: ```bash chmod -R 777 /app/redis # 临时开放权限 # 或添加 :Z 标签(SELinux环境) -v /app/redis/redis.conf:/etc/redis/redis.conf:Z ``` 4. **配置未生效** - 🔍 **验证方法**: ```bash docker exec -it myr3 redis-cli CONFIG GET databases ``` - 若返回默认值 16 而非配置文件设定值,说明挂载失败[^3] 5. **数据持久化异常** - ✅ **检查点**:配置文件需开启 ```ini appendonly yes # 启用 AOF 持久化[^5] dir /data # 映射持久化目录 ``` #### 完整正确流程: 1. 准备目录和配置文件: ```bash mkdir -p /app/redis/{data,conf} curl -o /app/redis/redis.conf https://raw.githubusercontent.com/redis/redis/6.0/redis.conf sed -i 's/^daemonize yes/daemonize no/' /app/redis/redis.conf sed -i 's/^protected-mode yes/protected-mode no/' /app/redis/redis.conf ``` 2. 启动容器: ```bash docker run -d --restart=always \ -p 6379:6379 \ --name myredis \ -v /app/redis/redis.conf:/etc/redis/redis.conf \ -v /app/redis/data:/data \ redis:6.0.8 \ redis-server /etc/redis/redis.conf ``` 3. 验证状态: ```bash docker ps | grep myredis # 检查STATUS是否为Up docker exec -it myredis redis-cli ping # 应返回 PONG ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值