Есть несколько способов сделать это.Но прежде чем мы рассмотрим это, в вашем подходе есть две проблемы, которые необходимо понять.
zookeper
хост недоступен, когда вы используете docker run
, так как каждый из контейнеров работает в разныхсетевая изоляция kafka
может запуститься и попытаться подключиться к zookeeper
, но zookeeper
еще не готов
Решение проблемы с сетью
Вы можетесделать много вещей, чтобы исправить вещи
использовать --net=host
для запуска обоих в сети хоста
использовать docker network create <name>
, а затем использовать --net=<name>
при запуске обоих контейнеров
Или вы можете запустить свой контейнер kafka в сети контейнеров zookeeper
.
использовать --net=container:zookeeper
при запуске контейнера kafka
.Это обеспечит доступ к хосту zookeeper
.Это не рекомендуется как таковое до тех пор, пока у вас нет веской причины для этого.Потому что, как только контейнер zookeeper
выйдет из строя, будет существовать и сеть вашего kafka
контейнера.Но для понимания я поставил эту опцию здесь
Решение проблемы стартовой гонки
Либо вы можете оставить разрыв между стартовыми zookeeper
и kafka
, чтобы убедиться, чтокогда kafka
запускается, zookeeper
работает и работает
Другой вариант - использовать флаг --restart=on-failure
при запуске докера.Это обеспечит перезапуск контейнера в случае сбоя и попытается повторно подключиться к zookeeper
, и, надеюсь, время zookeeper
истечет.
Вместо использования docker run
я всегда предпочел бы docker-compose
чтобы получить такие связанные контейнеры для запуска.Это можно сделать, создав простой файл docker-compose.yml
и запустив его с docker-compsoe up
version: "3.4"
services:
zookeeper:
image: confluent/zookeeper
environment:
- ZOOKEEPER_CLIENT_PORT=2181
kafka:
image: confluent/kafka
environment:
- KAFKA_ADVERTISED_HOST_NAME=kafka
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_CREATE_TOPICS=testtopic:1:1
depends_on:
- zookeeper
restart: on-failure