habrahabr

Docker, SkyDNS и SkyDock — быстро и удобно

  • понедельник, 29 декабря 2014 г. в 02:11:36
http://habrahabr.ru/post/246933/

Не так давно начал изучать, что такое docker, который уже успел нашуметь по всему миру. Не буду вдаваться в философские изыски «а зачем оно надо?», или «фи, это просто очередной модный тренд!», или «кто же такой сырой продукт выпускает?». Я просто хочу дать краткие советы, как можно быстро в домашних условиях пощупать, что такое docker, используя такие блага и удобства как SkyDock и SkyDNS.
Данная заметка рассчитана на людей, у кого мало времени, чтобы читать горы статьей на английском (или не знают английского), но есть небольшие познания в том, что такое консоль и как установить docker самостоятельно.
Краткая суть статьи для ленивых
docker pull crosbymichael/skydns
docker pull crosbymichael/skydock
docker run -d -v /var/run/docker.sock:/docker.sock --name skydock crosbymichael/skydock -ttl 30 -environment dev -s /docker.sock -domain docker -name skydns
docker run -d -p 172.17.42.1:53:53/udp --name skydns crosbymichael/skydns -nameserver 8.8.8.8:53 -domain docker

Далее следует настройка роутера или правка /usr/lib/systemd/system/docker.service, но за такими подробностями придется всё же залезть под хабракат.


Что такое SkyDNS и SkyDock


SkyDNS позволяет поднять свой маленький DNS-сервер. SkyDock же в свою очередь, опираясь на данные, получаемые из недр docker'а путём общения через сокет-соединение с docker-демоном, управляет зонами в SkyDNS.
Связка SkyDNS+SkyDock позволяет не мучиться с поиском IP-адресов контейнеров, запущенных на вашем хосте. Фактически — это service discovery.
Таким образом можно запустить несколько контейнеров с mongodb и потренироваться собирать, скажем, реплику.
docker run -d --name repl1 mongo --smallfiles
docker run -d --name repl2 mongo --smallfiles
docker run -d --name repl3 mongo --smallfiles

В дебри настройки монги вдаваться не будем, а вот какие плюшки от SkyDock мы получаем:
— Возможность получить IP конкретного контейнера по имени repl2.mongo.dev.docker
— Возможность получить список IP всех контейнеров, запущенных на базе образа mongo, командой dig mongo.dev.docker
— Возможность получить список IP-адресов всех контейнеров данного хоста командой dig dev.docker

Установка


На всё про всё у нас должно уйти около 5 минут (это, конечно, зависит от скорости вашего подключения к великой и могучей сети).
Желающие могут посмотреть видео, где автор сам рассказывает про SkyDock и запускает всё это хозяйство в реальном времени
Для начала надо получить образа SkyDNS и SkyDock из реестра образов. Благо образа эти для нас подготовил добрый человек по имени Michael Crosby (его github-аккаунт, канал на YouTube и, естественно, его хаб в реестре docker).
docker pull crosbymichael/skydns
docker pull crosbymichael/skydock

После успешной закачки нам необходимо выполнить следующие команды:
docker run -d -p 172.17.42.1:53:53/udp --name skydns crosbymichael/skydns -nameserver 8.8.8.8:53 -domain docker

docker run -d -v /var/run/docker.sock:/docker.sock --name skydock crosbymichael/skydock -ttl 30 -environment dev -s /docker.sock -domain docker -name skydns

Первая запускает SkyDNS в контейнере с именем skydns и говорит ему человеческим голосом: «пробрось порт 53 на порт 53 хоста 172.17.42.1», «используй сервер 8.8.8.8, если не знаешь того имени, что с тебя просят» и «создай доменную зону с именем docker». Само собой доменная зона «docker» выбрана мной с потолка, здесь вы можете указать и ваш домен «example.com».
Вторая команда запускает SkyDock, также в контейнере:
— имя даётся skydock;
— внутрь контейнера пробрасывается сокет /var/run/docker.sock для связи с демоном docker (в зависимости от используемой Вами системы этот параметр, возможно, придётся поправить);
— задается 30 секундный TTL (насколько я понял, это частота обновления сведений в SkyDNS);
— окружению дается имя dev (в планах у автора допилить SkyDock для использования на нескольких хостах, таким образом можно будет отличать продакшен от разработки);
-s просто указывает путь к сокету для связи;
— имя домена docker;
— имя контейнера со SkyDNS — внезапно skydns!
Собственно установка закончена, SkyDNS и SkyDock уже работают.

Настройка сети


Итак, теперь нам необходимо как-то донести для всех желающих информацию о том, что у нас теперь есть свой собственный, маленький, теплый и ламповый (нужное подчеркнуть) DNS-сервис.
Здесь есть несколько вариантов.
Для того, чтобы контейнеры могли узнать друг про друга живя на одном хосте, достаточно в команде запуска демона docker указать параметр --dns. Пример для юнита systemd приведен в спойлере ниже.
доработанный systemd-unit docker.service
$ cat /usr/lib/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
ExecStart=/usr/bin/docker -d --bip=172.17.42.1/16 --dns=172.17.42.1 -H fd://
LimitNOFILE=1048576
LimitNPROC=1048576

[Install]
WantedBy=multi-user.target


У меня же ситуация такова, что дома есть локалка с маленьким сервачком, где крутятся контейнеры, а работаю я на ноутбуке. Значит надо сделать так, чтобы ноут знал про новый dns-сервер и использовал его первым.
Для этого я на роутере:
— настроил дополнительное правило маршрутизации, которое направляет весь трафик, приходящий к нему с адресами назначения 172.0.0.0/8, на мой сервачок;
— в настройках DHCP первым в задал адрес 172.17.42.1, а затем уже dns-сервис провайдера.
И вуаля! Всё работает в лучшем виде!

плюшка
$ docker logs skydns 2>&1 | grep 'Received DNS' | awk -F\" '{print $2}' | sort | uniq

С помощью этой команды можно посмотреть какими доменными именами интересовались устройства из вашей локалки.
Сразу в глаза бросается обилие рекламных доменов, которыми интересуются мобильники, например…

А что делать, если надо перезагрузиться?


Для перезагрузки хоста достаточно сделать:
    docker stop skydock
    docker stop skydns

Собственно сама перезагрузка, а затем:
    docker start skydns
    docker start skydock

Красота!
На сим желаю Вам приятного времяпрепровождения с docker! :)

UPD. Кстати, буду очень благодарен, если вы оставите в комментариях свои лайфхаки по пользованию docker, или укажете на названия всяких разных интересных приблуд для него. Ну или расскажете, что вам самим было интересно поковырять, может кого-нибудь тоже заинтересует?