Redis Docker 连接被拒绝
Redis Docker connection refused
我刚刚构建了 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。
但令我大吃一惊的是,当我尝试连接时,响应是连接被拒绝。
有人能给点启发吗?
我推荐你使用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
应该return:PONG
找到redis发现的端口并使用它来连接
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-server
您需要提供有关环境的更多信息(OS、Docker 安装等),但基本上,如果您像这样启动 Redis 容器:
docker run --name=redis-devel --publish=6379:6379 --hostname=redis --restart=on-failure --detach redis:latest
无论如何都应该公开端口。您可能无法连接到它的唯一原因是,如果您弄乱了网桥接口,如果您使用的是 Linux,或者您使用的 docker 机器有自己的网络接口和 IP 地址,而您没有连接到该 IP 地址。如果您将 Docker 用于 Mac,那么它只支持路由到本地主机地址,因为 Mac 主机上的桥接还不起作用。
无论如何,在 MacOS 上使用 Docker for Mac(不是旧的 Docker 工具箱),以下应该足以让您开始:
➜ ~ 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
➜ ~
看起来像是 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 客户端,该客户端应下载到您自己的计算机上。
如果您使用 Redis 6.2 configuration example 作为起点(就像我遇到这个问题时一样),bind 127.0.0.1
指令和 protected-mode yes
的组合不允许用于 Docker 容器之间的通信。出于我的目的,我注释掉了 bind
指令并将 protected-mode
指令设置为 no
—— 但请注意提供的关于不将 Redis 暴露在开放互联网中的警告。
我刚刚构建了 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。
但令我大吃一惊的是,当我尝试连接时,响应是连接被拒绝。
有人能给点启发吗?
我推荐你使用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
应该return:PONG
找到redis发现的端口并使用它来连接
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-server
您需要提供有关环境的更多信息(OS、Docker 安装等),但基本上,如果您像这样启动 Redis 容器:
docker run --name=redis-devel --publish=6379:6379 --hostname=redis --restart=on-failure --detach redis:latest
无论如何都应该公开端口。您可能无法连接到它的唯一原因是,如果您弄乱了网桥接口,如果您使用的是 Linux,或者您使用的 docker 机器有自己的网络接口和 IP 地址,而您没有连接到该 IP 地址。如果您将 Docker 用于 Mac,那么它只支持路由到本地主机地址,因为 Mac 主机上的桥接还不起作用。
无论如何,在 MacOS 上使用 Docker for Mac(不是旧的 Docker 工具箱),以下应该足以让您开始:
➜ ~ 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
➜ ~
看起来像是 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 客户端,该客户端应下载到您自己的计算机上。
如果您使用 Redis 6.2 configuration example 作为起点(就像我遇到这个问题时一样),bind 127.0.0.1
指令和 protected-mode yes
的组合不允许用于 Docker 容器之间的通信。出于我的目的,我注释掉了 bind
指令并将 protected-mode
指令设置为 no
—— 但请注意提供的关于不将 Redis 暴露在开放互联网中的警告。