Что такое Docker?
Docker — это открытая платформа для разработки, доставки и запуска приложений. Её главная идея — отделить приложения от инфраструктуры, чтобы разработчики и администраторы могли работать с ними одинаково эффективно. Добиться этого позволяют так называемые контейнеры.
Представьте себе контейнер как лёгкую, самодостаточную упаковку для вашего приложения. Внутри неё есть всё, что нужно для работы: код, системные библиотеки, настройки — и при этом она не зависит от того, что установлено на самом компьютере. Это значит, что приложение, упакованное в контейнер, будет одинаково работать на ноутбуке разработчика, на тестовом сервере и в облаке продакшна.
Что даёт использование Docker?
Подход Docker меняет весь цикл жизни приложения — от написания кода до выкатки в промышленную среду. Вот несколько ключевых сценариев.
- Быстрая и предсказуемая доставка. Разработчики работают в одинаковых окружениях, что исключает проблемы «на моей машине работает». Контейнер становится единицей обмена: его тестируют, передают коллегам и в итоге отправляют заказчику. Если баг найден на позднем этапе, его исправляют в контейнере разработчика и мгновенно пересобирают образ для тестовой среды — без танцев с бубном.
- Гибкое развёртывание и масштабирование. Контейнеры невероятно портативны. Один и тот же контейнер можно запустить на личном ноутбуке, на физическом сервере в дата-центре или в любом облаке. Когда нагрузка растёт, система может в реальном времени создать десятки новых копий контейнера, а когда падает — остановить лишние.
- Эффективное использование ресурсов. В отличие от виртуальных машин, которые эмулируют целую операционную систему, контейнеры используют ядро хоста и потребляют меньше памяти и процессора. Это позволяет запускать гораздо больше приложений на том же оборудовании, что даёт ощутимую экономию.
Как устроен Docker: архитектура
Docker использует классическую клиент-серверную архитектуру. Вы взаимодействуете с клиентом (команда docker), а он отправляет команды серверу — демону dockerd, который и делает всю тяжёлую работу: строит образы, запускает контейнеры, управляет сетями.
- Docker-клиент (docker) — это основная программа, с которой работают пользователи. Когда вы пишете
docker run, клиент передаёт этот запрос демону. - Docker-демон (dockerd) — фоновый процесс, который управляет объектами Docker: образами, контейнерами, томами и сетями. Он постоянно слушает API-запросы.
- Docker Desktop — удобное приложение для Mac, Windows и Linux, которое включает в себя и клиент, и демон, и множество полезных дополнений (например, Kubernetes или Docker Compose).
- Реестры (registries) — это хранилища Docker-образов. Публичный реестр Docker Hub содержит тысячи готовых образов (например, Ubuntu, PostgreSQL). Вы можете скачать образ командой
docker pullили загрузить свой собственный командойdocker push. Можно также развернуть свой приватный реестр внутри компании.
Основные объекты Docker
В повседневной работе вы будете постоянно сталкиваться с несколькими ключевыми понятиями.
- Образ (Image). Это шаблон, «слепок» файловой системы с инструкциями для создания контейнера. Образ — это read-only (только для чтения). Вы создаёте образ с помощью файла
Dockerfile, где описываете все шаги: взять за основу Ubuntu, установить Apache, скопировать код приложения. Каждая инструкция в Dockerfile создаёт новый слой. Это позволяет переиспользовать слои и ускоряет сборку. - Контейнер (Container). Это запущенный экземпляр образа. Вы можете создать, запустить, остановить, удалить контейнер. Когда контейнер запускается, поверх слоёв образа создаётся тонкий слой для записи. Все изменения, которые делает приложение (например, логи или временные файлы), сохраняются здесь. Если вы удалите контейнер, этот слой исчезнет, если только вы специально не сохранили данные в постоянное хранилище (volume).
Пример команды docker run -i -t ubuntu /bin/bash делает следующее: если образа Ubuntu нет локально, он скачивается из реестра, создаётся новый контейнер, ему выделяется файловая система для записи, создаётся сетевой интерфейс, и запускается командная оболочка /bin/bash. Вы оказываетесь внутри контейнера и можете с ним работать. Когда вы вводите exit, контейнер останавливается, но не удаляется — его можно запустить снова.
Что под капотом?
Docker написан на Go и использует возможности ядра Linux, в первую очередь механизм пространств имён (namespaces). Когда запускается контейнер, Docker создаёт для него изолированные пространства: своя файловая система, свои процессы, своя сеть. Процессу внутри контейнера кажется, что он работает на совершенно отдельной машине. Это и обеспечивает ту лёгкую изоляцию, которая делает Docker таким безопасным и удобным.