Что такое Docker?
Docker - это открытая платформа для разработки, доставки и запуска контейнерных приложений. С ее помощью упрощается автоматизация развертывания, масштабирования и управления приложениями в средах с поддержкой контейнеров.
Docker позволяет разработчикам и системным администраторам создавать контейнеры и упаковывать приложения со всем их зависимостями в контейнеры, которые можно легко переносить между различными средами (например, из локальной среды разработки на продакшн-сервер) без необходимости настраивать всё окружение с нуля.
Как устроен Docker
Основой Docker является базовый образ, который содержит все необходимые компоненты и зависимости для функционирования приложения. Разработчики обычно предпочитают использовать готовые образы вместо создания своих собственных, так как существует множество доступных образов для разных целей. Например, на docker hub.
Данные в Docker хранятся в виде слоев, доступных только для чтения, которые добавляются на базовый образ. Они создаются при внесении любых изменений в образ. Окончательный образ представляет собой комбинацию всех слоев. Каждый слой сохраняется для возможности быстрого возврата к предыдущему состоянию, что позволяет сэкономить место на диске и сократить время создания контейнера.
Контейнеры представляют собой тот же самый образ с дополнительным слоем для внесения изменений. Когда контейнер уничтожается, слой с внесенными изменениями удаляется. Если нужно, можно создать новый (чистый) контейнер на основе старого образа и его слоев.
Основные компоненты Docker
Docker Engine - основной компонент, который обеспечивает создание и работу с контейнерами
Docker CLI (Command Line Interface) - интерфейс командной строки для работы с Docker Engine
Docker Daemon - процесс, который управляет контейнерами и взаимодействует с Docker Engine
Docker Hub - облачный репозиторий для хранения и обмена образами контейнеров
Docker Compose - инструмент для определения и запуска многоконтейнерных приложений
Docker Swarm - оркестратор кластеров Docker, позволяющий работать с множеством узлов
Команды Docker
Работа с Docker построена на наборе команд, которые можно использовать для управления контейнерами и образами. Некоторые из наиболее часто используемых команд Docker:
docker run
- команда docker run запускает существующий образ и создает из него контейнер
docker build
- создает образ из Dockerfile
docker image ls
- выводит список всех образов локального репозитория
docker container ls
- выводит список всех контейнеров
docker pull
- скачивает образ из Docker Hub или другого реестра
docker push
- загружает образ в Docker Hub или другой реестр
docker rmi
- удаляет образ из локального репозитория
Установка Docker
Установить Docker можно на любую популярную ОС. В каждом случае процесс установки будет несколько отличаться, но эта процедура совсем несложная. Приведем пример установки Docker на Ubuntu 20.
-
Обновите список пакетов
sudo apt update
-
Установите несколько утилит, которые позволяют apt использовать пакеты через HTTPS
sudo apt install apt-transport-https ca-certificates curl software-properties-common
-
Добавьте GPG-ключ для официального репозитория Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
-
Добавьте репозиторий Docker в источники APT
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
-
Снова обновите базу данных пакетов
sudo apt update
-
Убедитесь, что установка будет выполняться из репозитория Docker, а не из репозитория Ubuntu
apt-cache policy docker-ce
-
Команда должна вернуть вывод следующего вида
docker-ce: Installed: (none) Candidate: 5:20.10.12~3-0~ubuntu-focal Version table: 5:20.10.12~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
-
Обратите внимание, что docker-ce не установлен, но является кандидатом для установки. Установим Docker
sudo apt install docker-ce
-
Проверим работоспособность демона Docker
sudo systemctl status docker
-
Команда должна вернуть отчет следующего вида
Если демон-процесс Docker автоматически не был запущен, выполните команду sudo service docker start и повторите sudo systemctl status docker.
-
Запустите тестовый контейнер
sudo docker run hello-world
-
В ответ Docker вернет следующее сообщение
Преимущества докерного контейнера
Контейнеры работают немного как VM, но гораздо более конкретным и гранулированным способом. Они изолируют одно приложение и его зависимости - все внешние библиотеки программного обеспечения, которые приложение должно запускать - как из базовой операционной системы, так и из других контейнеров. Все контейнеризованные приложения используют единую общую операционную систему (Linux или Windows), но они разделены друг от друга и от системы в целом.
Преимущества контейнеров Docker проявляются во многих местах. Вот некоторые из основных преимуществ Docker и контейнеров:
Docker обеспечивает более эффективное использование системных ресурсов
Экземпляры контейнеризованных приложений используют гораздо меньше памяти, чем виртуальные машины, они запускаются и останавливаются быстрее, и их можно упаковывать гораздо более плотно на их хост-аппаратное обеспечение. Все это сокращает расходы на ИТ.
Экономия затрат будет зависеть от того, какие приложения находятся в игре, и насколько ресурсоемкими они могут быть, но контейнеры неизменно работают более эффективно, чем виртуальные машины. Также можно сэкономить на стоимости лицензий на программное обеспечение, поскольку для запуска одинаковых рабочих нагрузок требуется гораздо меньше экземпляров операционной системы.
Docker обеспечивает более быстрый цикл доставки программного обеспечения
Программное обеспечение предприятия должно быстро реагировать на меняющиеся условия. Это как простое масштабирование для удовлетворения спроса, так и простое обновление для добавления новых функций, необходимых бизнесу.
Контейнеры-докеры позволяют легко выводить новые версии программного обеспечения с новыми бизнес-функциями в производство и быстро переходить к предыдущей версии, если вам нужно. Они также облегчают реализацию стратегий.
Docker позволяет переносить приложения
Там, где вы запускаете деловое приложение, - за брандмауэром, ради сохранения вещей и обеспечения безопасности; или в публичном облаке, для простого доступа общественности и высокой эластичности ресурсов. Поскольку контейнеры Docker инкапсулируют все приложения, которые необходимо запустить (и только их), они позволяют легко переносить приложения между средами. Любой хост с установленной версией Docker - будь то ноутбук разработчика или общедоступный облачный экземпляр - может запускать контейнер Docker.
Docker светит для архитектуры микросервисов
Легкие, портативные и автономные контейнеры Docker упрощают сбор программного обеспечения по линиям перспективного мышления, так что вы не пытаетесь решить проблемы завтрашнего дня со вчерашними методами разработки.
Один из контейнеров шаблонов программного обеспечения упрощается - это микросервисы, где приложения состоят из многих слабосвязанных компонентов. Разлагая традиционные «монолитные» приложения на отдельные сервисы, микросервисы позволяют масштабировать, модифицировать и обслуживать различные части бизнес-приложения отдельно - отдельными командами и отдельными временными рамками, если это соответствует потребностям бизнеса.
Контейнеры не требуются для внедрения микросервисов, но они отлично подходят для подхода к микросервисам и для гибких процессов разработки в целом.
Проблемы
Первое, что нужно помнить о контейнерах, - это тот же совет, который применим к любой программной технологии: это не серебряная пуля. Контейнеры-докеры сами по себе не могут решить каждую проблему. Особенно:
Docker не будет исправлять ваши проблемы с безопасностью
Программное обеспечение в контейнере может быть более безопасным по умолчанию, чем программное обеспечение, работающее на голом металле, но это похоже на то, что дом с закрытыми дверцами более безопасен, чем дом с разблокированными дверями. Он ничего не говорит о состоянии окрестности, о видимом присутствии ценных вещей, заманчивых для вора, подпрограммах людей, живущих там, и так далее. Контейнеры могут добавить уровень безопасности в приложение, но только как часть общей программы обеспечения безопасности приложения в контексте.
Docker не превращает приложения магически в микросервисы
Если вы контейнерируете существующее приложение, это может сократить потребление ресурсов и упростить развертывание. Но это не автоматически изменяет дизайн приложения или как он взаимодействует с другими приложениями. Эти преимущества приходят только за счет времени и усилий разработчиков, а не просто от того, чтобы вы переместите все в контейнеры. Поместите в контейнер старое школьное монолитное приложение или приложение в стиле SOA, и в итоге вы получите старое приложение в контейнере. Это не делает его более полезным для вашей работы; во всяком случае, это может сделать его менее полезным.
Docker не заменяет виртуальные машины
Один упорный миф о контейнерах заключается в том, что они делают устаревшие виртуальные машины. Многие приложения, которые использовались для работы в виртуальной машине, могут быть перемещены в контейнер, но это не значит, что все они могут или должны. Например, если вы находитесь в отрасли с тяжелыми нормативными требованиями, возможно, вы не сможете обменять контейнеры для виртуальных машин, поскольку виртуальные машины обеспечивают большую изоляцию, чем контейнеры.
Работы по развитию предпринимательства печально известны тем, что они скрыты и не реагируют на изменения. Предприятия-разработчики все время сталкиваются с такими ограничениями, наложенными на них ИТ, требованиями, предъявляемыми ими бизнесом в целом. Докер и контейнеры предоставляют разработчикам больше свободы, которую они жаждут, и в то же время предоставляют способы создания бизнес-приложений, которые быстро реагируют на меняющиеся условия ведения бизнеса.
Другие сервисы для работы с контейнерами
Работа с Docker не является единственным решением для управления контейнерами. Есть несколько других сервисов, которые предлагают аналогичные функции.
Kubernetes. Открытый проект Google, который позволяет развертывать, масштабировать и управлять контейнеризированными приложениями в облаке или на локальных серверах.
Amazon Elastic Container Service (ECS). Облачный сервис AWS, который предоставляет оркестрацию контейнеров и позволяет легко развертывать, масштабировать и управлять контейнерными приложениями.
Microsoft Azure Container Service. Аналогичный сервис от Microsoft, который предлагает оркестрацию контейнеров, управляемые кластеры Kubernetes и многое другое.
Google Kubernetes Engine (GKE). Управляемый сервис Kubernetes от Google, который упрощает развертывание, масштабирование и управление кластерами Kubernetes.