Redis Docker 连接被拒绝

44

我刚刚构建了 Redis Docker 实例。

$ docker pull redis

之后我像这样运行它。

$ docker run --name=redis --detach=true --publish=6379:6379 redis

我得到以下内容

$ docker ps 
key        redis   "/sbin/entrypoint.sh"    22 minutes ago      Up 22 minutes       0.0.0.0:6379->6379/tcp   redis

对我来说,上述意味着它现在正在本地主机或127.0.0.1或0.0.0.0上的端口6379上运行监听。

但令我大为惊讶的是,当我尝试连接时,它会回应连接被拒绝。

请有经验的人指点一下。


3
如果您正在运行boot2docker(或任何其他虚拟机),您需要使用虚拟机的IP地址,而不是本地主机。如果您正在使用“docker-machine”,则可以使用“docker-machine ip default”找到正确的IP地址。 - dnephin
如果我只是更改了端口,它就可以正常工作。之前我尝试过不同的解决方案,但都没有起作用。 - Alexandre Cavalcante
7个回答

54

您需要提供有关您的环境(操作系统、Docker 安装等)的更多信息,但基本上,如果您像这样启动 Redis 容器:

docker run --name=redis-devel --publish=6379:6379 --hostname=redis --restart=on-failure --detach redis:latest

无论如何都应该暴露端口。唯一可能无法连接的原因是:如果您在Linux上弄乱了桥接接口,或者您正在使用带有自己的网络接口和IP地址的docker机器,并且您没有连接到该IP地址。如果您正在使用Docker for Mac,则仅支持路由到本地主机地址,因为Mac主机上的桥接尚未起作用。

无论如何,在使用Docker for Mac的MacOS上(而不是旧版的Docker Toolbox),以下内容足以让您开始:

➜  ~ docker run --name=redis-devel --publish=6379:6379 --hostname=redis --restart=on-failure --detach redis:latest
6bfc6250cc505f82b56a405c44791f193ec5b53469f1625b289ef8a5d7d3b61e
➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6bfc6250cc50        redis:latest        "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:6379->6379/tcp   redis-devel
➜  ~ redis-cli ping
PONG
➜  ~ 

14

找到redis的已发现端口,并使用该端口进行连接

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-server

这就是我一直在寻找的。上述命令会提供一个IP地址,以连接默认端口6379。 - Jassi

8

如果您正在使用Redis 6.2配置示例作为起点(就像我遇到这个问题时一样),bind 127.0.0.1指令和protected-mode yes的组合将不允许Docker容器之间进行通信。根据我的需求,我注释掉了bind指令,并将protected-mode指令设置为no——但是请注意提供的警告,不要将Redis暴露在公网上。


7

我建议您使用docker-compose https://docs.docker.com/compose/

在您的docker-compose.yml文件中

redis:                                                                          
  image: redis
ports:
  - "6379:6379" 

接下来你可以运行:

$ docker-compose run redis /bin/bash
$ redis-server
$ redis-cli ping

应该返回:PONG

5

看起来是redis客户端引起的网络问题,因为您的redis服务器看起来很好。

请注意,redis docker页面有点令人困惑。它说要通过redis-cli连接到redis,您应该输入:

docker run -it --network some-network --rm redis redis-cli -h some-redis

然而,这将创建另一个docker容器,基本上是redis客户端。它无法连接到您的redis服务器,因为它们没有连接到同一网络。

您可以尝试以下操作:

docker network create some-network
docker run --name redis-server --network some-network -d redis
docker run -it --network some-network --rm redis redis-cli -h redis-server

另一种选择是确实像你所做的那样映射端口6379,但这将要求您使用 Redis 客户端并将其下载到您自己的计算机。

0
只需明确告诉Docker要映射的端口即可:
 docker run  --publish=6379:6379 redis

0
你可以生成一个网络模式设置为host的Redis容器。这样可以让你从本地主机连接到Redis服务器。

docker-compose.yml

version: '3.7'

services:
  redis:
    image: 'redis:latest'
    network_mode: host
    ports:
      - '6379:6379'
    tty: true

docker compose up -d

或者你可以进入容器,然后从容器中连接到Redis服务器,像这样:
docker run --name some-redis -d redis
docker exec -it some-redis /bin/bash
redis-cli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接