Container что это
Перейти к содержимому

Container что это

  • автор:

Docker

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

«IT-специалист с нуля» наш лучший курс для старта в IT

Платформа Docker представлена в двух вариантах: бесплатная Community Edition под лицензией Apache и платная Enterprise Edition. Платная версия предназначена для коммерческого использования и распространяется по проприетарной лицензии. Изначально системой можно было пользоваться в Linux и UNIX-системах, но начиная с 2015 года в ПО добавили поддержку Windows.

Профессия / 8 месяцев
IT-специалист с нуля

Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

vsrat_7 1 (1)

Что такое контейнеры

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

Контейнеризация напоминает виртуализацию, но технологии отличаются друг от друга. Виртуализация работает как отдельный компьютер со своей операционной системой и виртуальным оборудованием. Внутри одной операционной системы можно запустить другую. При контейнеризации виртуальная среда может запускаться прямо из ядра основной ОС и не виртуализирует оборудование. Поэтому контейнер может работать только в той же операционной системе, что и основная. Так как контейнеры не виртуализируют оборудование, они потребляют меньше ресурсов.

Как устроен Docker

структура платформы Docker

На изображении представлена примерная структура платформы. Docker — клиент-серверное приложение. Это означает, что оно состоит из двух частей: сервера и клиента.

Сервер еще называют Docker-движком или демоном (daemon). Это фоновый процесс, который непосредственно управляет контейнерами. Именно демон создает, разворачивает и запускает контейнеры. Его можно сравнить с двигателем машины.

Клиент — это программа-интерфейс для командной строки, с которой взаимодействует пользователь. Он отдает команды через терминал. Клиент сообщает нужные сведения демону и отдает ему указания. Если продолжать аналогию с машиной, клиент — это руль и педали.

Клиент и сервер могут находиться на одном устройстве, а могут — на разных. Во втором случае клиент подключают к удаленному серверу через сокеты или API.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить

Компоненты для контейнеризации

Docker работает со следующими компонентами.

Dockerfile. Это файл для предварительной работы, набор инструкций, который нужен для записи образа. В нем описывается, что должно находиться в образе, какие команды, зависимости и процессы он будет содержать.

Для сборки образа из Dockerfile используют команду:

docker build

Docker Image. Это образ — неизменяемый файл, из которого разворачивается контейнер. Для этого нужно запустить образ в клиенте с помощью специальной команды:

docker run

Docker Registry. Это реестр, или репозиторий — открытая или закрытая база образов. К ней можно подключиться через клиент Docker и загрузить нужный с помощью команды:

docker pull

При запуске команды docker run программа сначала проверяет, есть ли нужный образ в локальном хранилище. Если его нет, она сама находит файл в репозитории и скачивает на компьютер.

Docker Container. Это уже готовый и развернутый контейнер, который находится на каком-либо устройстве.

контейнеризация в Docker

Так пользователь запускает нужный образ через клиент Docker и ждет, пока платформа развернет его в полноценную среду или приложение-контейнер.

DevOps-инженер — связующее звено между всеми этапами создания продукта. Станьте незаменимым специалистом
за 6 месяцев.

Docker контейнер

Docker контейнер — это стандартизированный, изолированный и портативный пакет программного обеспечения, который включает в себя все необходимое для запуска приложения, включая код, среду выполнения, системные инструменты, библиотеки и настройки. Контейнеры позволяют упаковать приложение и все его зависимости в единый объект, который может быть запущен на любой системе, поддерживающей Docker, без изменения среды выполнения.

Преимущества использования Docker контейнеров:

  1. Изоляция: Контейнеры изолируют приложения друг от друга и от хост-системы, что уменьшает возможные конфликты между зависимостями и обеспечивает более надежную среду выполнения.
  2. Портативность: Контейнеры могут быть созданы и запущены на различных системах без изменений, что делает развертывание приложений более простым и надежным.
  3. Эффективность использования ресурсов: Контейнеры используют общие ресурсы операционной системы и разделяют ядро, что делает их более эффективными по сравнению с виртуальными машинами.
  4. Масштабируемость: Контейнеры легко масштабируются горизонтально, позволяя быстро добавлять экземпляры приложения в ответ на увеличение нагрузки.
  5. Управление версиями: Контейнеры позволяют управлять версиями приложений и их зависимостей, что упрощает процесс развертывания и обновления.

Чем контейнеризация отличается от виртуализации

Контейнеры и виртуальные машины (ВМ) — это методы изоляции приложений и окружений. Docker использует виртуализацию на уровне операционной системы, позволяя запускать приложения в изолированных контейнерах, которые делят ядро ОС с хост-системой. ВМ, напротив, создают полные виртуальные компьютеры с отдельными ОС и ресурсами.

Это означает, что Docker-контейнеры более легкие, потому что они не требуют дублирования всей ОС, как ВМ. Контейнеры также быстрее запускаются и имеют меньший объем, что делает их более эффективными в ресурсоемких средах. Однако ВМ предоставляют большую изоляцию, так как каждая ВМ имеет свою собственную ОС и не зависит от хост-системы.

Таким образом, Docker контейнеры предоставляют легковесное и быстрое решение для изоляции приложений, в то время как виртуальные машины обеспечивают более глубокую изоляцию за счет полной виртуализации.

Характеристика Docker контейнеры Виртуальные машины
Уровень изоляции Операционная система Аппаратное обеспечение
Ресурсоемкость Меньше Больше
Запуск и остановка Быстрее Медленнее
Размер Меньше Больше
Изоляция Менее глубокая Глубокая
Нагрузка на хост-систему Меньше Больше
Совместимость Ограниченная Высокая
Виртуализация ОС Да Да
Гипервизор Не требуется Требуется

Эта таблица демонстрирует основные различия между Docker контейнерами и виртуальными машинами.

Docker и виртуальные машины не всегда хорошо сочетаются вместе. Иногда в практике используется подход, при котором сервер разделяется на виртуальные машины, на которых запускаются контейнеры. Однако такая двойная виртуализация приводит к лишнему расходу ресурсов. Если в организации установилась такая практика, то вместо гипервизора можно использовать Kubernetes, который будет устанавливать приложения непосредственно на физическое оборудование.

Обычно крупные компании работают с виртуальными машинами, развернутыми на физическом оборудовании в центрах обработки данных. Инженеры инфраструктуры создают виртуальные компьютеры и настраивают на них инфраструктуру. Используя оркестраторы, можно избавиться от этого дополнительного уровня.

Если у вас есть избыток ресурсов, то можно установить Docker на виртуальную машину, чтобы обеспечить изоляцию между приложениями.

Что такое Docker Hub

Образ можно создать самостоятельно с помощью Dockerfile или уже готового контейнера, в котором произошли какие-либо изменения, а также скачать из открытого репозитория Docker Hub.

Разработчики со всего мира могут выкладывать Docker-образы. Другие пользователи имеют возможность скачать их, развернуть в контейнеры и использовать на своих машинах.

Сейчас в Docker Hub более 100 тысяч образов. Некоторые из них загрузили в базу официальные разработчики. Это, например, Docker Images для mySQL или GitLab.

Поддержка репозитория уже включена в Docker. Это значит, что достаточно написать команду для установки какой-либо программы, и система сама начнет искать ее в базе данных. По умолчанию это Docker Hub, но платформу можно настроить и под другие репозитории. Например, под внутренние корпоративные базы.

Docker Compose: множественные образы

Считается, что один контейнер должен выполнять одну функцию. Поэтому для настройки сложной среды понадобится несколько образов.

Можно скачать их вручную и настроить либо воспользоваться Docker Compose — инструментом для работы с множественными образами и многоконтейнерными приложениями.

Docker Compose

ПО позволяет управлять несколькими образами и контейнерами как одним. С помощью Docker Compose можно создать файл YAML для определения служб и с одной командой запускать и останавливать все что нужно. Инструмент способен ускорить разработку: в многоконтейнерных приложениях количество контейнеров может доходить до нескольких десятков.

DevOps-инженер

Помогайте компаниям быстрее выпускать качественный продукт

cables (3)

Как хранятся данные в Docker

При остановке и перезапуске контейнера можно потерять часть рабочей информации, которая в нем записана. Чтобы этого избежать, программисты стремятся разрабатывать приложения с минимальным использованием хранилищ внутри контейнеров. Но обойтись без хранения данных получается не всегда, а от основной системы контейнер изолирован. Существует несколько способов решить проблему.

Docker Volumes. Это тома — способ хранения информации, который рекомендуют использовать разработчики платформы. Внутри лежат файлы и другие данные. Тома можно подключать к разным контейнерам, выбирать специальные драйверы и хранить информацию не на хосте, а в облаке или на удаленном сервере.

В Linux тома по умолчанию находятся в /var/lib/docker/volumes/. Другие программы могут получить к ним доступ только через контейнер, а не напрямую. Для создания и управления томами используются средства Docker: команда docker volume create, указание тома при создании контейнера в Dockerfile или docker-compose.yml.

Bind Mount. Более простой способ реализовать удаленное хранение памяти — папки, которые монтируются в контейнер прямо с хоста. Этот вариант используют для передачи конфигурационных файлов или в процессе разработки. Программист может писать код в среде хоста, а потом передавать его в контейнер.

Tmpfs и Named Pipes. Так называется особое файловое хранилище, которое есть только в системах Linux. Как правило, оно используется не для хранения файлов, а для обеспечения безопасности. Tmpfs — временное хранилище. Стоит остановить контейнер — данные будут потеряны. Доступ к Tmpfs очень быстрый, поэтому хранилище используют, чтобы оптимизировать работу контейнера.

Named Pipes — это именованные каналы. Через них с Docker могут работать только пользователи Windows.

Задачи, которые решает Docker

Развертывание среды или приложения

Docker позволяет перенести приложение со всеми зависимостями на другую систему с помощью пары команд в терминале. Настройка зависимостей вручную занимает больше времени. Также с помощью Docker можно быстро развернуть рабочую среду с определенными настройками. Существуют «системные контейнеры», которые содержат дистрибутивы ОС.

Изолированный запуск

Docker позволяет запустить приложение отдельно от всей системы без конфликтов с другими программами. Программа становится практически автономной и не вызывает ошибок зависимости.

