Tuesday, September 17, 2019

Docker: архитектура

Docker предоставляет возможность упаковывать и запускать приложение в изолированной среде, называемой контейнером. Изоляция и безопасность позволяют запускать много контейнеров одновременно на одной машине(хосте). Контейнеры являются легкими, потому что не используют гипервизор, но только ресурсы хоста. Docker может быть запущен и на виртуальных машинах, главное чтобы хватило ресурсов!
Docker Engine-это клиент-серверное приложение, состоящее их 3-х основных компонентов:
  •   Сервер, который является типом длительной программы, или проще говоря демон (dockerd). Демон прослушивает запросы API Docker и управляет объектами Docker, такими как изображения, контейнеры, сети и тома.
  •     REST API, определяет интерфейсы, которые программы могут использовать для общения с демоном и инструктировать его, что делать.
  •     Клиент интерфейса командной строки (CLI) (команда docker). Клиент отправляет команды в dockerd, который их выполняет(например, docker run).
Посмотрим на архитектуру докера:

Dockerfile используется как шаблон(набор инструкций), по которому можно сделать образ(docker image). Обратите внимание, что файл создается без разрешения! Каждая инструкция в этом файле создает отдельный слой в образе. При изменении Dockerfile и перестроении изображения перестраиваются только те слои, которые были изменены. Поэтому образы такие легкие и небольшого размера, плюс довольно быстрые, по сравнению с другими технологиями виртуализации.
Например, самый простой dockerfile будет выглядеть так, слой за слоеем:
FROM centos:7
RUN yum update -y
CMD ["bash] 
Создаем образ из этого файла:
#docker build -t image_from .
-f если файл находится вне текущей директории.

На хабре есть отличная статья про файлы докера и команды.
  1. FROM — задаёт базовый (родительский) образ.
  2. LABEL — описывает метаданные. Например — сведения о том, кто создал и поддерживает образ.
  3. ENV — устанавливает постоянные переменные среды.
  4. RUN — выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.
  5. COPY — копирует в контейнер файлы и папки.
  6. ADD — копирует файлы и папки в контейнер, может распаковывать локальные .tar-файлы.
  7. CMD — описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен. Аргументы могут быть переопределены при запуске контейнера. В файле может присутствовать лишь одна инструкция CMD.
  8. WORKDIR — задаёт рабочую директорию для следующей инструкции.
  9. ARG — задаёт переменные для передачи Docker во время сборки образа.
  10. ENTRYPOINT — предоставляет команду с аргументами для вызова во время выполнения контейнера. Аргументы не переопределяются.
  11. EXPOSE — указывает на необходимость открыть порт.
  12. VOLUME — создаёт точку монтирования для работы с постоянным хранилищем.

Docker Image
С помощью docker файла мы сделали новый образ(read only!), который является шаблоном с инструкциями для создания контейнера. Как видно из примера, получившийся шаблон(docker-image) основан на другом шаблоне centos,  но с дополнениями(yum update). Как вариант, вы можете создать свой шаблон, который устанавливает ваше приложение с вашими настройками и конфигами. Также есть возможность опубликовать собственные разработки на docker-hub'e, откуда они будут доступны другим участникам.

Containers(контейнер) - это выполняемый экземпляр образа(самодостаточная ОС, в которой только самое необходимое и код приложения). Вы можете создать, запустить, остановить, переместить или удалить контейнер с помощью Docker API или CLI. Вы можете подключить контейнер к одной или нескольким сетям, присоединить к нему хранилище или даже создать новый образ на основе его текущего состояния.
По умолчанию контейнер изолирован от других контейнеров и от хоста, на котором он запущен. При удалении контейнера все изменения, которые вы сделали за время его работы, если они не хранятся в в постоянном хранилище, потеряются.

Services (сервисы) - позволяют масштабировать контейнеры между несколькими демонами Docker, которые работают вместе в кластере(swarm)с несколькими менеджерами и работниками(manager and workers). Каждый член кластера является демоном Docker, и все демоны взаимодействуют с помощью API Docker.
Служба позволяет определить желаемое состояние, например количество реплик службы, которые должны быть доступны в любой момент времени. По умолчанию служба балансирует нагрузку на всех рабочих узлах кластера.

Успехов!

No comments:

Post a Comment