1. DOCKER 1.9
Ваши приложения в удобной упаковке
Золотов Дмитрий,
ведущий инженер
dzolotov@herzen.spb.ru
Управление информатизации РГПУ им. А.И. Герцена
Санкт-Петербург
2015
2. Своя уютная бухта для каждой
программы (в одном океане)
“Cиний кит проявляет
склонность к одиночеству
в большей степени,
чем все остальные
китообразные”
[Wikipedia]
3. Как использовать?
Тысячи готовых к работе программ (вместе со средой выполнения)
Возможность упаковки своих приложений и запуска на любом узле
Linux (а также Windows и MacOS)
Создание кластеров из десятков-сотен-тысяч узлов с
распределёнными приложениями (в т.ч. на микросервисах)
4. Лучше один раз увидеть
docker run -d -p 10000:80
docker.hspu.local:80/2048
http://10.0.16.201:10000
7. Виртуальная машина (управление через
vagrant)
Vagrant.configure("machine") do |config|
config.vm.box = "trusty64"
config.vm.hostname = "machine.test"
config.vm.network :private_network, ip: "192.168.0.42"
config.vm.provider :virtualbox do |vb|
vb.customize [
"modifyvm", :id,
"--cpuexecutioncap", "50",
"--memory", "256",
]
end
end
8. Виртуальная машина
Запускается долго…
Создаёт абстракцию уровня оборудования…
Большая по размеру (т.к. полностью содержит операционную систему)...
Требует много ресурсов для выполнения...
9. Контейнеры
...запускаются за доли секунды
...маленькие по размеру (содержат только минимальный набор
необходимых библиотек и само приложение)
...почти нет потерь в ресурсах (работают на реальном оборудовании и на
одном ядре, но хорошо изолированы один от другого)
12. Open Container Initiative
Единый формат контейнеров - OCF
Автономная, независимая от поставщика, реализация среды выполнения
контейнеров - проект runC (создаётся также порт для Windows)
13. Как использовать в домашних условиях
/ на рабочем месте?
Если Linux - всё просто - установить Docker Engine и Docker Client (единый пакет,
есть под все основные дистрибутивы)
Если Windows и MacOS - рекомендуется использовать Docker Toolbox,
включающий:
docker-machine
docker-engine
docker-compose
Kitematic, Docker GUI
15. Что изолируется?
PID namespace (могут повторяться номера процессов, первый всегда имеет
номер 1)
IPC namespace - именованные объекты межпроцессного взаимодействия
mnt namespace - файловая система
net namespace - сеть
uts namespace - версия и параметры ядра
user namespace - изоляция пользователей (в т.ч. администратора)
16. Как видит контейнер внешний мир?
● своя файловая система
● собственный сетевой
интерфейс (и localhost)
● ядро представляется
собственным
● межпроцессное
взаимодействие в своём
адресном пространстве
● первый процесс в системе
с идентификатором 1
17. Какой он на самом деле?
Внешний мир ->
контейнер
Контейнер->внешний
мир
Доступ в сеть Только EXPOSE Внешняя сеть
доступна,
контейнеры
общаются внутри
хоста
Файловая система Только VOLUME -
Управление
процессами
Просмотр состояния,
top
Изолированное PID
namespace, хост-узел
недоступен
18. Управление ресурсами
При запуске контейнера можно указать ограничения
--cpu-shares - доля процессорного времени (1024 - max)
--oom-kill-disable = true - запрет out-of-memory-killer
--cpu-period, --cpu-quota - управление CFS-квотами
--cpuset-cpus - ядра процессора для использования
--blkio-weight - ограничение (от 10 до 1000) на использование ввода/вывода, по
умолчанию 500
--memory, --memory-swap - ограничение по памяти (обычная и с подкачкой)
19. Надёжность и безопасность
--restart - политика перезапуска контейнера (no / on-failure:<max> / always)
--rm=true - очищать изменения в контейнере и восстанавливать исходный
образ после перезапуска
--security-opt - использует возможности ОС контейнера (security policy: user
/ role / type / level или apparmor) для применения ограничений на
взаимодействие с внешним миром, запуск приложений и выполнение
изменений
20. Хитрости
--pid=”host” - позволяет использовать разделяемое пространство
идентификаторов процессов для нескольких контейнеров (общее с хост-
машиной)
--uts=”host” - единое пространство именования узлов с хост-машиной
--ipc=”container:id | host” - создание единого пространства именования
объектов межпроцессного взаимодействия (с узлом или другим
контейнером)
--net=”host” - использование сетевого стека хост-машины
21. Связь с внешним миром
--volume - связывание каталога хост-машины с каталогом контейнера
--volumes-from - связывание контейнеров через общее хранилище
--add-host - создание записи в /etc/hosts (связывание с узлом)
--dns - использование указанных DNS-серверов (вместо 8.8.8.8)
--link - связывание с другим контейнером через сеть (создаёт запись в
/etc/hosts, общаются через подсеть внутри docker)
--publish - связывание tcp/udp-портов из приложения с портами хост-машины
23. Связывание контейнеров через сеть
Допустим, есть два контейнера с именами: web2 и db. Чтобы создать связь,
нужно удалить контейнер web и пересоздать его с использованием команды:
docker run --rm --name web2 --link db:db training/webapp env
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5
DB_PORT_5432_TCP=tcp://172.17.0.5:5432
DB_PORT_5432_TCP_PROTO=tcp
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_ADDR=172.17.0.5
24.
25. Дополнительные возможности
--device - связывание устройств хост-машины с контейнером (например,
подключение USB-дисков)
--cap-add, --cap-drop - управление разрешениями Linux-ядра (например,
SYS_ADMIN - для монтирования сетевых дисков)
--privileged=true - доступ ко всем функциям ядра (в т.ч. запуск docker внутри
docker)
--lxc-conf - параметры в lxc (например, lxc.mount для монтирования сетевых
устройств, lxc.utsname - изменения имени узла)
26. Требования к хост-машине
Ядро Linux не менее 3.15 с поддержкой слоевой файловой системы
(например, AUFS или BTRFS) и cgroups.
Поддержка аппаратной виртуализации не требуется, поскольку
контейнер работает в основном ядре.
27. Новое в Docker 1.8 (и 1.9)
Переадресация и ротация журналов
--log-driver=json - по умолчанию (новое: --log-opt [maxsize=#] [maxfile=#]
для ротации)
--log-driver=syslog - отправка журналов в syslog-накопитель (--log-opt
syslog-address=udp://ip:514 syslog-tag=<метка> syslog-
facility=<уровень>)
--log-driver=fluentd - отправка в fluentd-агрегатор (--log-opt fluentd-
address=ip:24224 fluentd-tag=<метка>)
28. Новое в Docker 1.8 (и 1.9)
Плагины для сетевого взаимодействия - создают прозрачную сеть
между контейнерами (с использованием libnetwork). Драйверы:
simplebridge - сеть внутри хоста
overlay - распределённая сеть между хостами (встроенная)
weave - распределённая сеть на L2 (Weave)
29. Новые команды Docker 1.9
docker network create --driver=... net1 - создать сеть
docker run [--publish-service=service1.net1] [--net=net1] … - зарегистрировать
контейнер, как сервис в сети
docker network plug net1 <container> - подключить контейнер к сети
Для драйвера overlay необходимо внешнее key-value хранилище (например, consul)
и конфигурация запуска docker, например
docker -d --kv-store=consul:10.0.16.204:8500 --label=com.docker.network.driver.overlay.bind_interface=eth0
30. Плагины для доступа к системам хранения:
docker run --volume-driver=<название>
Например,
flocker, glusterfs - перемещаемые между узлами хранилища
nfs - хранилище доступно через nfs
rexray - хранение в облачных сервисах (Amazon S3, …)
Новое в Docker 1.8 (и 1.9)
32. FROM ubuntu:latest
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["x11vnc", "-forever", "-usepw", "-create"]
Dockerfile
33. Графические приложения в docker-
контейнерах (для тонких клиентов)
ubuntu + application + ssh-server
docker run -p 1000:22 -d …
ssh -X -p 1000 <ip>
графические приложения запускаются с сервера на рабочей станции
34. Жизненный цикл контейнера
Без сохранения образов в хранилище:
create | pull | build → <изменения> → [diff] → commit
С сохранением образов:
create | pull | build → tag → push
С переносом образа архивом:
save → … → load
С переносом контейнера архивом:
create | pull | build → export (создаёт tar) → import
35. Просмотр состояния контейнеров
docker images - список загруженных (или собранных или
отправленных) образов
docker ps - список активных контейнеров
docker logs <id> - просмотр консоли контейнера (только для log-
driver=json)
docker top <id> - активные процессы в контейнере
docker port <id> - просмотр отображенных портов
36. Управление контейнерами
Создание из образа: docker create [--name название] <образ>
Сборка по Dockerfile: docker build [-t <образ>] <путь>
Запуск: docker run [--publish …] [--volume …] [--env …] <образ>
Приостановка/возобновление: docker pause <id> / docker unpause <id>
Остановка/запуск/перезапуск: docker stop <id> / docker start <id> /
docker restart <id>
37. FROM - базовый образ
MAINTAINER - контакты ответственного за образ
RUN - запуск команды в контейнере (при сборке)
ADD, COPY - копирование файлов в контейнер (ADD также может
распаковывать .tar.gz)
ENV - определение значения переменной системного окружения по
умолчанию
Инструкции Dockerfile
38. Инструкции Dockerfile
VOLUME - анонс возможного связывания с каталогом или
файлом
ENTRYPOINT - приложение для запуска при входе в контейнер
WORKDIR - изменение текущего каталога в контейнере
CMD - параметры приложения (могут быть переопределены в
RUN)
39. Что, если надо запустить несколько
связанных приложений?
Например, запустить фоновый php процесс и приложение, которое его
использует, а также перехват вывода и отправка в syslog.
Можно использовать supervisord: конфигурация в одном файле, по
семантике похожа на systemd.
40. Взгляд администратора
Необходимо решить несколько проблем:
координированный запуск нескольких контейнеров
регистрация сервисов и возможность их обнаружения
мониторинг состояния контейнеров (как снаружи, так и внутри)
развертывание новых узлов по набору правил и включение в состав
кластера
41. Координированный запуск нескольких
контейнеров
В случае отсутствия циклических зависимостей - регистрация
контейнеров (в /etc/docker) и их запуск средствами docker daemon
(для создания можно использовать, например, puppet)
Docker compose (декларация набора контейнеров вместе с
параметрами и связями, также возможна сборка)
В случае циклических связей или необходимости запускать
контейнеры на разных узлах - создать прокси и предварительно
запускать его (ambassador pattern).
43. Мониторинг состояния контейнеров (как
снаружи, так и внутри)
Снаружи: docker swarm агрегирует информацию о контейнерах, либо
внешняя проверка. У нас: consul health check
Внутри: захват логов (fluentd или syslog), можно использовать collectd
для сбора метрик по процессору и памяти.
44. Регистрация сервисов и возможность их
обнаружения
Можно использовать внешнее средство обнаружения сервисов - у нас
используется Consul + DNSMasq
Можно использовать swarm и его механизмы обнаружения (тоже consul
или etcd)
Можно посмотреть на DNS, встроенный в Libnetwork (впервые
стабильная сборка появилась в Docker 1.9)
45. Развертывание новых узлов по набору
правил и включение в состав кластера
Либо установка любого Linux-дистрибутива (с ядром не менее 3.15), либо
запуск на железе минималистичного Linux (CoreOS, Atomic) и запуск
рабочей среды (docker compose или любой DevOps инструмент - Puppet,
Ansible, Salt, Chef, ...)
Альтернатива - Docker Machine (особенно для разработчика с Windows
или MacOS)
46. Docker machine
Запуск образа операционной системы в виртуальной машине (драйвер
может быть как локальным - например, Virtualbox, так и облачным -
например, ec2).
Аналог vagrant, но интегрирован с swarm и входит в состав Docker
Toolbox.
48. Продолжение следует...
Вторая часть семинара будет по распределённым приложениям в Docker,
вопросам миграции контейнеров, использованию Swarm и управлению кластером
через Shipyard.
50. Спасибо за внимание!
Приходите к нам и приглашайте друзей.
Сообщество “ИТ. Герценовский университет”: http://goo.gl/FEieqK
Календарь семинаров: http://goo.gl/utyuU0
Дмитрий Золотов
dzolotov@herzen.spb.ru