Контроль ресурсов

Еще одна возможность Docker — распределение ресурсов между разными приложениями. Неизолированные процессы могут конкурировать за память и вычислительные мощности процессора. Изолированные друг от друга программы не делают этого. Docker позволяет эффективнее использовать ресурсы и не допускать конфликтов.

Повышение безопасности

Если код контейнерного приложения окажется небезопасным, это не навредит серверу-хосту. При правильной настройке контейнера деятельность кода не затронет основную систему. Даже фатальная ошибка не повлияет на работоспособность остальных служб и программ.

Работа с микросервисами

Микросервисная архитектура — такой тип организации ПО, при котором функции большого приложения разделяются на маленькие независимые программные модули. Они общаются друг с другом с помощью протоколов, но в целом работают автономно друг от друга. Docker подходит для реализации архитектуры этого типа: каждый микросервис упаковывается в отдельный контейнер, который можно настроить и протестировать, запустить или остановить отдельно от других.

Читайте также Возможна ли цифровая трансформация в нынешних условиях?

Ускорение цикла разработки

Технологии контейнеризации помогают программировать быстрее. На настройку среды, разворачивание приложений под разными платформами тратится меньше времени. В результате повышается производительность всей команды.

Управление сложными системами

Для автоматизации большинства процессов со сложными контейнерными приложениями используются платформы оркестрации. Многие возможности специального ПО завязаны на контейнеризации и функциях Docker.

Например, платформы автоматизируют разворачивание контейнеров, их настройку и масштабирование. Это нужно, так как программная архитектура становится более сложной. Приложения могут состоять из сотен отдельных контейнеров, каждый из которых нужно развернуть и настроить. Поддержка таких приложений вручную занимает много времени.

Масштабирование

Это еще одна задача для платформ оркестрации. Во многих из них поддерживается автоматическое масштабирование систем под разные площадки и условия. Пример такой платформы — Kubernetes, которая часто используется в связке с Docker.

Автомасштабирование помогает быстро оптимизировать сектор под повышенную нагрузку. Если сайт неожиданно получит больше трафика, чем обычно, система перераспределит ресурсы и сервисы адаптируются.

Как начать работу с Docker

Docker доступен для Linux, Windows, Mac. Чтобы скачать установочный файл, нужно перейти по ссылке и выбрать подходящую версию. Подробную инструкцию по установке можно найти в официальной документации.

Расскажем про работу с «первым контейнером». Это практически аналог “Hello, World” для Docker: скачивание и разворачивание популярного образа из репозитория. Обычно используется какой-либо дистрибутив Linux:

docker run ubuntu echo “Hi, I'm Ubuntu”

Запись означает «Разверни образ Ubuntu в контейнер и выполни в нем команду echo “Hi, I’m Ubuntu” ». Эта команда написана на bash — языке сценариев Linux.

  1. Docker-клиент получит эту запись и отправит инструкции демону.
  2. Тот проверит, есть ли образ Ubuntu на компьютере. Если его не найдется, программа скачает его из Docker Hub и сохранит.
  3. Затем движок развернет образ в контейнер — внутри изолированно от основной системы запустится Ubuntu.
  4. И уже внутри Ubuntu выполнится команда echo “Hi, I’m Ubuntu” . Она выведет в консоль надпись “Hi, I’m Ubuntu” .

Это наиболее простой пример — возможностей у Docker намного больше.

Недостатки Docker

Высокая потребность в ресурсах

Docker добавляет дополнительный слой абстракции и требует дополнительных вычислительных ресурсов. Это означает, что нужно балансировать между удобством и оптимальным использованием ресурсов.

Оркестрация для крупных приложений

Docker хорош для управления небольшим числом контейнеров. Однако при наличии 50–100 сервисов может потребоваться оркестратор, так как Docker не обладает достаточными инструментами для эффективного управления ресурсами и обеспечения надежности в случае разных сценариев обновления контейнеров.

Большие приложения с микросервисной архитектурой часто используют оркестраторы, такие как Kubernetes или OpenShift, чтобы обеспечить более высокий уровень управления и надежности. Docker в таких случаях часто оказывается недостаточным.

Сложности на Windows и macOS

Docker, изначально разработанный для Linux, может столкнуться с проблемами совместимости на других ОС. Кроме того, установка Docker на Windows иногда может конфликтовать с VirtualBox, что может вызвать трудности при настройке.

IT-специалист с нуля

Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.

картинка (75)

Статьи по теме:
Почему писать игры лучше на C#, а для создания крупных проектов подходит Java

Почему для больших проектов обычно выбирают Java, средних — PHP, а быстро развивающихся стартапов — Ruby или Go

Компонент Контейнер Container

Партнёр

Компонент «Контейнер» позволяет выравнивать и центрировать содержимое страницы. Обычно в контейнер обернут основной контент сайта.

Применение

Основы. Использование

Добавьте класс .uk-container к элементу блока, чтобы придать ему максимальную ширину (по умолчанию max-width: 1200px ). Элемент будет отцентрирован и будет иметь боковые внутренние отступы, которые автоматически адаптируются для больших экранов. Обычно в контейнер оборачивают основной контент сайта.

Модификатор «Размер»

