[英]Unable to connect with MQTT broker in Apache Camel inside docker container
I have a project with Apache camel, and it requires mqtt broker for connection.我有一个使用 Apache camel 的项目,它需要 mqtt 代理进行连接。 If I run mqtt broker (mosquitto) in docker and execute my project locally it is working totally fine but when I am running the project through Dockerfile ie making an executable jar and executing it on docker it says "Unable to connect to server (32103) - java.net.ConnectException: Connection refused (Connection refused)" even though mqtt broker is up and running.如果我在 docker 中运行 mqtt broker (mosquitto) 并在本地执行我的项目,它工作得很好,但是当我通过 Dockerfile 运行项目时,即制作一个可执行 jar 并在 docker 上执行它时,它说“无法连接到服务器 (32103) - java.net.ConnectException:连接被拒绝(连接被拒绝)” ,即使 mqtt 代理已启动并正在运行。
Full logs (exception):完整日志(例外):
[main] ERROR org.apache.camel.impl.engine.AbstractCamelContext - Error starting CamelContext (camel-1) due to exception thrown: Unable to connect to server (32103) - java.net.ConnectException: Connection refused (Connection refused)
org.apache.camel.RuntimeCamelException: Unable to connect to server (32103) - java.net.ConnectException: Connection refused (Connection refused)
at org.apache.camel.RuntimeCamelException.wrapRuntimeException(RuntimeCamelException.java:66)
at org.apache.camel.support.service.BaseService.doFail(BaseService.java:413)
at org.apache.camel.support.service.BaseService.fail(BaseService.java:342)
at org.apache.camel.support.service.BaseService.start(BaseService.java:132)
at org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:113)
at org.apache.camel.impl.engine.AbstractCamelContext.startService(AbstractCamelContext.java:3597)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRouteConsumers(InternalRouteStartupManager.java:401)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartRouteConsumers(InternalRouteStartupManager.java:319)
at org.apache.camel.impl.engine.InternalRouteStartupManager.safelyStartRouteServices(InternalRouteStartupManager.java:213)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRoutes(InternalRouteStartupManager.java:147)
at org.apache.camel.impl.engine.AbstractCamelContext.doStartCamel(AbstractCamelContext.java:3299)
at org.apache.camel.impl.engine.AbstractCamelContext.doStartContext(AbstractCamelContext.java:2951)
at org.apache.camel.impl.engine.AbstractCamelContext.doStart(AbstractCamelContext.java:2902)
at org.apache.camel.support.service.BaseService.start(BaseService.java:119)
at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2586)
at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:247)
at basyx.components.databridge.core.component.UpdaterComponent.startRoutes(UpdaterComponent.java:68)
at basyx.components.databridge.core.component.UpdaterComponent.startComponent(UpdaterComponent.java:62)
at basyx.components.databridge.executable.UpdaterExecutable.main(UpdaterExecutable.java:73)
Caused by: Unable to connect to server (32103) - java.net.ConnectException: Connection refused (Connection refused)
at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:80)
at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:724)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:74)
... 2 more
[main] INFO org.apache.camel.impl.engine.AbstractCamelContext - Apache Camel 3.14.0 (camel-1) shutting down (timeout:45s)
[main] INFO org.apache.camel.impl.engine.AbstractCamelContext - Routes stopped (total:2 stopped:2)
[main] INFO org.apache.camel.impl.engine.AbstractCamelContext - Stopped route2 (paho://PropertyB)
[main] INFO org.apache.camel.impl.engine.AbstractCamelContext - Stopped route1 (paho://Properties)
[main] INFO org.apache.camel.impl.engine.AbstractCamelContext - Apache Camel 3.14.0 (camel-1) shutdown in 14ms (uptime:238ms)
org.apache.camel.RuntimeCamelException: Unable to connect to server (32103) - java.net.ConnectException: Connection refused (Connection refused)
at org.apache.camel.RuntimeCamelException.wrapRuntimeException(RuntimeCamelException.java:66)
at org.apache.camel.support.service.BaseService.doFail(BaseService.java:413)
at org.apache.camel.support.service.BaseService.fail(BaseService.java:342)
at org.apache.camel.support.service.BaseService.start(BaseService.java:132)
at org.apache.camel.support.service.ServiceHelper.startService(ServiceHelper.java:113)
at org.apache.camel.impl.engine.AbstractCamelContext.startService(AbstractCamelContext.java:3597)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRouteConsumers(InternalRouteStartupManager.java:401)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartRouteConsumers(InternalRouteStartupManager.java:319)
at org.apache.camel.impl.engine.InternalRouteStartupManager.safelyStartRouteServices(InternalRouteStartupManager.java:213)
at org.apache.camel.impl.engine.InternalRouteStartupManager.doStartOrResumeRoutes(InternalRouteStartupManager.java:147)
at org.apache.camel.impl.engine.AbstractCamelContext.doStartCamel(AbstractCamelContext.java:3299)
at org.apache.camel.impl.engine.AbstractCamelContext.doStartContext(AbstractCamelContext.java:2951)
at org.apache.camel.impl.engine.AbstractCamelContext.doStart(AbstractCamelContext.java:2902)
at org.apache.camel.support.service.BaseService.start(BaseService.java:119)
at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2586)
at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:247)
at basyx.components.databridge.core.component.UpdaterComponent.startRoutes(UpdaterComponent.java:68)
at basyx.components.databridge.core.component.UpdaterComponent.startComponent(UpdaterComponent.java:62)
at basyx.components.databridge.executable.UpdaterExecutable.main(UpdaterExecutable.java:73)
Caused by: Unable to connect to server (32103) - java.net.ConnectException: Connection refused (Connection refused)
at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:80)
at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:724)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:74)
... 2 more
My docker compose file:我的码头工人撰写文件:
version: '3.8'
services:
bridge-service:
image: ${IMAGE_NAME}:${IMAGE_TAG}
container_name: ${CONTAINER_NAME}
volumes:
- C:\Users\user\temp:/usr/share/config
depends_on:
mqtt:
condition: service_healthy
mqtt:
image: eclipse-mosquitto:2.0.15
ports:
- 1884:1884
volumes:
- C:\Users\user\temp\mosquitto:/mosquitto/config
healthcheck:
test: ["CMD-SHELL", mosquitto_sub -p 1884 -t 'topic' -C 1 -E -i probe -W 3]
interval: 10s
retries: 2
start_period: 10s
timeout: 5s
I am sure that this is due to docker because even if I am running jar file locally it is working fine.我确信这是由于 docker 造成的,因为即使我在本地运行 jar 文件,它也能正常工作。
Please help if anyone has any clue.如果有人有任何线索,请提供帮助。
After searching over internet, I added network_mode: host
to service bridge-service and everything worked fine.通过互联网搜索后,我将network_mode: host
添加到 bridge-service 服务,一切正常。
So in order to communicate between two services like explained scenario in the problem above just add network_mode: host
and everything would work.因此,为了像上面问题中解释的场景那样在两个服务之间进行通信,只需添加network_mode: host
,一切都会正常进行。
Now the updated docker compose file is:现在更新的 docker compose 文件是:
version: '3.8'
services:
bridge-service:
image: ${IMAGE_NAME}:${IMAGE_TAG}
container_name: ${CONTAINER_NAME}
network_mode: host
volumes:
- C:\Users\user\temp:/usr/share/config
depends_on:
mqtt:
condition: service_healthy
mqtt:
image: eclipse-mosquitto:2.0.15
ports:
- 1884:1884
volumes:
- C:\Users\user\temp\mosquitto:/mosquitto/config
healthcheck:
test: ["CMD-SHELL", mosquitto_sub -p 1884 -t 'topic' -C 1 -E -i probe -W 3]
interval: 10s
retries: 2
start_period: 10s
timeout: 5s
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.