使用Python连接Redis集群(Docker中)

2024-04-26 08:13:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在建立一个高可用的Redis集群(使用sentinel),需要用Python向其写入数据。但是,我不知道从Python连接时要使用哪个主机名,我还收到了“connectiondeclined”。在

我的Dockerfile:

FROM redis:latest
ADD sentinel.conf /etc/redis/sentinel.conf
RUN chown redis:redis /etc/redis/sentinel.conf
ENV SENTINEL_QUORUM 2
RUN mkdir app
WORKDIR /app
ENV SENTINEL_DOWN_AFTER 5000
ENV SENTINEL_FAILOVER 10000
ENV SENTINEL_PORT 26000
ADD entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 26379 6379

FROM python:2.7-slim
WORKDIR /app
COPY . /app
RUN pip install --trusted-host pypi.python.org -r requirements.txt
CMD ["python", "app.py"]

码头工人-合成.yml在

^{pr2}$

我尝试运行的Python代码:

r = redis.StrictRedis(host='0.0.0.0', port=6379, db=0)
print ("set key1 123")
print (r.set('key1', '123'))
print ("get key1")
print(r.get('key1'))

错误:

Traceback (most recent call last):
  File "app.py", line 7, in <module>
    print (r.set('key1', '123'))
  File "/usr/local/lib/python2.7/site-packages/redis/client.py", line 1519, in set
    return self.execute_command('SET', *pieces)
  File "/usr/local/lib/python2.7/site-packages/redis/client.py", line 836, in execute_command
    conn = self.connection or pool.get_connection(command_name, **options)
  File "/usr/local/lib/python2.7/site-packages/redis/connection.py", line 1071, in get_connection
    connection.connect()
  File "/usr/local/lib/python2.7/site-packages/redis/connection.py", line 543, in connect
    raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 111 connecting to 0.0.0.0:6379. Connection refused.

我尝试过将主机改为redis,redis master,实际的Docker IP,有些地方找不到,有些仍然拒绝连接。在

我建立了一个网络,但是哨兵们不能互相交流。在

我也尝试过用配置文件启动Redis master,但错误是找不到它。为此,我添加了WORKDIR和Dockerfile。在

如何从Python连接到Redis(也在Docker内部)?在

感谢您的时间,任何建议都将不胜感激。在


Tags: runinpyenvredisappusrlocal
1条回答
网友
1楼 · 发布于 2024-04-26 08:13:11

要从python连接到container中的同一个compose文件:

r = redis.StrictRedis(host='redis-master', port=6379, db=0)

所以您需要使用service名称

如果PythonContainer不是来自同一个compose file,则需要使用redis compose中的network连接它,并在python compose文件中将其声明为external

docker run为例:

^{pr2}$

compose为例:

networks:
  default:
    external:
      name: my-pre-existing-network-FromTheOtherCompose

相关问题 更多 >