【问题标题】:Error 99 connecting to localhost:6379. Cannot assign requested address连接到 localhost:6379 时出现错误 99。无法分配请求的地址
【发布时间】:2019-03-03 03:26:10
【问题描述】:

设置: 我有一个虚拟机并在虚拟机中运行三个容器(一个 nginx 代理、一个非常简约的烧瓶应用程序和 redis)。 Flask 应该在端口 5000 上服务,而 redis 在 6379 上。

这些容器中的每一个都可以作为独立服务正常运行,但也可以通过 docker compose 作为服务使用。

在flask应用程序中,我的目标是连接redis并查询一些键。

nginx容器暴露80端口、flask端口5000和redis端口6379。

在烧瓶应用程序中,我有一个尝试创建 redis 客户端的函数

db = redis.Redis(host='localhost', port=6379, decode_responses=True)

运行烧瓶应用程序我收到端口无法使用的错误

redis.exceptions.ConnectionError: Error 99 connecting to localhost:6379. Cannot assign requested address.

我不清楚是什么导致了这个问题,任何想法都将不胜感激。

【问题讨论】:

    标签: flask redis docker-compose


    【解决方案1】:

    在烧瓶应用程序中,我有一个尝试创建 redis 客户端的函数

    db = redis.Redis(host='localhost', port=6379, decode_responses=True)
    

    当您的烧瓶进程在容器中运行时,localhost 指的是容器本身的网络接口。它不会解析到您的 docker 主机的网络接口。

    所以需要将localhost替换为运行redis的容器的IP地址。

    在 docker-compose.yml 文件的上下文中,这很容易,因为 docker-compose 会使服务名称解析为正确的容器 IP 地址:

    version: "3"
    services:
      my_flask_service:
        image: ...
      my_redis_service:
        image: ...
    

    然后在你的烧瓶应用程序中,使用:

    db = redis.Redis(host='my_redis_service', port=6379, decode_responses=True)
    

    【讨论】:

    • 谢谢,这行得通。不是很明显,在 docker 环境中服务名称适用,是的应该注意到在给定的设置中 localhost 暗示容器本身而不是虚拟机。
    • 不错的一个。也帮助了我
    • 应用这些更改后,我得到了错误:ConnectionError: Error -2 connecting to lightquery-backend_redis-server_1:6379. Name or service not known. 我正在尝试从一个容器连接到 redis 的容器。 lightquery-backend_redis-server_1 是工人的,正如我看到的使用docker ps 并取名:a2f3928d5a27 redis:alpine "docker-entrypoint.s…" 20 hours ago Up 19 hours 0.0.0.0:6379->6379/tcp lightquery-backend_redis-server_1
    【解决方案2】:

    我遇到了同样的问题,除了我希望我的容器访问的服务是远程的并通过 ssh 隧道映射到我的 Docker 主机。换句话说,我的代码找不到docker-compose 服务。我通过明确告诉redis 以字符串形式查找我的本地主机来解决了这个问题:

    pyredis.Redis(host='docker.for.mac.localhost', port=6379)
    

    【讨论】:

    • 谢谢!此主机也适用于 Mac 上的 RedisInsights ui。
    • 您不认为通过进行此更改,我们会使其成为对 Mac 的硬依赖吗?如果我们想在 linux 机器上运行相同的代码,这是行不通的!
    • 只需将路径设置为环境变量或在运行时在 python 中发现操作系统即可解决此问题
    【解决方案3】:

    任何只使用 docker 来运行容器的人, 你可以在docker run --network=host之类的命令中添加--network=host,让docker在运行容器时使用宿主机的网络。

    您还可以通过将--network host 传递给docker service create 命令,将主机网络用于群服务。
    确保在执行此操作时不发布任何端口。喜欢-p 80:8000

    我不确定 Docker compose 是否支持这个。

    注意这仅在 linux 中受支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-19
      • 2021-12-17
      • 1970-01-01
      • 2020-03-13
      • 2011-03-12
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多