Ответ 1
Существует некоторое недоразумение о том, что означает localhost
или 127.0.0.1
при запуске команды внутри контейнера. Поскольку каждый контейнер имеет свою собственную сеть, localhost
- это не ваша реальная хост-система, а сам контейнер. Поэтому, когда вы запускаете кибану и указываете переменную ELASTICSEARCH_URL
на localhost:9200
, процесс кибаны будет искать поиск elastics в контейнере kibana, который, конечно, не работает там.
Вы уже представили какую-то пользовательскую сеть, на которую вы ссылались при запуске контейнеров. Все контейнеры, работающие в одной сети, могут ссылаться друг на друга по имени на своих портах expose
d (см. Dockerfiles). Когда вы назвали свой контейнер elasticsearch elasticsearch_2_4
, вы можете ссылаться на конечную точку http elasticsearch как http://elasticsearch_2_4:9200
.
docker run -d --network mynetwork -e ELASTICSEARCH_URL=http://elasticsearch_2_4:9200 -p 5601:5601 kibana:4.6
Если вам не нужно напрямую обращаться к экземпляру elasticsearch, вы можете даже опустить сопоставление портов 9200 и 9300 с вашим хостом.
Вместо того, чтобы запускать все контейнеры самостоятельно, я также предложил бы использовать docker-compose
для управления всеми службами и параметрами. Вы также должны рассмотреть возможность установки локальной папки в качестве тома, чтобы сохранить данные. Это может быть ваш файл сочинения. Добавьте networks
, если вам нужна внешняя сеть, иначе эта настройка просто создает для вас сеть.
version: "2"
services:
elasticsearch:
image: elasticsearch:2.4
ports:
- "9200:9200"
volumes:
- ./esdata/:/usr/share/elasticsearch/data/
kibana:
image: kibana:4.6
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200