Использование имен сервисов докеров вне сети - PullRequest
0 голосов
/ 14 марта 2019

У моего приложения есть 2 зависимости, которые я указываю в моем docker-compose , сервисе postgres и kafka:

services:

  postgres:
    image: postgres:9.6-alpine
    ports:
      - "5432:5432"

  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"

Я запускаю свой код и тестирую вне сети докеров и использую эти два контейнера в качестве моих зависимостей.

Поскольку оба они предоставляют порты , я могу настроить свое приложение так, чтобы оно попадало по ним через: localhost: 5432, localhost: 9092. Это работает.

Проблема, с которой я столкнулся, заключается в том, что, когда я хочу протестировать само изображение приложения, я добавляю его в качестве службы в файл docker-compose:

  app:
      image: myapp
      links:
        - postgres
        - kafka

Приложение по-прежнему настроено на использование localhost, поэтому я разрешаю контейнеру приложения получить доступ к моей сети, используя - net = host

Хотя контейнер приложения теперь может обращаться к localhost: 5432 и localhost: 9092 (что подтверждается скручиванием изнутри контейнера), имена хостов не могут быть разрешены при выполнении кода и недоступности зависимостей - возможно, в результате использования localhost изнутри контейнера и путать клиентские библиотеки? Я действительно не уверен.

Такое ощущение, что использование localhost в конфигурации приложения не является правильным подходом. Можно ли ссылаться на названия служб 'postgres' и 'kafka' из вне сети докера?

1 Ответ

1 голос
/ 14 марта 2019

Почему вы хотите продолжать использовать localhost:xxx в своем приложении?

Лучший подход для вас - это изменить строки подключения в вашем приложении, когда оно запускается с docker-compose. Вы просто используете postgres:5432 и kafka:9092, и все будет работать, потому что в сети docker-compose все машины видны друг другу под их именами служб.

Если по каким-либо веским причинам вы настаиваете на использовании localhost в качестве цели подключения, вам необходимо перевести все службы в режим host. Но помните - в этом случае порты не отображаются , поэтому вы получаете доступ к службам с их исходными значениями порта.

version: '3'
services:
  postgres:
    image: postgres:9.6-alpine
    network_mode: "host"
  kafka:
    image: wurstmeister/kafka
    network_mode: "host"
  app:
    image: myapp
    network_mode: "host"

И, кстати, забудьте про ссылки . Они устарели.

...