gpt4 book ai didi

java - 使用 SocketIO 的 Docker 容器之间无法建立连接

转载 作者:行者123 更新时间:2023-12-01 16:46:20 32 4
gpt4 key购买 nike

我遇到了以下问题,感觉它应该可以工作,但不知怎的却不起作用。我尝试了网上发布的许多解决方案,但似乎没有一个适合我的情况,而且我不知道我做错了什么。

我有一个由三个容器组成的系统,我试图使用 docker-compose 将它们链接在一起:一个 mongoDB 容器,以及两个在 amazoncorretto 基础镜像上运行的基于 java 的服务器容器,我将其称为 alpha 和 beta。在我的机器上本地运行,效果很好。 Alpha 通过端口 27017 连接到 Mongo,并向端口 4000 公开套接字,Beta 成功连接到该端口。

然而,当尝试让它在 docker 中工作时,从 Beta 到 Alpha 的连接失败,即使 Alpha 暴露了端口 4000。这是文件:

Alpha dockerfile:

FROM amazoncorretto:11
COPY image_files /image_files
WORKDIR /image_files
EXPOSE 4000
EXPOSE 52235
CMD ["java", "-jar", "alpha.jar"]

测试版 Dockerfile:

FROM amazoncorretto:11
COPY image_files /image_files
WORKDIR /image_files
CMD ["java", "-jar", "beta.jar"]

docker-compose.yml:

version: "3"
services:
mongodb:
image: mongo:4.0.4
container_name: "company-alpha-database"
environment:
- MONGO_INITDB_DATABASE=test_database
- MONGO_INITDB_ROOT_USERNAME=company
- MONGO_INITDB_ROOT_PASSWORD=pizzaismagic
volumes:
- mongo_database_volume:/data/db
ports:
- "27017-27019:27017-27019"

alpha:
image: company-alpha
container_name: "company-alpha-container"
ports:
- "4000:4000"
- "52235:52235"
depends_on:
- mongodb

beta:
image: company-beta
container_name: "company-beta-container"
depends_on:
- alpha

volumes:
mongo_database_volume:

至于 Beta 用于连接 Alpha 的连接字符串,在本地运行时,可使用以下连接字符串:

我知道在 docker 环境中这需要有所不同,并且理论上我知道如何实现这一点。例如,我使用以下连接字符串让 Alpha 成功连接到 Mongo:

  • mongodb://登录名:密码@mongodb:27017/

按照这个逻辑,我假设 Docker 上下文中 Beta 到 Alpha 的正确连接字符串是:

但是,这不起作用。运行 docker-compose up 时,我得到以下输出:

company-alpha-container | 2020-05-13 06:47:21 [SocketIOServer:128] [INFO]  Session store / pubsub factory used: MemoryStoreFactory (local session store only)
company-alpha-container | 2020-05-13 06:47:21 [A:?] [DEBUG] Server started on port: 4000
company-alpha-container | 2020-05-13 06:47:21 [SocketIOServer:153] [INFO] SocketIO server started at port: 4000
company-beta-container | 2020-05-13 06:47:21 [G:?] [DEBUG] Trying to reconnect to: http://alpha:4000/
company-beta-container | 2020-05-13 06:47:21 [G:?] [DEBUG] Will try to reconnect again in 1000ms
company-beta-container | 2020-05-13 06:47:22 [G:?] [DEBUG] Trying to reconnect to: http://alpha:4000/
company-beta-container | 2020-05-13 06:47:22 [G:?] [DEBUG] Will try to reconnect again in 1000ms

我还尝试了以下备用连接字符串,但没有一个起作用:

我还尝试定义一个自定义网络并将我的所有服务放入其中,如下所示:

[...]
alpha:
image: company-alpha
container_name: "company-alpha-container"
ports:
- "4000:4000"
- "52235:52235"
depends_on:
- mongodb
networks:
- project-net

beta:
image: company-beta
container_name: "company-beta-container"
depends_on:
- alpha
networks:
- project-net

[...]

networks:
project-net:
driver: "bridge"

...但这也不起作用。

我还尝试为 Beta 提供一个到 Alpha 的链接,因为我完全知道链接已被弃用,但这也不起作用。

坦白说,此时我已经没有想法了。根据我对 docker 的了解以及我在网上找到的每个答案,这应该可以工作......但显然它不行。

任何关于我如何解决这个问题或为什么这不起作用的想法将不胜感激。

最佳答案

经过多次反复思考,我终于找出了这种行为的原因。

该问题与 docker 配置完全无关(或者更确切地说,它无法通过 docker 配置解决)。相反,SocketIO 服务器的主机名是 localhost,它在 docker 外部工作,但在 docker 内部不起作用。当我将其更改为 0.0.0.0 后,Beta 就能够在 docker 内部和外部与 Alpha 正常连接。

以下是我对 Alpha 调用 IOServer 部分所做的更改:

    private static final String ALPHA_HOSTNAME = "0.0.0.0";

[...]

Configuration config = new Configuration();
config.setHostname(ALPHA_HOSTNAME );
[...]
server = new SocketIOServer(config);

这样,它就可以与我一开始发布的 docker-compose.yml 和 dockerfiles 一起正常工作。

我希望这个解决方案能够帮助其他遇到同样问题的人。

关于java - 使用 SocketIO 的 Docker 容器之间无法建立连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61768188/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com