Что такое Docker?
Docker — это платформа для разработки, доставки и запуска приложений в изолированных контейнерах. Контейнер — это легковесная, переносимая единица программного обеспечения, которая содержит всё необходимое для запуска приложения: код, библиотеки, системные инструменты и настройки.
Представьте, что вы переезжаете. Вместо того чтобы перевозить каждый предмет отдельно и потом собирать мебель заново, вы упаковываете всё в контейнер. Контейнер можно перевезти куда угодно, и всё внутри останется на своих местах. Docker делает то же самое с приложениями: упаковывает их со всеми зависимостями в "контейнер", который можно запустить на любой системе.
Docker vs Виртуальные машины
Многие путают Docker с виртуальными машинами, но это разные технологии:
Контейнеры эффективнее виртуальных машин, потому что они делят ядро операционной системы с хостом, а не создают отдельную ОС для каждого приложения.
Зачем нужен Docker?
Docker решает несколько критических проблем в разработке и развёртывании приложений:
1. Проблема "У меня работает, а у тебя нет"
Классическая ситуация: приложение отлично работает на вашем компьютере, но не запускается на сервере или у коллеги. Причины могут быть разные:
Docker решает эту проблему, упаковывая приложение со всеми зависимостями в контейнер, который работает одинаково везде.
2. Упрощение развёртывания
Без Docker развёртывание приложения может включать:
С Docker достаточно запустить один контейнер — всё уже настроено и готово к работе.
3. Масштабируемость
Docker позволяет легко масштабировать приложения: если нужно обработать больше запросов, просто запустите больше контейнеров. Это основа современных микросервисных архитектур.
4. Изоляция
Каждое приложение работает в своём изолированном контейнере. Если одно приложение упадёт или будет скомпрометировано, это не повлияет на другие.
Основные понятия Docker
Чтобы работать с Docker, нужно понять несколько ключевых концепций:
1. Образ (Image)
Образ — это шаблон для создания контейнеров. Это неизменяемый файл, который содержит всё необходимое для запуска приложения: код, библиотеки, зависимости, конфигурацию. Образы можно сравнить с "классом" в программировании, а контейнер — это "экземпляр" этого класса.
Образы хранятся в реестрах (registry), самый популярный — Docker Hub. Вы можете использовать готовые образы или создавать свои.
2. Контейнер (Container)
Контейнер — это запущенный экземпляр образа. Это изолированная среда, где работает ваше приложение. Можно запустить несколько контейнеров из одного образа — они будут независимы друг от друга.
3. Dockerfile
Dockerfile — это текстовый файл с инструкциями для создания образа. В нём описывается, какая базовая ОС использовать, какие пакеты установить, какой код скопировать и как запустить приложение.
4. Docker Compose
Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений. В одном файле описываются все сервисы, их зависимости и настройки, и всё это запускается одной командой.
5. Реестр (Registry)
Реестр — это хранилище образов Docker. Docker Hub — публичный реестр, где можно найти тысячи готовых образов. Также можно использовать приватные реестры для собственных образов.
- Образ = рецепт торта (инструкция)
- Контейнер = испечённый торт (результат)
- Dockerfile = запись рецепта на бумаге
- Docker Hub = кулинарная книга с рецептами
Установка Docker
Установка Docker зависит от вашей операционной системы:
Windows
- Скачайте Docker Desktop с официального сайта docker.com
- Запустите установщик и следуйте инструкциям
- После установки перезагрузите компьютер
- Запустите Docker Desktop — он должен появиться в системном трее
macOS
- Скачайте Docker Desktop для Mac с официального сайта
- Откройте скачанный .dmg файл и перетащите Docker в папку Applications
- Запустите Docker из Applications
- Примите лицензионное соглашение и введите пароль администратора
Linux (Ubuntu/Debian)
Проверка установки
После установки откройте терминал и выполните:
Если вы увидели приветственное сообщение от Docker, установка прошла успешно!
Первые шаги с Docker
Давайте начнём с базовых команд Docker:
Основные команды
Практический пример: запуск веб-сервера
Давайте запустим веб-сервер Nginx в контейнере:
Разберём команду:
Теперь откройте браузер и перейдите по адресу http://localhost:8080 — вы увидите страницу приветствия Nginx!
-p 8081:80.
Создание Dockerfile
Dockerfile — это инструкция для создания собственного образа. Давайте создадим простой Dockerfile для Python-приложения:
Разбор Dockerfile
Сборка образа
Чтобы создать образ из Dockerfile, используйте команду:
Где:
Запуск контейнера из собственного образа
Docker Compose
Docker Compose упрощает работу с многоконтейнерными приложениями. Вместо запуска нескольких контейнеров отдельными командами, вы описываете всё в одном файле docker-compose.yml.
Пример docker-compose.yml
Создадим простое приложение с веб-сервером и базой данных:
Основные команды Docker Compose
Лучшие практики Docker
Следуя этим рекомендациям, вы создадите эффективные и безопасные контейнеры:
1. Используйте .dockerignore
Создайте файл .dockerignore, чтобы исключить ненужные файлы из образа (аналогично .gitignore):
2. Используйте многоэтапную сборку
Для уменьшения размера образа используйте многоэтапную сборку (multi-stage build):
3. Не запускайте контейнеры от root
Создавайте отдельного пользователя для запуска приложения:
4. Используйте конкретные версии образов
Вместо FROM python:latest используйте FROM python:3.9-slim. Это обеспечит предсказуемость и стабильность.
5. Кэшируйте зависимости
Копируйте файлы зависимостей перед копированием кода, чтобы использовать кэш Docker:
6. Используйте переменные окружения
Не хардкодьте конфигурацию в образ. Используйте переменные окружения или файлы конфигурации, монтируемые как volumes.
Заключение
Docker — это мощный инструмент, который изменил способ разработки и развёртывания приложений. Он решает проблемы совместимости, упрощает развёртывание и делает приложения более переносимыми и масштабируемыми.
Что мы изучили:
Попробуйте создать свой первый Dockerfile для одного из ваших проектов. Начните с простого приложения и постепенно усложняйте. Изучите Docker Hub — там много готовых образов, которые можно использовать как основу. Практика — лучший способ освоить Docker!
Docker стал стандартом в современной разработке. Знание Docker — это не просто полезный навык, а необходимость для любого разработчика, который хочет работать с современными технологиями и практиками DevOps.