java - 无法建立使用 SocketIO 的 Docker 容器之间的连接
问题描述
我有以下问题,感觉它应该可以工作,但不知何故没有。我已经尝试了许多在网上发布的解决方案,但它们似乎都不适用于我的情况,而且我不知道我做错了什么。
我有一个由三个容器组成的系统,我试图使用 docker-compose 将它们链接在一起:一个 mongoDB 容器和两个在 amazoncorretto 基础映像上运行的基于 Java 的服务器容器,我将其称为 alpha 和 beta。在我的机器上本地运行,效果很好。Alpha 通过端口 27017 连接到 Mongo,并向端口 4000 公开一个套接字,Beta 成功连接到该端口。
然而,当试图让它在 docker 中工作时,从 Beta 到 Alpha 的连接失败,即使 Alpha 暴露了 4000 端口。这是文件:
阿尔法码头文件:
FROM amazoncorretto:11
COPY image_files /image_files
WORKDIR /image_files
EXPOSE 4000
EXPOSE 52235
CMD ["java", "-jar", "alpha.jar"]
测试版泊坞窗文件:
FROM amazoncorretto:11
COPY image_files /image_files
WORKDIR /image_files
CMD ["java", "-jar", "beta.jar"]
码头工人-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://login:password@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
我还尝试了以下备用连接字符串,但均无效:
- http://host.docker.internal:4000
- 阿尔法:4000
- http://localhost:4000
- http://alpha:4000/
- http://company-alpha-container:4000/
我还尝试定义一个自定义网络并将我的所有服务放入其中,例如:
[...]
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 之外工作,但不在内部。一旦我将其更改为0.0.0.0
,Beta 就能够在 docker 内部和外部与 Alpha 正常连接。
这是我更改为调用 IOServer 的 Alpha 部分的内容:
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 配合使用。
我希望这个解决方案能帮助其他遇到同样问题的人。
推荐阅读
- javascript - 截取包含 iframe 的页面的屏幕截图
- python - 将 Anaconda Navigator 与 Miniconda 的 `conda` 一起使用
- mongodb - 使用 _id 查找不适用于聚合
- json - Magento 开发者编码问题 (Upwork)
- visual-studio-lightswitch - VSTS 中 LightSwitch 模型加载失败
- node.js - Express.js:用户只访问他们创建的数据
- python - 间谍?从文件资源管理器复制文件绝对或相对路径
- google-sheets - 如何创建过滤器以在列中的谷歌表中查找恰好 n 个单词的数据?
- java - 在 Java 类中调用 Kotlin 挂起函数
- php - cURL PHP 返回奇怪的字符串