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, или укажете на названия всяких разных интересных приблуд для него. Ну или расскажете, что вам самим было интересно поковырять, может кого-нибудь тоже заинтересует?