使用 springboot docker-compose 文件连接外部 MQTT docker 容器

问题描述

我有一个带有 MysqL 数据库的 Springboot 应用程序,现在我想连接到外部 MQTT 代理。

以下是我的配置:

docker-compose.yml

version: '3.5'

networks:
 foo:
  name: foo
  driver: bridge

services:
  app-server:
  build: .
  container_name: Player1
  ports:
    - "8080:8080"
  restart: always
  networks:
   - foo
  depends_on: 
   - mydb
external_links:
  - mosquitto:eclipse-mosquitto
environment:
  - SPRING_DATASOURCE_URL=jdbc:MysqL://mydb:3306/takeaway_db?serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true

mydb:
  image: MysqL
  ports:
    - "3306:3306"
  restart: always
  networks:
   - foo
  environment:
   - MysqL_ROOT_USER=root 
   - MysqL_ROOT_PASSWORD=P@ssword1234
  volumes:
   - /var/lib/MysqL

Dockerfile

FROM adoptopenjdk/openjdk11:alpine-jre
ARG JAR_FILE=target/spring-boot-web.jar
workdir /opt/app
copY target/*.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]

application.properties

mqtt.borker.url=tcp://172.18.0.2:1883 #container ip address from container inspect
mqtt.borker.username=username
mqtt.borker.password=password

启动 MQTT 代理的命令

docker run -it -p 1883:1883 --net foo --name mosquitto eclipse-mosquitto

当我运行 docker-compose up 时,出现以下错误

org.eclipse.paho.client.mqttv3.MqttException: Unable to connect to server
................
at java.base/java.lang.Thread.run(UnkNown Source) ~[na:na]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]

解决方法

基本上,这个解决方案背后的想法应该适用于将任何 docker-compose 容器与任何其他外部容器连接起来。

  1. 创建或添加现有容器到网络。

    docker network create foo 
    
    docker run -it -d -p 1883:1883 --net foo --name mosquitto eclipse-mosquitto
    
  2. 更新 docker compose 文件。

    一个。将网络 foo 添加到容器中。

    B.将撰写文件中的网络 foo 连接/暴露到外部网络 foo。

    c.将应用容器链接到外部容器。

     version: '3.5'
    
     services:
      app-server:
       build: .
       container_name: ...
       ports:
         - "8080:8080"
       restart: always
       networks:
         - foo               // =========> (a)
       depends_on: 
         - mydb
       external_links:
         - mosquitto:eclipse-mosquitto  //============> (c)
    
      mydb:
       image: mysql
       container_name: ...
       ports:
         - "3306:3306"
       restart: always
       networks:
         - foo              // =========> (a)
    
     networks:
        foo:
          external:
            name: foo // ========> (b)
    

可以在 here 找到完整的 docker 文件。

  1. 更新 application.properties 文件中的链接。

     spring.datasource.url=jdbc:mysql://mydb:3306/takeaway_db?createDatabaseIfNotExist=true
    
     mqtt.borker.url=tcp://mosquitto:1883