Добавьте один из следующих классов в контейнер, чтобы применить необходимую максимальную ширину.

Класс Описание
.uk-container-xsmall Добавьте этот класс, если вы хотите установить малую ширину для контейнера.
По умолчанию: max-width: 750px
.uk-container-small Добавьте этот класс для небольшого размера контейнера.
По умолчанию: max-width: 900px
.uk-container-large Добавьте этот класс для широкого размера контейнера.
По умолчанию: max-width: 1400px
.uk-container-xlarge Добавьте этот класс для большого размера контейнера.
По умолчанию: max-width: 1600px
.uk-container-expand Добавьте этот класс, если вы не хотите ограничивать ширину контейнера, но хотите динамическое горизонтальное заполнение.

Container

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

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

Между технологиями виртуальных машин (ВМ) и контейнерами есть важное отличие. Контейнеры не работают со сторонними системными файлами и инструментами, тогда как ВМ используют отдельный пул ресурсов со своей ОС. Для того, чтобы работать с контейнером потребуются только ресурсы, в остальном же процесс больше похож на шэринг компонентов операционной системой. Это дает контейнером преимущество относительно ВМ не только в скорости запуска, но и в степени нагрузки системы, особенно во время запуска.

Контейнеры могут обладать спецификацией по-определенному API или ОС. Например, контейнеры Linux не будут работать без Linux API, поэтому для Windows они будут малопригодны.

Чтобы управлять контейнерами, можно использовать PowerShell (позволяет работать только с локальным репозиторием), который постепенно теряет популярность или Docker. Между Microsoft и Docker существует соглашение, по которому все команды управления актуальны и для контейнеров Win, и для Linux.

Основы контейнеризации (обзор Docker и Podman)

К 2022 году о контейнеризации не слышал только ленивый. Большинство специалистов, так или иначе имеющих отношение к ИТ, хотя бы раз в жизни запускали программное обеспечение в контейнерах. Однако так ли эта технология проста и понятна? Давайте разбираться вместе!

Главная задача данной статьи – рассказать о контейнеризации, дать ключевые понятия для дальнейшего изучения и показать несколько простых практических приемов. По этой причине (а еще, безусловно, вследствие недостаточной квалификации автора) теоретический материал достаточно упрощен.

История

Идея изоляции пользовательских пространств берет свое начало в 1979 году, когда в ядре UNIX появился системный вызов chroot. Он позволял изменить путь каталога корня / для группы процессов на новую локацию в файловой системе, то есть фактически создавал новый корневой каталог, который был изолирован от первого. Следующим шагом и логическим продолжением chroot стало создание в 2000 году FreeBSD jails («тюрем»), в которых изначально появилась частичная изоляция сетевых интерфейсов. В первой половине нулевых технологии виртуализации на уровне ОС активно развивались – появились Linux VServer (2001), Solaris Containers (2004) и OpenVZ (2005).

В операционной системе Linux технологии изоляции и виртуализации ресурсов вышли на новый этап в 2002 году, когда в ядро было добавлено первое пространство имен для изоляции файловой системы – mount. В 2006-2007 годах компанией Google был разработан механизм Process Containers (позднее переименованный в cgroups), который позволил ограничить и изолировать использование группой процессов ЦПУ, ОЗУ и др. аппаратных ресурсов. В 2008 году функционал cgroups был добавлен в ядро Linux. Достаточная функциональность для полной изоляции и безопасной работы контейнеров была завершена в 2013 году с добавлением в ядро пространства имен пользователей – user.

В 2008 году была представлена система LXC (LinuX Containers), которая позволила запускать несколько изолированных Linux систем (контейнеров) на одном сервере. LXC использовала для работы механизмы изоляции ядра – namespaces и cgroups. В 2013 году на свет появилась платформа Docker, невиданно популяризовавшая контейнерные технологии за счет простоты использования и широкого функционала. Изначально Docker использовал LXC для запуска контейнеров, однако позднее перешел на собственную библиотеку libcontainer, также завязанную на функционал ядра Linux. Наконец, в 2015 появился проект Open Container Initiative (OCI), который регламентирует и стандартизирует развитие контейнерных технологий по сей день.

Что такое контейнеры?

Контейнеризация (виртуализация на уровне ОС) – технология, которая позволяет запускать программное обеспечение в изолированных на уровне операционной системы пространствах. Контейнеры являются наиболее распространенной формой виртуализации на уровне ОС. С помощью контейнеров можно запустить несколько приложений на одном сервере (хостовой машине), изолируя их друг от друга.

Процесс, запущенный в контейнере, выполняется внутри операционной системы хостовой машины, но при этом он изолирован от остальных процессов. Для самого процесса это вылядит так, будто он единственный работает в системе.

Механизмы изоляции контейнеров

Изоляция процессов в контейнерах осуществляется благодаря двум механизмам ядра Linux – пространствам имен (namespaces) и контрольным группам (cgroups).

Пространства имен гарантируют, что процесс будет работать с собственным представлением системы. Существует несколько типов пространств имен:

  • файловая система (mount, mnt) – изолирует файловую систему
  • UTS (UNIX Time-Sharing, uts) – изолирует хостнейм и доменное имя
  • идентификатор процессов (process identifier, pid) – изолирует процессы
  • сеть (network, net) – изолирует сетевые интерфейсы
  • межпроцессное взаимодействие (ipc) – изолирует конкурирующее взаимодействие процессами
  • пользовательские идентификаторы (user) – изолирует ID пользователей и групп

