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! :)

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.