从 Docker 图像中连接到 Redis 服务器

Connect to Redis server from within a Docker image

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

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

现在,我可以从终端(使用 python rq 模块)将作业从 WU(在任何 docker 图像之外)排队到 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 模块(但不能从 docker 容器内)连接到从 WU 到 CU 的 redis 服务器。我必须为此设置一个 stunnel4.service(WU 上的 redis 客户端和 CU 上的 redis 服务器)。

最后我设法在 WU 上的 docker 容器中构建了一个 stunnel 服务。我现在可以简单地使用 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-撰写

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 服务中,因此我可以通过 python redis.

从那里连接到 stunnel-client 服务