Процесс принадлежит не одному пространству имен, а одному пространству имен каждого типа.

Контрольные группы гарантируют, что процесс не будет конкурировать за ресурсы, зарезервированные за другими процессами. Они ограничивают (контролируют) объем ресурсов, который процесс может потреблять – ЦПУ, ОЗУ, пропускную способность сети и др.

  • Механизмы контейнеризации: namespaces
  • Механизмы контейнеризации: cgroups

Основные понятия

Container image (образ) – файл, в который упаковано приложение и его среда. Он содержит файловую систему, которая будет доступна приложению, и другие метаданные (например команды, которые должны быть выполнены при запуске контейнера). Образы контейнеров состоят из слоев (как правило один слой – одна инструкция). Разные образы могут содержать одни и те же слои, поскольку каждый слой надстроен поверх другого образа, а два разных образа могут использовать один и тот же родительский образ в качестве основы. Образы хранятся в Registry Server (реестре) и версионируются с помощью tag (тегов). Если тег не указан, то по умолчанию используется latest. Примеры: Ubuntu, Postgres, NGINX.

Registry Server (реестр, хранилище) – это репозиторий, в котором хранятся образы. После создания образа на локальном компьютере его можно отправить (push) в хранилище, а затем извлечь (pull) на другом компьютере и запустить его там. Существуют общедоступные и закрытые реестры образов. Примеры: Docker Hub (репозитории docker.io), RedHat Quay.io (репозитории quay.io).

Container (контейнер) – это экземпляр образа контейнера. Выполняемый контейнер – это запущенный процесс, изолированный от других процессов на сервере и ограниченный выделенным объемом ресурсов (ЦПУ, ОЗУ, диска и др.). Выполняемый контейнер сохраняет все слои образа с доступом на чтение и формирует сверху свой исполняемый слой с доступом на запись.

Container Engine (движок контейнеризации) – это программная платформа для упаковки, распространения и выполнения приложений, которая скачивает образы и с пользовательской точки зрения запускает контейнеры (на самом деле за создание и запуск контейнеров отвечает Container Runtime). Примеры: Docker, Podman.

Container Runtime (среда выполнения контейнеров) – программный компонент для создания и запуска контейнеров. Примеры: runc (инструмент командной строки, основанный на упоминавшейся выше библиотеке libcontainer), crun.

Host (хост) – сервер, на котором запущен Container Engine и выполняются контейнеры.

Open Container Initiative (OCI) – это проект Linux Foundation, основанный в 2015 году компанией Docker, Inc, целью которого является разработка стандартов контейнеризации. В настоящее время в проекте участвуют такие компании, как Google, RedHat, Microsoft и др. OCI поддерживает спецификации image-spec (формат образов) и runtime-speс (Container Runtime).

  • A Practical Introduction to Container Terminology
  • A Comprehensive Container Runtime Comparison
  • Различия между Docker, containerd, CRI-O и runc

Подсказки перед практикой

На практике при работе с контейнерами могут быть полезны следующие советы:

  • Простейший сценарий – скачать образ, создать контейнер и запустить его (выполнить команду внутри)
  • Документацию по запуску контейнера (путь к образу и необходимые команды с ключами) как правило можно найти в реестре образов (например, у Docker Hub есть очень удобный поисковик) или в ReadMe репозитория с исходным кодом проекта. Создать образ и сохранить его в публичный реестр может практически каждый, поэтому старайтесь пользоваться только официальной документацией и проверенными образами! Примеры: Docker Hub/nginx, Docker Hub/debian, GitHub Readme/prometheus
  • Для скачивания образов используется команда pull, однако в целом она необязательна – при выполнении большинства команд (create, run и др.) образ скачается автоматически, если не будет обнаружен локально
  • При выполнении команд pull, create, run и др. следует указывать репозиторий и тег образа. Если этого не делать, то будут использоваться значения по умолчанию – репозиторий как правило docker.io, а тег latest
  • При запуске контейнера выполняется команда по умолчанию (точка входа), однако можно выполнить и другую команду

Работа с Docker

Docker – это открытая платформа для разработки, доставки и запуска приложений. Состоит из утилиты командной строки docker, которая вызывает одноименный сервис (сервис является потенциальной единой точкой отказа) и требует права доступа root. По умолчанию использует в качестве Container Runtime runc. Все файлы Docker (образы, контейнеры и др.) по умолчанию хранятся в каталоге /var/lib/docker.

Для установки необходимо воспользоваться официальным руководством – Download and install Docker, которое содержит подробные инструкции для Linux, Windows и Mac. Стоит сразу отметить, что контейнерам для работы необходимы функции ядра Linux, поэтому они работают нативно под Linux, почти нативно в последних версиях Windows благодаря WSL2 (через Docker Desktop или Linux диструбутив) и не нативно под Mac (используется виртуализация). Автор рекомендует использовать в тестовой и особенно в промышленной эксплуатации только Linux.

