Виртуализация #
Типы виртуализации:
- эмуляция железа - использует ВИ для симуляции требуемого железа
- pros: теоретически можно запустить любой софт на любом виртуальном железе
- cons: очень медленно
+----------+----------+----------+----------+
| Apps | Apps | Apps | Apps |
+----------+----------+----------+----------+
| Guest OS | Guest OS | Guest OS | Guest OS |
+----------+----------+----------+----------+
| Hardware VM A | Hardware VM B |
+---------------------+---------------------+
| Hardware |
+---------------------+---------------------+
полная виртуализация
- использует гипервизор для предоставления ВМ нижележащего физического железа
- в этом случае запускаемая на ВМ ОС должна иметь ту же архитектуру
- гипервизор может быть:
- приложением
- частью ядра ОС
- самостоятельной ОС
- примеры:
- KVM+QEMU
- Xen
- VirtualBox
- VMware
- Parallels
- MS HyperV
пара-виртуализация
- разделение процессов с гостевой ОС
- могут использоваться различные ядра
- у ядра гостевой ОС есть модуль, который позволяет часть системный вызовов выполнять на хостовой ОС
изоляция/контейнеризация
- запуск некоторых процессов в изолированной среде на той же самой ОС
- мнение: просто новый способ запуска задач (процессов) в ОС
- примеры:
- Docker
- Sandbox
- OpenVZ
- LXC
- Singularity (для использования не нужны root права)
+------------------------------------------------------------+
| Private Zone | Private Zone | ... | Private Zone |
+------------------------------------------------------------+
| Operating System (host) |
+------------------------------------------------------------+
| Hardware |
+------------------------------------------------------------+
LXC - одна из первых реализаций контейнеров под Linux (вроде как родом из Google, проверить).
Технологии, на которых основана контейнеризация #
CGroups #
Механизм ядра, позволяющий:
- изолировать
- приоритизировать
- управлять
- рассчитывать
ресурсы, доступные системе.
Основные ресурсы:
- CPU
- ядра
- процессорное время
- memory
- disk I/O
- network I/O
Задачи, выполняемые CGroup:
- ограничение ресурсов для группы процессов
- приоритизировать группы процессов относительно количества доступных ресурсов
- учитывать ресурсы, которые были потреблены той или иной группой процессов
- управлять группой процессов, замораживая, восстанавливая или перезапуская ее
Namespaces #
Позволяет ограничить возможность взаимодействия процессов с процессами и иными ресурсами, принадлежащими другой группе (другому пространству имен).
- PID (процесс в таком NS имеет 2 PID - один из хостовой системы, второй из самого NS; при этом другие процессы того же NS могут узнать только второй)
- FS (mount; прародителем этого типа изоляции был chroot)
- UTS
- network
- SysV IPC
ФС для контейнеров #
ФС самого контейнера, именно на этом уровне реализуется многослойность. Каждый слой образа - RO.
При запуске контейнера из этого образа добавляется еще один слой, который уже доступен RW. Этот слой существует только в момент жизни контейнера, как только контейнер удаляется, все данные из внешнего слоя так же удаляются.
Docker image #
Схема имени образа:
[host][:port]/[repository]/<image-name>[:tag]
Если:
- host не указан, то по умолчанию подразумевается hub.docker.com, однако это можно изменить в настройках Docker демона.
- на hub.docker.com в адресе образа отсутствует repository (username в случае именно этого ресурса), это значит, что образ официальный.
- tag не указан, но подразумевается latest.
Полезные команды #
# Последовательность, позволяющая отключиться от контейнера, не прерывая его работу
^p^q
# Запуск остановленного контейнера
docker start ${CONTAINER_ID}
# Подключение к запущенному контейнеру
docker attach ${CONTAINER_ID}
# Добавление таймштампов к логу
docker logs -t ${CONTAINER_ID}
# Сравнение текущего RW слоя контейнера с образом
docker diff ${CONTAINER_ID}
# Показывает системные PID`ы процессов, запущенных в контейнере
docker top
# Показывает все контейнеры в системе и ресурсы, которые они потребляют
docker stats
# Создает tar-архив из ФС контейнера и подает его на stdout
docker export
# Создает образ из tar-архива
docker import
# Показывает историю изменений образа
docker history
Сборка образа #
На каждую строчку Dockerfile запускается контейнер и в нем выполняется инструкция. Если при этом был изменен верхний (RW) слой контейнера, происходит docker commit
, тем самым, создаётся новый слой образа.
Директива ADD
умеет распаковывать tar-архивы и копировать в образ удаленные файлы (при этом не поддерживается распаковка).
Работа с локальным реджистри #
Для отправки контейнера в локальный (кастомный) реджистри, нужно добавить ему тег с именем реджистри, после чего выполнить docker push
.
Docker Machine #
Средство оркестрации, позволяющее управлять Docker-демонами на удаленных машинах с использованием REST API.