Не так давно начал изучать, что такое 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 минут (это, конечно, зависит от скорости вашего подключения к великой и могучей сети).
Для начала надо получить образа 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 приведен в спойлере ниже.
$ 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! :)
Автор: icoz