Основные команды

Ниже приведены примеры наиболее распространенных команд:

# справочная информация docker --help # список доступных команд docker --help # информация по команде docker --version # версия Docker docker info # общая информация о системе # работа с образами docker search debian # поиск образов по ключевому слову debian docker pull ubuntu # скачивание последней версии (тег по умолчанию latest) официального образа ubuntu (издатель не указывается) из репозитория по умолчанию docker.io/library docker pull prom/prometheus # скачивание последней версии (latest) образа prometheus от издателя prom из репозитория docker.io/prom docker pull docker.io/library/ubuntu:18.04 # скачивание из репозитория docker.io официального образа ubuntu с тегом 18.04 docker images # просмотр локальных образов docker rmi : # удаление образа. Вместо : можно указать . Для удаления образа все контейнеры на его основе должны быть как минимум остановлены docker rmi $(docker images -aq) # удаление всех образов # работа с контейнерами docker run hello-world # Hello, world! в мире контейнеров docker run -it ubuntu bash # запуск контейнера ubuntu и выполнение команды bash в интерактивном режиме docker run --name docker-getting-started --publish 8080:80 docker/getting-started # запуск контейнера gettind-started с отображением (маппингом) порта 8080 хоста на порт 80 внутрь контейнера docker run --detach --name mongodb docker.io/library/mongo:4.4.10 # запуск контейнера mongodb с именем mongodb в фоновом режиме. Данные будут удалены при удалении контейнера! docker ps # просмотр запущенных контейнеров docker ps -a # просмотр всех контейнеров (в том числе остановленных) docker stats --no-stream # просмотр статистики docker start alpine # создание контейнера из образа alpine docker start # запуск созданного контейнера. Вместо можно указать docker start $(docker ps -a -q) # запуск всех созданных контейнеров docker stop # остановка контейнера. Вместо можно указать docker stop $(docker ps -a -q) # остановка всех контейнеров docker rm # удаление контейнера. Вместо можно указать docker rm $(docker ps -a -q) # удаление всех контейнеров # система docker system info # общая информация о системе (соответствует docker info) docker system df # занятое место на диске docker system prune -af # удаление неиспользуемых данных и очистка диска

Обязательно пробуйте команды на практике, при необходимости прибегая к help или руководствам в Интернете.

Хранение данных

При запуске контейнер получает доступ на чтение ко всем слоям образа, а также создает свой исполняемый слой с возможностью создавать, обновлять и удалять файлы. Все эти изменения не будут видны для файловой системы хоста и других контейнеров, даже если они используют тот же базовый образ. При удалении контейнера все измененные данные также будут удалены. В большинстве случаев это предпочтительное поведение, однако иногда данные необходимо расшарить между несколькими контейнерами или просто сохранить.

Рассмотрим два способа хранения данных контейнеров:

  • named volumes – именованные тома хранения данных
    Позволяет сохранять данные в именованный том, который располагается в каталоге в /var/lib/docker/volumes и не удаляется при удалении контейнера. Том может быть подключен к нескольким контейнерам
  • bind mount – монтирование каталога с хоста
    Позволяет монтировать файл или каталог с хоста в контейнер. На практике используется для проброса конфигурационных файлов или каталога БД внутрь контейнера

Ниже приведены примеры использования named volume и bind mount:

# справочная информация docker --help # named volume docker run --detach --name jenkins --publish 80:8080 --volume=jenkins_home:/var/jenkins_home/ jenkins/jenkins:lts-jdk11 # запуск контейнера jenkins с подключением каталога /var/jenkins_home как тома jenkins_home docker volume ls # просмотр томов docker volume prune # удаление неиспользуемых томов и очистка диска. Для удаления тома все контейнеры, в которых он подключен, должны быть остановлены и удалены # bind mount # запуск контейнера node-exporter с монтированием каталогов внутрь контейнера в режиме read only: /proc хоста прокидывается в /host/proc:ro внутрь контейнера, /sys - в /host/sys:ro, а / - в /rootfs:ro docker run \ -p 9100:9100 \ -v "/proc:/host/proc:ro" \ -v "/sys:/host/sys:ro" \ -v "/:/rootfs:ro" \ --name node-exporter prom/node-exporter:v1.1.2

Обязательно пробуйте команды на практике, при необходимости прибегая к help или руководствам в Интернете.

Создание образа (Dockerfile)

Создание и распространение образов – одна из основных задач Docker. Рассмотрим два способа создания образа:

  • commit изменений из контейнера
    Необходимо запустить контейнер из базового образа в интерактивном режиме, внести изменения и сохранить результат в образ с помощью команды commit. На практике способ удобен для небольших быстрых доработок
  • декларативное описание через Dockerfile
    Основной способ создания образов. Необходимо создать файл Dockerfile с декларативным описанием в формате yaml через текстовый редактор и запустить сборку образа командой build

Ниже приведены примеры использования commit и build:

