docker: introduction


Рекомендованная литература/курсы:
Docker Mastery: The Complete Toolset From a Docker Captain
Pethuru Raj, Jeeva S. Chelladhurai, Vinod Singh — Learning Docker
Neependra Khare — Docker Cookbook
Adrian Mouat — Using Docker

Механизмы контейнеризации: cgroups
Механизмы контейнеризации: namespaces
Cgroups, namespaces, and beyond: what are containers made from?
“Проникновение в Docker с примерами”, Дмитрий Столяров, Flant
Compatibility Matrix

Introduction

Раньше приложения разворачивались на отдельном сервере под управлением хостовой ОС, ресурсы которого делились между всеми приложениями. Развертывание было стабильным, аппаратно ориентированным и имело длительный цикл обслуживания. Данный процесс управлялся IT отделом, но для разработчика был мало гибок и мало масштабируемым. При такой концепции ресурсы сервера простаивали в пустую.
Для преодоления данного ограничения — придумали виртуализацию. С помощью гипервизоров таких как — KVM,XEN… происходило эмуляция железа. На каждой виртуальной машине устанавливалась гостевая ОС. Гостевая ОС могла отличаться от хостовой. При виртуализации приложение изолируется на уровне виртуалки и определяется жизненным циклом виртуалки. Данная концепция была более гибче, чем традиционная.
Следующим шагом развития стало появление контейнеров. Приложение упаковывается в свою собственную среду выполнения и разворачивается, как контейнер. OpenVZ, Solaris Zones, LXC — примеры данной технологии. Контейнеры менее гибки чем VM — в плане мы не можем развернуть MS Windows на Linux, а также контейнеры менее безопасны.
Например, как можно потушить хостовую тачку из контейнера:

docker container run --rm -it -v /:/host --name busybox busybox sh
cd /host && chroot ./
halt

Популярность к контейнерам пришла после появления Docker.
Docker был запущен как внутренний проект Соломона Хейкса, который является нынешним техническим директором Docker, Inc., в dotCloud. Docker был выпущен как opensource в марте 2013 года под лицензией Apache 2.0.

Докер использует фун-ии Linux ядра которые представляют возможность контейнеризации:Capabilities,Namespaces(pid,net,ipc,user,mnt,uts),cgroups,union file system…

Namespaces

Отвечает за изоляцию контейнеров. Гарантирует, что файловая система контейнера, его хостнэйм, сеть, процессы, пользователи — отделены от остальной части системы.
Namespaces — это строительные блоки контейнера. Существую различные типы нэймспэйсов, каждый из которых изолирует контейнеры друг от друга. Они создаются путем клонирования системных вызовов. Они так же могут подключаться к уже существующему пространству имен.

*PID namespace

позволяет контейнеру иметь свою собственную нумерацию процессов. Каждый pid формирует собственную иерархию процессов. Родительское пространство имен может видеть дочернее пространство и влиять на него, а дочернее не может не видеть не влиять на родительское.
Процесс запущенный внутри дочернего пространства имен имеет два PIDа: один в дочернем пространстве, другой в родительском. К примеру если мы запустим скрипт внутри контейнера, мы его также увидим и в списке процессов хостовой тачки.

*NET namespace

позволяет каждому контейнеру иметь собственный сетевой интерфейс, так же как и loopback интерфейс.
В общем интерфейсы внутри контейнера именуются как eht0, но в хостовой среде они именуются случайно, например как vethcf1a. Эти интерфейсы связываются мостом (docker0) на хостовой тачке для коммуникации между контейнерами и маршрутизации пакетов.
Так же данный namespace отвечает за изоляцию следующего функционала:
network interfaces(including io)
routing tables
iptables rules
scokets (ss,netstat)

*IPC namespace

Inter Process Communication (ipc) предоставляет семафоры, очереди сообщений, сегменты совместно используемой памяти.

*MNT namespace

с данным пространством имен, контейнер может иметь собственный набор примантированных файловых систем и корневых папок. Процессы одного mnt пространства не могут видеть примантированные файловые системы другого mnt пространства.

*UTS namespace

позволяет задать отдельный hostname каждому контейнеру.

*USER namespace

данное пространство имён позволяет иметь пользователей у которых не нулевой ID на хостовой тачке, но в контейне иметь нулевой ID.

Control Groups (cgroups)

Отвечает за управление ресурсами (traffic,i/o,cpu,memory…) используемыми контейнером, их лимитирование. Также отвечает за «заморозку» / «разморозку» контейнера, т.е. когда контейнер ставится на pause/unpause.

The Union filesystem

Union File System (UFS) используется для хранения слоёв контейнера, позволяет файлам и каталогам отдельных файловых систем (называемых слоями) прозрачно накладываться для создания новой виртуальной файловой системы.
UFS предоставляется такими драйверами как: AUFS,VFS, devicemapper, BTRFS, OverlayFS
При запуске контейнера Docker накладывает все слои, прикрепленные к образу, и создает файловую систему только для чтения.
Кроме того, Docker создает слой чтения / записи, который используется средой выполнения контейнера.

Docker может работать с различными драйверами исполнения, такими как libcontainer, lxc и libvirt для управления контейнерами. Драйвер исполнения по умолчанию — libcontainer, который поставляется с Docker из коробки. Он может манипулировать namespaces, control groups, capabilities и т.д. для Docker.

Требования:

1. Докер не поддерживается 32 битной архитектурой. Чтоб проверить какая версия стоит у вас выполните команду:

uname -i
>x86_64

2. Докер поддерживается версией ядра начиная с 3.8 и позже.А также некоторыми весриями ядра 2.6 — например в ОС RHEL 6.5
Проверка версии ядра:

uname -r
>4.13.0-45-generic

3. Установленное ядро должно поддерживать подходящее хранилище, такие как — VFS, DeviceMapper, AUFS, Btrfs или OverlayFS
В большенстве случаев это будет device-mapper.
Проверяем:

grep device-mapper /proc/devices
>253 device-mapper

AUFS в большинстве ядер потребует его модификации.
4. Поддержка cgroups и namespaces в ядре включена по умолчанию,
проверяем:

grep -i namespaces /boot/config-4.13.0-45-generic 
>CONFIG_NAMESPACES=y
grep -i cgroups /boot/config-4.13.0-45-generic 
>CONFIG_CGROUPS=y

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *