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