从 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 "$@"
ACCEPT
和 CONNECT
值在环境文件中指定:
.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
服务
我有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 "$@"
ACCEPT
和 CONNECT
值在环境文件中指定:
.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
服务