пятница, 18 сентября 2015 г.

Consul & registrator — простой способ забыть про линковку контейнеров docker

Простое пошаговое руководство, как забыть про линковку контейнеров docker в рамках одного хоста, с минимальными объяснениями.

Будем использовать consul как базу данных имен наших контейнеров, и registrator в качестве агента.

Запускаем consul:
docker run -d --name=consul -p 8400:8400 -p 8500:8500 -p 53:53/udp -h node1 gliderlabs/docker-consul -server -bootstrap -ui-dir /ui

Он будет по порту 53 отвечать на наши запрос, по обычному dns, а по порту 8500 принимать от агента запросы на регистрацию - дерегистрацию сервисов.

Запускаем агент - register

 docker run  -d  --name=registrator  --net=host  --volume=/var/run/docker.sock:/tmp/docker.sock  gliderlabs/registrator:latest -internal consul://localhost:8500
 Он будет следить за всем запусками контейнеров docker на этом хосте, для этого мы маппим ему сокет докера  и регистрировать их в  consul.
Ключ -internal нужен как раз для такой работы в рамках одного хоста, когда он будет регистрировать внутренние докеровские ипы, бесполезные снаружи.

Далее, вписываю в resolv.conf на хосте днс интерфейс consul:

search service.consul
nameserver 172.17.42.1
Так как docker мапит resolv.conf внутрь новых контейнеров. оно туда попадет.

Если хотите ещё и строить контейнеры, наверное нужно будет добавить в /etc/default/docker опцию  DOCKER_OPTS="--dns=...

Или другой вариант: использовать --dns= опцию при docker run

Теперь мы готовы запускать контейнеры, например так:
docker run -d -e SERVICE_NAME=mysql2 korjavin/docker-mysql
 Через -e SERVICE_NAME мы передали имя контейнера для registrator.

Теперь, без всякой линковки этот контейнер доступен по имени mysql2 и внутри других контейнеров, и с хоста.

>  ping mysql2
PING mysql2.service.consul (172.17.0.16) 56(84) bytes of data.
64 bytes from 172.17.0.16: icmp_seq=1 ttl=64 time=0.077 ms

Я очень рад забыть про все эти --link=mysql:mysql2 и использовать человеческие имена не задумываясь о том кто там кому прилинкован.