2. Кто я
Меня зовут Кузьмицкий Александр. Окончил
МГВРК+БГУИР ИИТ по специальности
Информационные технологии и управление в
технических системах.
Работаю в Wargaming с 2012 года над
созданием инструментов автоматизации и
доставки ПО.
Видел Пик Ермаловича, Провал Кирейчука и прочий кровавый ентерпрайз.
12. Docker container
$ sudo docker run –-name test-nginx nginx
$ pid="$(docker inspect -f '{{.State.Pid}}’ test-nginx)"
$ sudo ln -sf /proc/$pid/ns/net "/var/run/netns/test-nginx "
$ sudo ip netns exec test-nginx ip a
$ sudo docker rm test-nginx
13. Проблемы
Воспроизводимые легковесные окружения
Эффективная доставка кода
Унификация интерфейсов
Развёртывание сервисов в условиях гетерогенного облака
Уменьшение костов
Виртуальные машины - дорого, долго и не всегда
эффективно
14. История разработки контейнеров
2003 год создания Zones в Solaris
2008 год создания LXC
Docker был создан как продвинутый Chroot
В 2013 docker стал OpenSource
2.75 миллиона прямых загрузок за 1 год
16. Технологии ядра
Namespaces – области видимости
Cgroups – лимиты на использование ресурсов
Networking – виртуализация сетевой подсистемы
Layers – формат представления данных на диске с
помощью специально разработанных файловых систем
Capabilities – разрешения на выполнение действий от
root
17. Namespaces(области видимости)
pid: Изоляция процессов
user: изоляция uid/gid
net: Управление сетевыми интерфейсами
ipc: управление доступоп к IPC ресурсам
mnt: управление точками монтирования файловой
системы
uts: изоляция ядра и идентификаторов
версий(hostname/domainname/architecture)
18. unshare – почувствуй себя хакером
# man unshare
http://man7.org/linux/man-pages/man1/unshare.1.html
sudo unshare -pf bash; kill <pid>
sudo unshare –u; hostname test123
Sudo unshare –n; ip a
19. Cgroups
Cgroup – это коллекция процессов, которые связаны с
набором ограничений, определённых через файловую
систему cgroups.
# mount -t cgroup -o all cgroup /sys/fs/cgroup
# ls /sys/fs/cgroup
cpu, cpuacct, cpuset, memory, devices, freezer, net_cls, blkio,
perf_event, net_prio, hugetlb, pids, rdma
21. Layers(Copy On Write)
Layers — формат представления данных на
диске с помощью набора слоёв с данными,
каждый из которых несёт в себе набор
файлов/директорий, которые мержатся на
верхнем уровне. Слои реализуют git-подобный
подход и существенно снижают размер
передаваемых данных по сети при копировании
и запуске контенеров.
23. Capabilities
Capabilities - это средства для управления привилегиями, которые в
традиционных Unix-подобных системах были доступны только
процессам, запущенным с правами root (uid==0). Этот механизм
позволяет дать процессу права на выполнениекаких-либо действий,
недоступных обычному пользователю (например, изменение системного
времени, прямой доступ к аппаратуре, использование зарезервированных
портов TCP/UDP (< 1024), блокировка страниц в физической памяти), но
в то же время не предоставлять этому процессу полный набор прав root.
31. Дисковые бэкэнды Docker
Название
Утилизация
диска
Изоляция Надёжность Скорость
aufs низкая низкая низкая низкая
overlay2 низкая низкая высокая средняя
overlay низкая низкая низкая низкая
btrfs очень низкая очень высокая низкая средняя
devicemapper высокая очень высокая высокая высокая
zfs очень низкая очень высокая высокая высокая
vfs очень высокая очень высокая очень высокая очень высокая
32. Способы создания образов
Проблема курицы и яйца
docker commit
docker build
docker push
docker pull
Dockerfile
https://hub.docker.com/
33. О Dockerfile подробнее
.dockerignore – игнорирование файлов и папок при сборке контекста
Dockerfile
ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
37. Docker: встроенные сети
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
e5ca4257897c bridge bridge local
eaa67fcc08a0 host host local
74b7aedba702 none null local
* container
38. Docker Service discovery
IP per container
Hostname based service discovery
Service Discovery в кластере
39. Хранение персистентных данных
Volume – это дисковое пространство между хостом и
контейнером. Другими словами – это папка на локальной
машине примонтированная внутрь контейнера.
Volume служат для хранения изменяющихся данных между
запусками контейнера.
Идеальный контейнер после запуска не вносит изменений в
свой слой. (RO Mode)
41. Volumes: Bind mounts
Bind mounts (-v, --mount) – способ хранения состояния
контейнера на файловой системе хост-машины.
• Базы данных
• Медиа файлы
• Данные, которые нужно шарить между контейнерами
• Позволяют примонтировать файл/сокет с хост-машины
https://docs.docker.com/storage/bind-mounts/
42. Volumes: docker volumes
Волюмы отделены от контейнера и хранятся в файловой структуре
docker
Волюмы управляются с помощью docker cli
Волюмы могут находиться на других машинах и иметь самый разный
функционал, который обеспечивается волюм плагинами
Волюм может иметь контент, предзаданный другим контейнером
46. Лимитирование ресурсов: cpu
$ --cpu
cpu-quota/cpu-period
cpuset-cpus
--cpus 0.1 means 10% of one CPU,
--cpus 1.0 means 100% of one whole CPU,
--cpus 10.0 means 10 entire CPUs.
47. Docker compose
Как работать с docker-compose:
Описывается набор контейнеров, параметров их запуска,
волюмы, линки и прочие параметры в файле docker-
compose.yml
Запускается команда docker-compose up
Compose автоматически собирает, скачивает и запускает
контейнеры.
Контейнеры могут быть запущены в бэкграунде или в
интерактивном режиме.
Для остановки используется команда docker-compose
down
50. Sсhedulers
Поддержание необходимого стейта
Скейлинг по запросу
Декларативное описание состояния
Работа в гетерогенной среде
Быстрое развёртывание кластера и контейнеров
API
Много готовых решений
51. Свойства контейнеров
Воспроизводимость – контейнер всегда ведёт себя
одинаково
Масштабируемость – горизонтальное масштабирование
Идемпотентность – собирая контейнер из одного и того же
Dockerfile мы получим один и тот же контейнер
Надёжность – контейнер использует простые технологии
ядра
Портативность – контейнер ведёт себя одинаково на
разных хостах
Что нужно, чтобы изолировать приложение?
Fs
Net
Pid
Uts
user
Передышка
Executor, реализующий непосредственный запуск контейнера.
Supervisor, контролирующий и отражающий статус контейнера.
Metadata, хранящий метаданные в графовой базе данных.
Content, предоставляющий доступ к адресуемому хранилищу контента (постоянных данных).
Snapshot, управляющий снапшотами файловой системы для образов контейнера. Аналог graphdriver в сегодняшнем Docker. Слои распаковываются в снапшоты.
Events, реализующий событийное поведение и возможность аудита.
Metrics, обеспечивающий доступность (по API) метрик различных компонентов.
Runc - бинарь
Docker image inspect
Данные пишутся в верхний слой, уникальный для каждого контейнера