Docker в работе:
взгляд на
использование в
Badoo через год
Антон Турецкий
Вопросы: год назад,
а актуальны по сей день…
Docker: WTF?
Предыстория
Docker VS Puppet: Заменит ли Docker Puppet?
Предыстория
Virtualization VS Containerization:
Docker – еще одна виртуализация?
Предыстория
Docker: silver bullet?
THERE WILL BE NO SILVER BULLET.
RATHER IT WILL BE A COMBINATION
OF TECHNOLOGIES.
Andrew Gould(c)
Вопрос
Docker: нужен ли?
#1: о наболевшем
#1: Сервис -> Сервер
#1: Миграция Сервиса
#1: Миграция Docker
#1: Миграция Docker
#1: Отвязать Application от OS
ДЦ: подумай о железе!
#2: capacity planning
• + Место в стойке
#2: capacity planning
• + Место в стойке
• + Порты на сетевом оборудовании
#2: capacity planning
• + Место в стойке
• + Порты на сетевом оборудовании
• + Экономия электроэнергии
#2: capacity planning
• + Место в стойке
• + Порты на сетевом оборудовании
• + Экономия электроэнергии
• -/+ SPoF
#3: единое окружение
#4* $ cat ./Dockerfile
FROM dockerio.badoo.com/itops/sles_12_base:latest
COPY sle-12.puppet.repo /etc/zypp/repos.d/
RUN zypper -q -n in puppetdb
COPY database.ini /etc/puppetlabs/puppetdb/conf.d/database.ini
COPY jetty.ini /etc/puppetlabs/puppetdb/conf.d/jetty.ini
COPY ssl/ /etc/puppetlabs/puppetdb/ssl/
#Service start/stop
COPY run-puppetdb /etc/services.d/puppetserver/run
COPY finish-puppetdb /etc/services.d/puppetserver/finish
ENTRYPOINT ["/init"]
Грабли
Грабли: (r)?syslog(-ng)?
syslog into container
Грабли: (r)?syslog(-ng)?
syslog into container
• “One container – One Service”
Грабли: (r)?syslog(-ng)?
syslog into container
• “One container – One Service”
• Поддержка в работающем состоянии
Грабли: (r)?syslog(-ng)?
syslog into container
• “One container – One Service”
• Поддержка в работающем состоянии
• Нет времени объяснять – нужно сделать!
Грабли: (r)?syslog(-ng)?
syslog into container
• “One container – One Service”
• Поддержка в работающем состоянии
• Нет времени объяснять – нужно сделать!
Решение:
docker run -v /dev/log:/dev/log
Грабли: (r)?syslog(-ng)?
docker run -v /dev/log:/dev/log
• УРА!!! Всё работает, сообщения уходят!
Грабли: (r)?syslog(-ng)?
docker run -v /dev/log:/dev/log
• УРА!!! Всё работает, сообщения уходят!
• … до первого изменения/перезапуска
syslog на хост-системе…
Грабли: (r)?syslog(-ng)?
docker run -v /dev/log:/dev/log
• УРА!!! Всё работает, сообщения уходят!
• … до первого изменения/перезапуска
syslog на хост-системе…
Решение:
syslog into container
Грабли: mounts
Прокинуть “что-то” с хост ОС
Грабли: mounts
Прокинуть “что-то” с хост ОС
• /proc/mounts в контейнере
Грабли: mounts
Прокинуть “что-то” с хост ОС
• /proc/mounts в контейнере
• umount /dev/something (хост ОС)
Грабли: mounts
Прокинуть “что-то” с хост ОС
• /proc/mounts в контейнере
• umount /dev/something (хост ОС)
• umount /dev/something (container)
Грабли: mounts
Прокинуть “что-то” с хост ОС
• /proc/mounts в контейнере
• umount /dev/something (хост ОС)
• umount /dev/something (container)
• container restart …
Грабли: mounts
Решение:
• docker run --privileged
Грабли: mounts
Решение:
• docker run --privileged
• 100 раз подумать: так ли необходимо?
Грабли: mounts
Решение:
• docker run --privileged
• 100 раз подумать: так ли необходимо?
• избегать использование
“динамических точек монтирования”
Грабли: NAT
iptables, nf_conntrack
Грабли: NAT
Как можно решать:
• Увеличить таблицу conntrack
Грабли: NAT
Как можно решать:
• Увеличить таблицу conntrack
• Увеличить hashsize ~ conntrack / 8
Грабли: NAT
Как можно решать:
• Увеличить таблицу conntrack
• Увеличить hashsize ~ conntrack / 8
• Вспомнить про
conntrack_generic_timeout = 600
Грабли: NAT
Как можно решать:
• Увеличить таблицу conntrack
• Увеличить hashsize ~ conntrack / 8
• Вспомнить про
conntrack_generic_timeout = 600
• Ждать когда “бомбанёт”
Грабли: NAT
Решение:
• Делать свой bridge, Open vSwitch, Weave etc
Грабли: NAT
Решение:
• Делать свой bridge, Open vSwitch, Weave etc
• Использовать хост ОС
docker run --net=host
без использования conntrack
Грабли: Storage Driver
AuFS
Device Mapper (thinp)
BTRFS
и прочие
вкусности и сладости…
Грабли: BTRFS
• root of docker MUST be on a BTRFS
Грабли: BTRFS
• root of docker MUST be on a BTRFS
• Запись на диск сразу не идет, сначала – в журнал
(Performance ~ native / 2)
Грабли: BTRFS
• root of docker MUST be on a BTRFS
• Запись на диск сразу не идет, сначала – в журнал
(Performance ~ native / 2)
• “No space left on device”
# btrfs fi show /var/lib/docker
# btrfs fi balance start /var/lib/docker
Грабли: BTRFS
BTRFS – это то немногое,
что действительно нормально работает
Грабли: Storage Driver
Решение: OverlayFS
Грабли: Storage Driver
Решение: OverlayFS
• Hardlink на одинаковые файлы
Грабли: Storage Driver
Решение: OverlayFS
• Hardlink на одинаковые файлы
• Performance: RW ~ Native Speed
Грабли: Storage Driver
Решение: OverlayFS
• Hardlink на одинаковые файлы
• Performance: RW ~ Native Speed
• Space Usage – больше не загадка!
Грабли: Misc
• Больше ОДНОГО сервиса в контейнере
Грабли: Misc
• Больше ОДНОГО сервиса в контейнере
- свой ENTRYPOINT
Грабли: Misc
• Больше ОДНОГО сервиса в контейнере
- свой ENTRYPOINT
РЕШЕНИЕ: S6 http://skarnet.org/software/s6/
Грабли: Misc
• Больше ОДНОГО сервиса в контейнере
- свой ENTRYPOINT
РЕШЕНИЕ: S6 http://skarnet.org/software/s6/
• несколько FROM в одном Dockerfile
“FROM can appear multiple times within
a single Dockerfile"
Грабли: Misc
• Больше ОДНОГО сервиса в контейнере
- свой ENTRYPOINT
РЕШЕНИЕ: S6 http://skarnet.org/software/s6/
• несколько FROM в одном Dockerfile
“FROM can appear multiple times within
a single Dockerfile”
• docker exec Version < 1.8
Важный совет…
не забывать искать свою проблему тут:
Changelog
Issues
GitHub
Сервис в контейнере
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)
docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a'
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)
docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’
• “Требуется внимание оператора” => Jira Task
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)
docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’
• “Требуется внимание оператора” => Jira Task
• Обновление базового образа
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)
docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’
• “Требуется внимание оператора” => Jira Task
• Обновление базового образа(+контейнеры)
Docker Images
• Обновления (Bug fixes, Security fixes, Patches etc)
docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’
• “Требуется внимание оператора” => Jira Task
• Обновление базового образа(+контейнеры)
• Следить за “свежестью пакетов” перед выкладкой
сервиса/образа (RPM based)
docker_build
docker_build
• Сгенерировать структуру директорий, конфиги
docker_build
• Сгенерировать структуру директорий, конфиги
• Сгенерировать инструкцию(Dockerfile_source)
docker_build
• Сгенерировать структуру директорий, конфиги
• Сгенерировать инструкцию(Dockerfile_source)
• Доставить исполняемые файлы
docker_build
• Сгенерировать структуру директорий, конфиги
• Сгенерировать инструкцию(Dockerfile_source)
• Доставить исполняемые файлы
• Выполнить сборку
docker_build
• Сгенерировать структуру директорий, конфиги
• Сгенерировать инструкцию(Dockerfile_source)
• Доставить исполняемые файлы
• Выполнить сборку
• Отправить результат в Registry(y/n)
docker_build
• Сгенерировать структуру директорий, конфиги
• Сгенерировать инструкцию(Dockerfile_source)
• Доставить исполняемые файлы
• Выполнить сборку
• Отправить результат в Registry(y/n)
• Сообщить о результате
* Обязательно: работать в режиме cli
docker_build
Мониторинг
Мониторинг: контейнер
• Docker CLI внутри
Мониторинг: контейнер
• Docker CLI внутри
• Снимаем то же, что и docker stats: CPU/MEM
Мониторинг: контейнер
• Docker CLI внутри
• Снимаем то же, что и docker stats: CPU/MEM
• SAR:
$ sar -A -s %s 60 1 -f /var/log/sa/sa%s
Мониторинг: контейнер
• Docker CLI внутри
• Снимаем то же, что и docker stats: CPU/MEM
• SAR:
$ sar -A -s %s 60 1 -f /var/log/sa/sa%s
• Отсылаем всё в Graphite
Мониторинг: контейнер
• Docker CLI внутри
• Снимаем то же, что и docker stats: CPU/MEM
• SAR:
$ sar -A -s %s 60 1 -f /var/log/sa/sa%s
• Отсылаем всё в Graphite
• Мониторим контейнер и его статус Zabbix’ом
Grafana: Host, Mem
Grafana: Host, CPU
Grafana: Host, Net
Grafana: Container, Mem
Grafana: Container, CPU
baDocker: webUI
baDocker: Требования
• Clientless
baDocker: Требования
• Clientless
• Управление OpenRegistry (v1, v2)
baDocker: Требования
• Clientless
• Управление OpenRegistry (v1, v2)
• Информация о
- хостах
- контейнерах
- сервисах, версиях
baDocker: Требования
• Clientless
• Управление OpenRegistry (v1, v2)
• Информация о
- хостах
- контейнерах
- сервисах, версиях
• Планировщик заданий
baDocker: Требования
• Clientless
• Управление OpenRegistry (v1, v2)
• Информация о
- хостах
- контейнерах
- сервисах, версиях
• Планировщик заданий
• Dashboard
baDocker: Hosts Summary
baDocker: Host Details
baDocker: Terminal
baDocker: Service
baDocker: Service HowTo
Postmortem Заключение
• Искать свой подход – не наступать на наши грабли
Postmortem Заключение
• Искать свой подход – не наступать на наши грабли
• Велосипед – это отлично, если колеса круглые
Спасибо
Антон Турецкий
a.turetsky@corp.badoo.com
@tyrchenok
@BadooDev
http://habrahabr.ru/company/badoo/
Вопросы?

Docker в работе: взгляд на использование в Badoo через год