На основе руководства @ cricket_007 Слушатели Кафки - Объясненные и много прочитанного мной и здесь по этой проблеме, включая официальную документацию по докеру Я хочу подключиться из контейнера к серверуна хосте
я придумал следующее решение.
Я добавил следующее в свою локальную конфигурацию kafka по умолчанию (т.е. server.properties)
listeners=EXTERNAL://0.0.0.0:19092,INTERNAL://0.0.0.0:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
advertised.listeners=INTERNAL://127.0.0.1:9092,EXTERNAL://docker.for.mac.localhost:19092
inter.broker.listener.name=INTERNAL
Фактически здесь External, ожидается будет докерская сеть .Эта конфигурация только для моей машины OSX для моей локальной цели разработки.Я не ожидаю, что люди, подключающиеся к моему ноутбуку, будут использовать мою локальную кафку, поэтому я могу использовать EXTERNAL://docker.for.mac.localhost:19092.
Это то, что объявляется для моего контейнера в докере / кубе.Внутри этой сети доступен docker.for.mac.localhost.
Обратите внимание, что это, вероятно, не будет работать с Minikube.Это относится к Docker для Mac.Kubernetes, которые я запускаю на своей машине, идет с Docker для Mac, а не minikube.
Наконец, в моем коде я использую оба в списке
"localhost:9092, docker.for.mac.localhost:19092"
, который я используюКонфигурация typeSafe, так что в prod это стирается переменной env.Когда переменная env не указана, это то, что используется.Когда я запускаю мой микро-сервис от Intellij localhost:9092
используется.Это потому, что в этом случае я нахожусь в той же сети, что и мой kafka / zookeeper на моей машине.Однако, когда я запускаю тот же микросервис из docker / kube, используется docker.for.mac.localhost:19092
.
Ответы на дополнительные вопросы, которые у меня были
Да.Docker для Mac использует HyperKit в качестве облегченной виртуальной машины, на которой работает linux, и на ней запускается Docker Engine .Расширение Docker для MAC Kubernetes в основном предназначено для запуска служб / инфраструктуры кластера kubernetes в качестве контейнеров в демоне docker. Docker для Mac против Docker Toolbox .Другими словами, хост - это гиперкит, а не ос.Но, как объясняет вышеупомянутый документ, реализация Docker для Mac заключается в том, чтобы сделать его похожим на пользователя, как если бы между OSX и Docker не было никакой виртуализации.
Подключение к хосту с использованием петлевого адреса - это проблема, которая не была решена. Я даже не уверен, что она отлично работает, даже если хост - Linux.Не уверен, возможно, был решен в этот момент.Тем не менее, потребуется запустить образ, указав, что контейнер или модуль в случае kube находятся в сети хоста.Но в Docker для Mac эта функция никогда не будет работать, основываясь на моих чтениях в Интернете.Следовательно, решение использовать docker.for.mac.localhost или host.docker.internal , которое Docker для Mac настроил для ссылки на хост Mac, а не на хост HyperKit.
host.docker.internal и docker.for.mac.localhost являются одними и теми же, и поздняя рекомендация на данный моментhost.docker.internal.При этом этот адрес изначально не работал для меня, потому что моя установка Kafka не была хорошей.Стоит прочесть ссылку @ criket_007, чтобы хорошо это понять http://rmoff.net/2018/08/02/kafka-listeners-explained.