Redis Docker 连接被拒绝

问题描述 投票:0回答:8

我刚刚构建了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

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

但令我惊讶的是,当我尝试连接时,响应连接被拒绝。

请有人提供一些线索。

redis docker boot2docker dockerfile docker-compose
8个回答
55
投票

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

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

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

无论如何,在带有 Docker for Mac(不是旧的 Docker Toolbox)的 MacOS 上,以下内容应该足以帮助您入门:

➜  ~ 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

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
投票

您可以生成一个将 network_mode 设置为

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

0
投票

只需告诉 docker 哪个端口显式映射即可:

 docker run  --publish=6379:6379 redis

0
投票

确保您使用

127.0.0.1
而不是
localhost
连接到 Redis 或任何其他服务。在某些时候,Redis(和其他)连接到服务器的逻辑发生了变化。如果您使用
localhost
进行连接,则来自另一个答案:“MySQL 客户端[将]尝试使用 unix 套接字进行连接。”

© www.soinside.com 2019 - 2024. All rights reserved.