Docker
Описание
открытая платформа для разработки, доставки и запуска приложений. Docker позволяет вам отделить приложение от вашей инфраструктуры, что позволяет вам доставить приложение быстро.
Основные компоненты Docker
- Client
- основной интерфейс (CLI или GUI), через который выполняется управление Docker
- Daemon
- фоновый сервис, который обрабатывает команды клиента: собирает, запускает и управляет контейнерами
- Host
- физическая или виртуальная машина, где работает Docker и запускаются контейнеры.
- Image
- неизменяемый шаблон (образ) с файловой системой и всем необходимым для запуска приложения
- Dockerfile
- файл с инструкциями, по которым собирается Docker-образ.
- Container
- запущенный из образа изолированный экземпляр приложения.
- Registry
- хранилище Docker-образов.
- Volume
- постоянное хранилище данных, которое сохраняется вне контейнера.
- Netowrk
- обеспечивает безопасную связь и взаимодействие между контейнерами.
Почему контейнеры легче виртуальных машин
- виртуализирует оборудование;
- запускает полноценную guest OS;
- требует отдельного kernel space.
- использует kernel host-системы;
- изолирует процессы;
- не запускает отдельную ОС.
Архитектура Docker
Docker - эффективная и функциональная технология, а потому связанные с ним инструменты и процессы не отличаются простотой. Docker действительно довольно сложно устроен, но со стороны пользователя представляет собой понятную модель "клиент-сервер". За Docker API находится несколько компонентов, включая containerd и runc, но базовое взаимодействие осуществляется между клиентом и сервером через API.
Клиент-серверная архитектура
Справка
Проще всего представить Docker ввиде двух частей: клиент и сервер/демон. К ним может добавляться третий компонент - registry, который хранит образы Docker и их метаданные.
Docker Client
Утилита командной строки, которая позволяет взаимодействовать с Docker.
CLI Docker - главный интерфейс, через который большинство людей взаимодействуют с Docker. Клиент Docker - это программа на Go, которая компилируется и выполняется на всех популярных архитектурах и операционных системах.
Список неполных задач, которые можно выполнять с помощью Docker CLI:
* сборка образа контейнера;
* извлечение образов из реестра в демон Docker и обратно;
* запуск контейнера на сервере Docker на переднем или в фоновом режиме;
* извлечение журналов Docker с удаленного сервера;
* интерактивное выполнение команды в работающем контейнере на удаленном сервере;
* мониторинг статистики о контейнере;
* просмотр процессов, запущенных в контейнере.
Docker Host
DOCKER_HOST
DOCKER_HOST = переменная окружения
У Docker демона, как и у остальных современных программ, есть API. Именно через его интерфейс командной строки Docker взаимодействует с демоном.
Главный компонент Docker. Содержит в себе docker daemon. Отвечает за сборку, выполнение и администрирование контейнеров
При установке Docker на свой сервер вам устанавливается:
- Docker Client;
- DOCKER_HOST;
- docker daemon;
Docker Hub/Registry
Хранилище Docker образов. (например Docker Hub)
С ним взаимодействие построено по принципы GitHub/GitLab/Bitbucket, а именно:
* Что бы получить образ из Docker Hub, мы выполняем команду docker pull <name_image>
* Чтобы отправить наш образ в Docker Hub, мы используем команду docker push
Дополнительная информация по Docker Host + Docker Client
Демонт Docker может выполняться на любом числе серверов в инфраструктуре, и один клиент может обращаться к любому числу серверов.
Клиенты управляют всеми коммуникациями, но серверы Docker могут напрямую взаимодействовать с реестрами образов, если так велит клиент.
Клиенты отдают сервервам команды, а серверы отвечают за размещение контейнерных приложений и управление ими.
Ограниченная изоляция
Контейнеры изолированы друго от друга, но изоляция не такая полная, как можно ожидать.
Мы можем установить ограничения на ресурсы, но по умолчанию контейнеры будут разделять одни и те же ресурсы CPU и памяти на хост-системе, как и следует процессам Unix. Получается, что без дополнительных ограничений контейнеры будут состязаться за ресурсы.
В Docker рекомедуется ограничивать отребление ЦПУ и памяти, но в большинстве случаев не существует лимитов по умолчанию, как у виртуальных машин.
Контейнеризованные процессы - это процессы на самом Docker Host. Они выполняются на том же экземпляре ядра Linux, что и операционная система хоста. Все процессы контейнера отображатся в обычных выходных данных команды ps на сервере Docker. Этот подход существенно отличается от гипервизора, в котором изоляция процессов предполагает отдельный экземпляр ядра ОС на каждую виртуальную машину.
Контейнеры легковесны
Создание контейнера может занимать очень мало места на диске. Простой текст покажет: только что созданный из существующего образа контейнер занимает всего 12 Кб дискового пространства. Виртуальная машина в свою очередь может весить сотни и тысячи мегабайт, так как ей требуется полноценная операционная система. Контейнер занимает так мало места, потому что представляет собой просто ссылку на многослойный образ файловой системы и включает немного метаданных о конфигурации.