从Docker映像连接到Redis服务器

时间:2020-06-21 00:19:44

标签: docker redis docker-compose stunnel

我有2个主机,一个Web单元(WU)和一个计算单元(CU)。在WU上,我有我的网站。在CU上,我有一个Redis服务器和一个进行某些计算的(C ++)应用程序。

用户在网站中输入输入数据,然后我想将工作从WU入队到CU上的Redis服务器。然后,我在CU上有一个工人来执行任务。

现在,我能够将WU(在任何docker映像之外)的作业从终端(使用python rq模块)排队到CU。但是,我的网站在docker映像中,无法正常工作。从Docker映像中,我尝试连接到172.17.0.1:6370(172.17.0.1是映像与Docker主机之间的网关的IP)。我得到的错误是连接被拒绝。然后我想可能必须在我的docker-compose文件中映射端口:6739:6739。但是,然后我收到一条错误消息,指出该端口已被使用。确实,它由stunnel4服务使用,它使我能够将作业从WU排队到CU上的redis服务器。

我应该在docker映像中运行stunnel4服务吗?如果是这样,我该怎么做?还是应该以其他方式解决我的问题?

网络结构

WU和CU是2(虚拟)计算机。我的redis服务器在CU上,不是在docker容器中。我可以通过python redis模块从WU到CU连接到Redis服务器(但不能从docker容器中)。为此,我必须设置一个stunnel4.service(WU上的redis-client和CU上的redis-server)。

1 个答案:

答案 0 :(得分:0)

最后,我设法在WU的docker容器中构建了一个tunnel服务。现在,我可以简单地用python redis连接到该隧道服务,并且隧道的末端指向CU。

这是我在WU上所做的:

Dockerfile

FROM alpine:3.12
RUN apk add --no-cache stunnel
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
COPY ./ca_file.crt /etc/stunnel/ca_file.crt
ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

#!/bin/sh
cd /etc/stunnel

cat > stunnel.conf <<_EOF_

foreground = yes

[stunnel-client]
client = yes
accept = ${ACCEPT}
connect = ${CONNECT}
CAfile = ca_file.crt
verify = 4

_EOF_

exec stunnel "$@"

在环境文件中指定了ACCEPTCONNECT值:

.env.stunnel

ACCEPT=6379
CONNECT=10.110.0.3:6379

其中10.110.0.3是我的Redis主机的IP地址。

docker-compose

stunnel-client:
    container_name: stunnel-client
    build:
      context: ./stunnel
      dockerfile: Dockerfile
    restart: always
    volumes:
      - stunnel_volume:/etc/stunnel
    env_file:
      - ./.env.stunnel
    networks:
      - stunnel-net
    ports:
      - "6379:6379"

stunnel-net也在我的web服务中,因此我可以通过stunnel-client从那里连接到python redis服务。