# справочная информация docker --help # commit # запуск контейнера из образа ubuntu в интерактивном режиме, установка утилиты ping и коммит образа под именем ubuntu-ping:20.04 docker run -it --name ubuntu-ping ubuntu:20.04 bash apt update && apt install -y iputils-ping exit docker commit ubuntu-ping ubuntu-ping:20.04 docker images # Dockerfile # создание файла Dockerfile декларативного описания FROM ubuntu:20.04 RUN apt-get update && apt-get install -y iputils-ping # запуск команды build из каталога с Dockerfile для создания образа simust/ubuntu-ping:20.04 docker build -t ubuntu-ping:20.04 . docker images # tag, login, push docker tag ubuntu-ping:20.04 simust/ubuntu-ping:20.04 # создание из локального образа ubuntu-ping:20.04 тега с репозиторием для издателя simust docker images # вход в репозиторий docker.io под пользователем simust и отправка образа docker login -u simust docker.io docker push simust/ubuntu-ping:20.04

Обязательно пробуйте команды на практике, при необходимости прибегая к help или руководствам в Интернете.

Мультиконтейнерные приложения (Docker Compose)

Docker Compose – это инструмент для декларативного описания и запуска приложений, состоящих из нескольких контейнеров. Он использует yaml файл для настройки сервисов приложения и выполняет процесс создания и запуска всех контейнеров с помощью одной команды. Утилита docker-compose позволяет выполнять команды на нескольких контейнерах одновременно – создавать образы, масштабировать контейнеры, запускать остановленные контейнеры и др.

Работа с Podman

Podman – это инструмент с открытым исходным кодом для поиска, сборки, передачи и запуска приложений. Является утилитой командной строки с аналогичными docker командами, однако не требует дополнительный сервис для работы и может работать без прав доступа root. По умолчанию использует в качестве Container Runtime crun (ранее runc).

Возможность работать с контейнерами без прав root приводит к нескольким особенностям:

  • все файлы Podman (образы, контейнеры и др.) пользователей с правами доступа root хранятся в каталоге /var/lib/containers, без прав доступа root – в ~/.local/share/containers
  • пользователи без root прав по умолчанию не могут использовать привилегированные порты и полноценно использовать некоторые команды

Для установки необходимо воспользоваться официальным руководством – Podman Installation Instructions, которое содержит инструкции для Linux, Windows и Mac. Стоит сразу отметить, что контейнерам для работы необходимы функции ядра Linux, поэтому они работают нативно под Linux, почти нативно в последних версиях Windows благодаря WSL2 (через Linux дистрибутив – не забудьте про wsl —set-default-version 2) и не нативно под Mac (используется виртуализация). Автор рекомендует использовать в тестовой и особенно в промышленной эксплуатации только Linux.

Основные команды

Основные команды для docker идентичны командам для podman, однако есть и приятные доработки (например, ключ —all для команд start, stop, rm, rmi). Формат образов также совместим благодаря спецификации OCI.

Ниже приведены примеры наиболее распространенных команд:

# справочная информация podman --help # список доступных команд podman --help # информация по команде # работа с образами podman search nginx # поиск образов по ключевому слову nginx podman pull ubuntu # скачивание последней версии (тег по умолчанию latest) официального образа ubuntu (издатель не указывается) из репозитория по умолчанию docker.io/library podman pull quay.io/bitnami/nginx:latest # скачивание последней версии образа nginx от издателя bitnami из репозитория quay.io/bitnami podman pull docker.io/library/ubuntu:18.04 # скачивание из репозитория docker.io официального образа ubuntu с тегом 18.04 podman images # просмотр локальных образов podman rmi : # удаление образа. Вместо : можно указать . Для удаления образа все контейнеры на его основе должны быть как минимум остановлены podman rmi --all # удаление всех образов # работа с контейнерами podman run hello-world # Hello, world! в мире контейнеров podman run -it ubuntu bash # запуск контейнера ubuntu и выполнение команды bash в интерактивном режиме podman run --detach --name nginx --publish 9090:8080 quay.io/bitnami/nginx:1.20.2 # запуск контейнера nginx с отображением (маппингом) порта 9090 хоста на порт 8080 внутрь контейнера podman run --detach --name mongodb docker.io/library/mongo:4.4.10 # запуск контейнера mongodb с именем mongodb в фоновом режиме. Данные будут удалены при удалении контейнера! podman ps # просмотр запущенных контейнеров podman ps -a # просмотр всех контейнеров (в том числе остановленных) podman stats --no-stream # просмотр статистики. Если у пользователя нет прав доступа root, то необходимо переключиться на cgroups v2 podman create alpine # создание контейнера из образа alpine podman start # запуск созданного контейнера. Вместо можно указать podman start --all # запуск всех созданных контейнеров podman stop # остановка контейнера. Вместо можно указать podman stop --all # остановка всех контейнеров podman rm # удаление контейнера. Вместо можно указать podman rm --all # удаление всех контейнеров # система podman system info # общая информация о системе podman system df # занятое место на диске podman system prune -af # удаление неиспользуемых данных и очистка диска
Хранение данных

При запуске контейнер получает доступ на чтение ко всем слоям образа, а также создает свой исполняемый слой с возможностью создавать, обновлять и удалять файлы. Все эти изменения не будут видны для файловой системы хоста и других контейнеров, даже если они используют тот же базовый образ. При удалении контейнера все измененные данные также будут удалены. В большинстве случаев это предпочтительное поведение, однако иногда данные необходимо расшарить между несколькими контейнерами или просто сохранить.

