Docker — это программное обеспечение для контейнеризации приложений. Сегодня мы поговорим о том, что такое контейнеризация и Docker, а также об их преимуществах.
Контейнеризация — это один из методов виртуализации. Поэтому сделаем небольшое лирическое отступление, чтобы понять, откуда растут ноги.
В 60-х годах компьютеры не могли решать сразу несколько задач — только одну. Это приводило к большим очередям к такому редкому устройству. Решением этой проблемы стало распределение вычислительных мощностей между разными изолированными друг от друга процессами. Так началась история виртуализации.
Виртуализация — это предоставление вычислительных мощностей изолированным процессам в рамках одного физического устройства.
Основное развитие виртуализации пришлось на эпоху интернета. Представьте, вы — предприниматель и хотите иметь сайт своей компании. Для этого нужен сервер, подключенный ко всемирной паутине. Например, сейчас для этого достаточно зайти на сайт timeweb.cloud и выбрать подходящий под ваши нужды сервер. Однако раньше, в самом начале развития интернета, таких удобных сервисов не было. Поэтому компаниям приходилось самостоятельно приобретать серверы и обслуживать их. Это неудобно и дорого. Такая боль вылилась в появление компаний-провайдеров, берущих на себя все серверные тяготы. Они закупали оборудование, размещали их в своих помещениях и сдавали серверы в аренду.
Прогресс шел, компьютеры становились мощнее, и целый серверный компьютер для сайта стал избыточным. На помощь пришла виртуализация: на одном компьютере запускались несколько изолированных друг от друга виртуальных машин, на которых размещались сайты. Технология виртуализации позволила выделять каждому серверу столько ресурсов, сколько ему нужно.
Но и этого было недостаточно. С развитием интернета количество приложений, необходимых для работы сайта, увеличивалось. У каждого из них имелись свои зависимости, и в одной виртуальной машине им стало «тесновато». Одним из решений этой дилеммы стало размещение их в собственных виртуальных машинах. Получалась такая виртуальная матрешка. Однако полноценная виртуальная машина также избыточна для одной программы: ей не нужен весь её функционал. При этом виртуальная машина потребляет много ресурсов, часть которых идет в «никуда». Решением этой проблемы стала контейнеризация. Вместо того, чтобы запускать для каждого приложения свою виртуальную машину, разработчики придумали запускать их изолированно друг от друга в одной операционной системе. Получался такой контейнер: приложение, его зависимости и библиотеки.
Контейнер — изолированная среда с приложением, его зависимостями и библиотеками.
Что такое программа? Это какой-то код, который необходимо выполнить на центральном процессоре. При запуске приложения в контейнере запускается докер-процесс, внутри которого запускается само приложение. Запущенный контейнер для хост-системы выглядит как обычный процесс, а для программы в контейнере всё выглядит так, будто оно уникальное. Из-за изолированности единственный способ обмениваться данными между контейнерами — это сеть. Как будто программа в контейнере пытается связаться с другим физическим компьютером. Docker решает вопросы взаимодействия контейнеров.
Изолированность от операционной система хоста задает резонный вопрос: как хранить данные? Существует два пути: docker volume и bind mount.
Docker volume — это хранилище, которое создает сам докер. Оно может быть расположено где угодно: в файловой системе основной ОС или на каком-нибудь сервере.
Bind mount — это хранилище, которое пользователь сам создает на хост-машине, и при работе оно монтируется в контейнеры.
В структуре Docker можно выделить 7 основных компонентов:
Основной компьютер, на котором запущен докер.
«Движок» докера, отвечающий за контейнеры.
Программа или интерфейс для управления всем процессом.
Так называемый образ контейнера. Он похож на дистрибутив какой-нибудь игры. Чтобы начать играть, её необходимо сначала установить, как и образ.
Текстовый документ, описывающий, как нужно развернуть или установить образ контейнера (Docker image).
Слова излишни. Это контейнер.
Репозиторий для образов — место, куда разработчики загружают свои образы. Существуют как частные, так и публичные. Самый популярный публичный репозиторий — Docker Hub. На него по умолчанию настроен Docker. В нем можно найти самые популярные программы и не только.
Docker Hub закрыл доступ к своему сервису пользователям из России. Мы подготовили бесплатный прокси, который возобновляет этот доступ.
Что даёт изолированность с точки зрения безопасности? Во-первых, изолированное приложение не может навредить операционной системе хоста. Во-вторых, у изолированного приложения нет доступа к файловой система хоста, что исключает возможность кражи конфиденциальных данных. В-третьих, любая ошибка, связанная с приложением, не затронет операционную систему.
Образ контейнера можно запустить на любом устройстве с Docker-ом.
Docker берет на себя всю работу, связанную с запуском приложений и их настройкой. Автоматизация позволяет экономить время и снизить влияние человеческого риска.
Пользователям Docker доступны репозитории с тысячами образов, которые можно использовать в своей работе.
Docker позволяет экономить вычислительные ресурсы. Контейнерам, в отличие от виртуальных машин, для работы не требуется собственный экземпляр ОС.
Перейдем от слов к практике. Первое, что нам необходимо сделать — установить докер.
Установка Docker начинается с посещения официального сайта ПО docker.com. Переходим в раздел «Get Started» и выбираем соответствующую вашей ОС версию докера. В нашем случае это Windows. Инструкцию для установки докера на другие операционные системы можно найти здесь. По окончании установки потребуется перезагрузка компьютера.
Для работы Docker потребуется гипервизор. Гипервизор — это специальное ПО, необходимое для параллельной работы нескольких операционных систем. Docker предложит вам включить Hyper-V в Windows или загрузить WSL2. Мы выберем последний вариант, поскольку не во все версии Windows включен Hyper-V (например, в домашней версии его нет).
Docker сам установит WSL2, но вам потребуется самостоятельно загрузить обновления для ядра Linux. Переходим на сайт Microsoft, загружаем и устанавливаем последний пакет обновлений. После перезагрузки Docker Desktop нас встретит готовый к работе клиент Docker-а.
Выведем в консоль фразу «Hello, World». Для этого воспользуемся следующим скриптом Python:
#!/usr/bin/python3
print("Hello World")
Поскольку мы запускаем скрипт не напрямую, нам нужен шебанг. В нашем скрипте это первая строка. Если вкратце, то шебанг необходим для того, чтобы ядро Linux знало, как запускать скрипт. Назовем наш скрипт классически: main.py.
Теперь перейдем к командной строке. Чтобы запустить наш скрипт, потребуется следующая команда:
docker run -v D:\script_dir:/dir python:3 /dir/main.py
Разберем её элементы:
docker run
— запуск контейнера;-v
— команда монтирования каталога (bind mount);D:\script_dir
— монтируемый каталог с нашим скриптом;/dir
— место, куда мы монтируем каталог со скриптом;python:3
— образ;/dir/main.py
— наш скрипт, в данном случае исполняемый файл.Что происходит при введении этой команды? Docker ищет образ python 3 сначала на хосте, а потом в репозитории и развертывает его. Затем он монтирует туда каталог с нашим скриптом, чтобы было что запускать. После этого он запускает наш скрипт.
В этой статье мы разобрали, что такое Docker, как он работает и попробовали запустить свой первый скрипт. Docker и контейнеризация — это не панацея, но это очень полезный инструмент при разработке, который не стоит обходить стороной.