设置: 我有一个虚拟机,并且在虚拟机中运行三个容器(一个Nginx代理,一个非常简单的Flask应用程序和Redis)。烧瓶应该在5000端口上使用,而Redis应该在6379上使用。
这些容器中的每个容器都可以正常运行并可以作为单独的服务使用,也可以通过docker compose 即服务来使用。
在flask应用程序中,我的目标是连接到Redis并查询一些密钥。
nginx容器暴露了端口80,flask端口5000和redis端口6379。
在flask应用程序中,我有一个尝试创建Redis客户端的功能
db = redis.Redis(host='localhost', port=6379, decode_responses=True)
运行flask应用程序时出现错误,提示该端口无法使用
redis.exceptions.ConnectionError: Error 99 connecting to localhost:6379. Cannot assign requested address.
我不清楚是什么原因导致了这个问题,任何想法都会受到赞赏。
答案 0 :(得分:4)
在flask应用程序中,我有一个尝试创建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)
答案 1 :(得分:0)
我有同样的问题,除了我希望我的容器访问的服务是远程的,并通过ssh隧道映射到我的Docker主机。换句话说,我的代码没有make test
服务。我通过明确告诉docker-compose
以字符串的形式查找本地主机来解决了这个问题:
redis