Не удалось зарегистрировать службу Docker в регистраторе

У меня есть докер, docker-compose и Consul, установленные на моем локальном компьютере. Теперь я хочу зарегистрировать один из своих сервисов в Консуле с помощью Регистратора. Dockerfile моего сервиса так же прост, как:

FROM php:7.0-apache
COPY code/ /var/www/html/
ENV SERVICE_ID=php
ENV SERVICE_NAME=php-apache

Кроме того, у меня работает Консул. Я могу проверить это с помощью простых команд, таких как:

$ curl -X PUT 'Hello world ' 127.0.0.1:8500/v1/kv/msg1
$ curl 127.0.0.1:8500/v1/kv/msg1?raw
Hello world 

Затем я запускаю контейнер регистратора, следуя одному из руководств:

$ sudo docker run -d --name registrator-consul -v /var/run/docker.sock:/tmp/docker.sock \
-h jacobian-VirtualBox gliderlabs/registrator \
-ip 127.0.0.1 consul://127.0.0.1:8500

Когда я запускаю указанную выше команду, я получаю в консоли большой ключ:

a25a48 ... 3b69

Все выглядит хорошо, так как я не получаю сообщений об ошибках. Однако если я проверю

$ docker ps

Я не вижу активных изображений

Но в то же время, если я бегу

$ docker ps -a

Я вижу эту строку в самом верху:

CONTAINER ID    ...    STATUS

##somecode##    ...    Exited(1) 52 seconds ago

Это именно контейнер регистратора-консула и что мне не нравится, так это то, что он вышел. Я не делал этого сам, поэтому действительно странно, что он не в активном состоянии.

Я, наконец, создаю и запускаю свой контейнер php-apache:

$ docker build -t php-apache.
$ docker run -d --name php-apache -p 8181:80 php-apache

На данный момент все работает отлично. Я даже могу проверить, работает ли мой сервис. Итак, когда я захожу на localhost:8181, я вижу красивую страницу, отображаемую с помощью веб-сервера Apache. НО. Моя задача проверить, зарегистрирован он в Консуле или нет. Проверяю так:

$ curl jacobian-VirtualBox:8500/v1/catalog/services | jq '.'

Но в результате этой команды я вижу это в консоли:

{
    "consul": []
}

Таким образом, никакие услуги не были зарегистрированы. Мой вопрос: почему? Что я сделал не так и как это исправить? Спасибо!


person Jacobian    schedule 16.01.2017    source источник
comment
Для тех добрых людей, которые голосуют против. Пожалуйста, поделитесь своими мыслями по теме.   -  person Jacobian    schedule 16.01.2017
comment
Я неправильно понял некоторые вещи. Во-первых, как вы можете сделать curl запрос к контейнеру jacobian, если он вышел? Во-вторых, как я увидел, регистратор консула и ваш сервер apache не общаются друг с другом. Почему консул должен регистрировать ваш сервер apache?   -  person Cortwave    schedule 16.01.2017
comment
Вся проблема заключалась в том, как запускается контейнер-регистратор. Я удалил -ip 127.0.0.1 и добавил --net=host, и все заработало.   -  person Jacobian    schedule 16.01.2017
comment
@ Кортвейв. Что касается вашего первого вопроса, то ответ простой - не знаю. Он просто работает, как работает. Что касается вашего второго вопроса, я не знаю, почему вы считаете, что регистратору и серверу apache необходимо общаться друг с другом. Насколько я знаю, регистратор просто прослушивает все события докера через сокет (или как-то так) и производит регистрацию. Поэтому я не думаю, что между ними должна быть какая-то явная связь.   -  person Jacobian    schedule 16.01.2017


Ответы (1)


Вы запускаете свой регистратор с параметром -h. -h — просто имя хоста для вашего контейнера, а не хост, на котором он будет развернут. Также вы передаете регистратору 127.0.0.1 в качестве адреса вашего сервера Consul. 127.0.0.1 - это петлевой интерфейс для контейнера регистратора, а не для вашего хоста с запущенным сервером Consul. Если ваш сервер Consul работает на вашем хосте (если вы можете получить к нему доступ с помощью 127.0.0.1:8500), вам необходимо добавить параметр --net=host в ваш запуск регистратора.

P.S. Я не знаю реального адреса jacobian-VirtualBox хоста, который вы используете в curl запросе. В случае, если это не 127.0.0.1, он не будет работать, и вам нужно подключить свой контейнер регистратора к сервису Консул другим способом (подключиться к другой сети или указать другой адрес сервера Консул, если он доступен внутри контейнера регистратора.

person Cortwave    schedule 16.01.2017
comment
Спасибо! Но не могли бы вы посоветовать, как установить этот параметр --net=host через docker-compose.yml? Я задал вопрос, посвященный исключительно этому параметру, в этой теме - stackoverflow.com/questions/41681944/ . Итак, я тепло приветствую вас и надеюсь, что вы можете поделиться еще одним советом. Спасибо! - person Jacobian; 16.01.2017