Соединение порта MQTT отклонено при развертывании контейнера Docker в Cloud Foundry - PullRequest
0 голосов
/ 02 июля 2019

Я создал образ докера, содержащий приложение C ++ с модулем MQTT & Mongodb. Когда я попытался развернуть его в своем облаке с помощью Cloud Foundry, появилась эта ошибка:

ERR Не удалось установить TCP-соединение с портом 1883: соединение отклонено

Учитывая, что 1883 - это порт прослушивания MQTT. На CloudFoundry Docker я обнаружил, что единственное, что мне нужно сделать, это включить EXPOSE 1883 в мой Dockerfile, что я уже сделал.
Может кто-нибудь объяснить, что я не рассмотрел до сих пор? спасибо за чтение.

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Цитирование оператора из github commit .

Вы открываете порты, используя ключевое слово EXPOSE в Dockerfile или --expose флаг docker run. Разоблачение портов - это способ документирование того, какие порты используются, но на самом деле не отображается или не открывается любые порты. Предоставление портов не является обязательным.

Если вы хотите получить доступ к MQTT через порт 1883, используйте -p параметр в вашей команде запуска докера.

В вашем случае

docker run -itd -p 1883:1883 mqtt-image-name

Надеюсь, это поможет.

Обновление:

Извините, что неправильно понял, я прошел официальный док.

EXPOSE должно сработать в вашем случае.

Полученная ошибка ERR Failed to make TCP connection to port 1883: connection refused означает, что что-то не так с вашим приложением или с облачным литейным цехом.

Ошибка может быть из-за того, что ваше приложение либо не становится доступным на порту 1883 из-за сбоя, или что это занимает больше времени, чем указанное время проверки работоспособности, чтобы оно заработало провал проверки здоровья.

Пожалуйста, проверьте это для получения дополнительной информации.

Надеюсь, это поможет.

0 голосов
/ 03 июля 2019

Вы правы здесь, но это только часть истории.

Я обнаружил на CloudFoundry Docker, что единственное, что мне нужно сделать, это включить EXPOSE 1883 в мой Dockerfile.

Когда ваш образ запускается Cloud Foundry, он ожидает, что ваше приложение будет прослушивать определенный порт.Обычно CF сообщает вашему приложению порт, на котором оно должно прослушиваться, через переменную $PORT env.С помощью Docker вы можете указать этот порт, добавив EXPOSE в ваш файл Docker и указав используемый порт.CF прочитает эту информацию и будет использовать указанный вами порт вместо того, чтобы выбирать один для использования.

Этого должно быть достаточно для запуска приложения, прослушивания согласованного порта и проверки Cloud Foundry для проверки работоспособности.проверьте к вашему заявлению.Другими словами, этого должно быть достаточно для успешного запуска приложения.Если ваше приложение не проходит проверку работоспособности, вам нужно подтвердить, что ваше приложение действительно запускается и прослушивает порт.Кроме того, как упоминалось в комментариях выше, убедитесь, что он не прослушивает localhost или 127.0.0.1.Они не доступны вне самого приложения, даже для проверки работоспособности.

Другая часть головоломки здесь - отображение внешнего трафика на ваше приложение.Порт, который ваше приложение прослушивает внутри контейнера, не отображается за пределами этого контейнера.Чтобы направить трафик в ваше приложение, вам необходимо сопоставить маршрут с вашим приложением.Типичные маршруты для CF основаны на HTTP, поэтому я не верю, что они будут работать для MQTT.Вам нужно было бы специально сопоставить маршрут TCP с вашим приложением.

Пример: cf map-route my-app example.com --port 5000

Для этого требуется открытый внешний порт TCP, который, вероятно, не будет 1883 (полностью зависит от того, что ваш провайдер делает доступным), и направляет трафик навнутренний порт, на котором слушает ваше приложение.Ваши клиенты, которые хотят подключиться к приложению на CF, должны подключиться к подключенному общему / внешнему порту.См. Диаграмму здесь для получения более подробной информации.

Надеюсь, это поможет!

0 голосов
/ 03 июля 2019

Я понял это! Cloud Foundry открывает только порт 8080 для связи с контейнером. На этом сайте FoundryDocker указано, что если я хочу использовать другой порт, я должен указать его через EXPOSE [порт]. Сначала я понял, что порт, который я хочу опубликовать, должен быть передан в аргумент EXPOSE (в моем случае это 1883); однако, казалось, что порт EXPOSE - это порт, который приложение будет прослушивать, например ... существует NAT, который перенаправляет мой порт с жестким кодом с 1883 на 8080 для внешней связи и наоборот. Я надеюсь, что кто-то может объяснить это более четко, сейчас все, что мне нужно сделать, это EXPOSE 8080 (вместо 1883), не имеет значения, какой порт мое приложение на самом деле слушает.

...