Рассмотрим два способа хранения данных контейнеров:

  • named volumes – именованные тома хранения данных
    Позволяет сохранять данные в именованный том, который располагается в каталоге в /var/lib/containers/storage/volumes или ~/.local/share/containers/storage/volumes и не удаляется при удалении контейнера. Том может быть подключен к нескольким контейнерам
  • bind mount – монтирование каталога с хоста
    Позволяет монтировать файл или каталог с хоста в контейнер. На практике используется для проброса конфигурационных файлов или каталога БД внутрь контейнера

Ниже приведены примеры использования named volume и bind mount:

# справочная информация podman --help # named volume podman run --detach --name jenkins --publish 8080:8080 --volume=jenkins_home:/var/jenkins_home/ docker.io/jenkins/jenkins:lts-jdk11 # запуск контейнера jenkins с подключением каталога /var/jenkins_home как тома jenkins_home podman volume ls # просмотр томов podman volume prune # удаление неиспользуемых томов и очистка диска. Для удаления тома все контейнеры, в которых он подключен, должны быть остановлены и удалены # bind mount # запуск контейнера node-exporter с монтированием каталогов внутрь контейнера в режиме ro (read only) podman run \ -p 9100:9100 \ -v "/proc:/host/proc:ro" \ -v "/sys:/host/sys:ro" \ -v "/:/rootfs:ro" \ --name node-exporter docker.io/prom/node-exporter:v1.1.2
Создание образов (Containerfile)

Создание и распространение образов – одна из основных задач Podman. Рассмотрим три способа создания образа:

  • commit изменений из контейнера
    Необходимо запустить контейнер из базового образа в интерактивном режиме, внести изменения и сохранить результат в образ с помощью команды commit. На практике способ удобен для небольших быстрых доработок
  • декларативное описание через Containerfile
    Необходимо создать файл Containerfile с декларативным описанием в формате yaml через текстовый редактор и запустить сборку образа командой build. Containerfile и Dockerfile полностью идентичны и взаимозаменяемы
  • сборка через утилиту buildah
    Читать подробнее:Introduction Tutorial

Ниже приведены примеры использования commit и build:

# справочная информация podman --help # commit # запуск контейнера из образа ubuntu в интерактивном режиме, установка утилиты ping и коммит образа под именем simust/ubuntu-ping:20.04 podman run -it --name ubuntu-ping ubuntu:20.04 bash apt update && apt install -y iputils-ping exit podman commit ubuntu-ping simust/ubuntu-ping:20.04 podman tag ubuntu-ping:20.04 ubuntu-ping:20.04 # Containerfile # создание файла Containerfile декларативного описания FROM ubuntu:20.04 RUN apt-get update && apt-get install -y iputils-ping # запуск команды build из каталога с Containerfile для создания образа ubuntu-ping:20.04 podman build -t ubuntu-ping:20.04 . # tag, login, push podman tag ubuntu-ping:20.04 quay.io/simust/ubuntu-ping:20.04 # создание из локального образа ubuntu-ping:20.04 тега с репозиторием для издателя simust # вход в репозиторий quay.io под пользователем simust и отправка образа podman login -u simust quay.io podman push quay.io/simust/ubuntu-ping:20.04

Обязательно пробуйте команды на практике, при необходимости прибегая к help или руководствам в Интернете.

Мультиконтейнерные приложения (Podman Compose и Podman Pod)

Podman Compose – это инструмент для декларативного описания и запуска приложений, состоящих из нескольких контейнеров. Фактически Podman Compose есть ни что иное, как реализация Docker Compose для Podman с учетом его особенностей (например, возможности работать с контейнерами без прав доступа root). Он использует yaml файл для настройки сервисов приложения и выполняет процесс создания и запуска всех контейнеров с помощью одной команды.

Podman Pod – это группа из одного или нескольких контейнеров с общим хранилищем и сетевыми ресурсами, а также спецификацией для запуска контейнеров. Концепция подов появилась и реализуется в Kubernetes.

Подсказки после практики

На практике при работе с контейнерами могут быть полезны следующие советы:

  • Для администрирования приложений в контейнерах следует использовать функционал systemd unit
    Управлять приложениями в контейнерах как обычными сервисами Linux очень удобно – настройка, запуск, остановка, восстановление при сбоях и др. действия становятся простыми и прозрачными
    Читать подробнее:Как запустить Docker / Podman контейнеры в качестве службы Systemd
  • Docker или Podman?
    Как определить, что лучше использовать – Docker или Podman? Критериев много, однозначного ответа нет, да и разница на сегодняшний день не так велика. Однако автор рекомендует использовать Podman во всех дистрибутивах, где приложила руку RedHat. Ubuntu, Debian и др. – Docker, RHEL, Fedora – Podman

За помощь в подготовке статьи автор выражает искреннюю благодарность @novikov0805, @Eviil и @KoPashka

Все статьи серии:

  1. Основы Linux (обзор с практическим уклоном)
  2. Основы виртуализации (обзор)
  3. Основы контейнеризации (обзор Docker и Podman)
  4. Основы мониторинга (обзор Prometheus и Grafana)

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

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