...

воскресенье, 28 декабря 2014 г.

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

Не так давно начал изучать, что такое 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! :)

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий