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 и запускает всё это хозяйство в реальном времени [embedded content]
Для начала надо получить образа 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! :)