redis
使用docker下载并安装redis
从 Docker Hub 拉取最新的 Redis 镜像,并在后台启动一个名为 redis 的容器,同时将容器的 6379 端口映射到宿主机的 6379 端口。
命令详解
bash
docker run -d --name redis -p 6379:6379 redis
docker run:创建并启动一个新容器。-d:后台运行(detached mode)。--name redis:给容器起名叫redis,方便后续管理。-p 6379:6379:端口映射,格式为宿主机端口:容器端口。这样你就可以通过宿主机的 6379 端口访问容器内的 Redis。redis:使用的镜像名,如果不指定标签,默认是latest。
运行后你可能还想做这些
1. 检查是否运行成功
bash
docker ps | grep redis
看到状态为 Up 就表示正常。
2. 进入容器测试连接
bash
docker exec -it redis redis-cli
或者直接在宿主机用 redis-cli 连接(需要本地也安装了 Redis 客户端)。
3. 启用持久化(重要)
默认情况下,容器删除后 Redis 的数据也会丢失。建议挂载一个本地目录或数据卷来保存数据:
bash
docker run -d \
--name redis \
-p 6379:6379 \
-v /你的本地路径/data:/data \
redis redis-server --appendonly yes
-v /你的本地路径/data:/data:把容器的/data目录挂载到宿主机,RDB 和 AOF 文件就会存在这里。redis-server --appendonly yes:开启 AOF 持久化(生产环境推荐)。
4. 设置密码
bash
docker run -d \
--name redis \
-p 6379:6379 \
redis redis-server --requirepass 你的密码
连接时就需要使用 AUTH 密码 验证。
5. 使用自定义配置文件
bash
docker run -d \
--name redis \
-p 6379:6379 \
-v /宿主机/redis.conf:/usr/local/etc/redis/redis.conf \
redis redis-server /usr/local/etc/redis/redis.conf
先把官方配置下载到宿主机,根据需要修改后再挂载进去。
常用管理命令
- 停止容器:
docker stop redis - 启动已存在的容器:
docker start redis - 查看日志:
docker logs redis - 删除容器(先停止):
docker rm redis
下载成功后,容器状态is not running
1. 查看容器状态
运行以下命令,看看容器的当前状态和退出代码:
bash
docker ps -a --filter name=redis
你会看到类似这样的输出:
text
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cac75572ece6 redis "docker-entrypoint.s…" 2 hours ago Exited (1) 2 minutes ago redis
STATUS 一栏会显示 Exited 和退出码,这能提示容器退出的原因。
2. 查看日志,定位退出原因
bash
docker logs redis
常见的原因有:
- 端口冲突:宿主机的 6379 端口已被占用。
- 解决方法:换一个宿主机端口,比如
-p 6380:6379,或者关掉占用端口的程序。
- 解决方法:换一个宿主机端口,比如
- 配置错误:如果你挂载了配置文件,但里面写了错误的参数。
- 权限问题:挂载的数据目录权限不足。
- Redis 启动失败:可能因为内存或资源限制。
3. 尝试重启容器
如果日志没有明显错误,只是意外停止,可以试试:
bash
docker start redis
然后立即用 docker ps 看它是否保持运行。如果又立刻退出,还是需要看日志。
4. 彻底重建(推荐)
因为 Redis 容器通常是无状态的,直接删除后重装最省事:
bash
# 先停止并删除旧容器(数据会丢失,除非之前挂载了卷)
docker rm -f redis
# 重新运行,记得加上持久化和密码(重要!)
docker run -d \
--name redis \
-p 6379:6379 \
-v /你的自定义路径/redis-data:/data \
redis redis-server --appendonly yes --requirepass 你的密码
-v挂载的目录请替换为你宿主机上的一个绝对路径,比如/home/user/redis-data。这样即使容器被删除,数据也会保留。- 需要免密连接就删掉
--requirepass 你的密码。
容器 redis 的状态是 Created,而不是 Up
容器
redis的状态是 Created,而不是 Up(运行中)。
而另一个容器travel_redis已经占用了宿主机的 6379 端口。
因为一个端口只能被一个进程监听,所以当你 docker run -p 6379:6379 时,新的容器因为端口冲突无法启动,就一直卡在 Created 状态,而没有进入运行。
处理方式(三选一)
✅ 方案一:直接使用已经在运行的 travel_redis
它已经跑了 2 天,端口也是 6379,直接用就行了:
bash
docker exec -it travel_redis redis-cli
如果它之前没设密码,进去就能用。有密码的话,用 AUTH 密码 或者连接时加 -a 参数:
bash
docker exec -it travel_redis redis-cli -a 你的密码
这个方案最简单,不用动任何东西。
🔄 方案二:停掉旧的 travel_redis,启动新的 redis 容器
如果你想统一命名,或者想用最新版 Redis 镜像,可以这样做:
bash
# 1. 停止并删除旧的 travel_redis(注意:数据可能丢失,除非它之前挂载了卷)
docker stop travel_redis
docker rm travel_redis
# 2. 删除处于 Created 状态的 redis 容器
docker rm redis
# 3. 重新运行你想要的 redis 容器(建议开启持久化和设置密码)
docker run -d \
--name redis \
-p 6379:6379 \
-v /你的宿主机路径/redis-data:/data \
redis redis-server --appendonly yes --requirepass 你的密码
这样 docker exec -it redis redis-cli 就能正常工作了。
🔀 方案三:保留 travel_redis,给新容器换一个宿主机端口
如果你两个都需要(比如一个测试、一个正式),可以换个端口:
bash
# 先删除无法启动的 redis 容器
docker rm redis
# 使用其他宿主机端口,比如 6380
docker run -d \
--name redis-test \
-p 6380:6379 \
redis
连接时指定端口即可:
bash
docker exec -it redis-test redis-cli
# 或者从宿主机连接:redis-cli -p 6380
📌 补充:关于数据安全
- 目前运行的
travel_redis如果没有挂载卷,一旦删除,里面的数据就没了。可以用docker inspect travel_redis | grep Mounts -A 10查看是否有挂载。 - 新创建的容器也建议按照之前提过的方式,挂载数据目录并开启 AOF 持久化。
控制台输出多个redis状态
1. 查看 travel_redis 的详细信息
bash
docker inspect travel_redis
这会输出一个很长的 JSON,你可以重点关注这几个字段:
Created:容器创建时间。Config.Image:使用的镜像(这里是redis:7-alpine)。Config.Cmd:启动命令,看是否设置了密码或持久化参数。Mounts:挂载了哪些目录,如果有挂载,说明数据存在宿主机上,删除容器数据不会丢。NetworkSettings.Networks:它加入了哪个网络,可能跟某个项目一起使用。
如果你想快速提取关键信息,可以用格式化输出:
bash
docker inspect --format '{{.Created}} {{.Config.Image}} {{.Mounts}}' travel_redis
2. 看它是不是 Docker Compose 启动的
检查一下它是否属于某个 Compose 项目:
bash
docker inspect travel_redis | grep -i compose
如果输出里有 com.docker.compose.project 之类的标签,说明它是通过 docker-compose up 启动的,项目名可能就是 travel。
你也可以看看有没有正在运行的 Compose 项目:
bash
docker ps --filter "label=com.docker.compose.project"
3. 确认里面有没有重要数据
先连进去看看有没有键:
bash
docker exec -it travel_redis redis-cli
进去后执行:
text
KEYS *
如果有重要数据,可以把它持久化下来(假设没有挂载卷,但数据还在容器内):
bash
# 在容器内触发一次 RDB 保存
docker exec travel_redis redis-cli BGSAVE
# 然后把这个快照拷贝到宿主机
docker cp travel_redis:/data/dump.rdb ./travel-redis-backup.rdb
4. 决定保留还是删除
-
如果确认它没用(比如是之前测试留下的),直接停掉并删除,然后使用你自己的新容器:
bash
docker stop travel_redis && docker rm travel_redis docker rm redis # 删除那个卡在 Created 状态的新容器 docker run -d --name redis -p 6379:6379 -v /你自定义的路径/data:/data redis redis-server --appendonly yes --requirepass 你的密码 -
如果它可能属于某个项目,而且那个项目你可能还会用,建议保留它,换个端口启动自己的 Redis(比如 -p 6380:6379),互不干扰。
确认是由 docker-compose 项目 travel-platform 启动
确认 travel_redis 是由 docker-compose 项目 travel-platform 启动的,那说明它很可能还在被某个应用依赖,不能直接停掉或删除,否则会影响那个平台。
你现在最稳妥的做法是:保留 travel_redis,给自己的学习或测试换一个端口,互不干扰。
🛠 具体操作步骤
1. 清理掉那个创建失败的新容器(状态是 Created 的那个)
bash
docker rm redis
2. 重新创建你自己的 Redis 容器,宿主机端口换成其他(如 6380)
bash
docker run -d \
--name redis \
-p 6380:6379 \
redis redis-server --appendonly yes --requirepass 你的密码
-p 6380:6379:把宿主机的 6380 端口映射到容器的 6379,这样就不会和travel_redis的 6379 冲突。- 你可以根据自己的需要决定是否加密码和持久化参数,上面的命令已包含 AOF 持久化和密码。
3. 连接你自己的 Redis
bash
# 用容器内的客户端连接
docker exec -it redis redis-cli -a 你的密码
# 或者从宿主机用客户端连接(需要本地有 redis-cli)
redis-cli -p 6380 -a 你的密码
💡 如果你只是想临时用一下 Redis
也可以直接使用已有的 travel_redis,它已经在运行并且端口是 6379,免去了自己再装一个的麻烦。
先看看它有没有设密码(通常 Docker Compose 项目会在环境变量或配置文件里设置):
bash
docker exec -it travel_redis redis-cli
如果提示 NOAUTH Authentication required,说明有密码,你需要去 travel-platform 项目的 docker-compose.yml 文件里查找 REDIS_PASSWORD 或类似的字段。
如果进去后显示 127.0.0.1:6379>,那就直接可用,密码为空。
但要注意:这个 Redis 是
travel-platform的一部分,有可能被项目自动管理(比如重启、删除数据卷等),最好不要在里面存你自己的重要数据。
🔄 如果你想彻底拥有自己的 Redis,同时停掉旧项目
前提是你确认 travel-platform 已经不再需要。操作前最好先备份一下它的数据(见上一轮的 BGSAVE 和 docker cp 方法)。
进入 travel-platform 项目目录(包含 docker-compose.yml 的文件夹),然后执行:
bash
docker-compose down # 停止并删除该项目所有容器和网络
之后宿主机 6379 端口就释放了,你就可以按最初的命令在 6379 端口上启动自己的 Redis 了。
浙公网安备 33010602011771号