Docker для начинающих: основы контейнеризации

Что такое Docker, зачем он нужен и как начать использовать контейнеры

Время чтения: 20 минут
Docker, Контейнеризация, DevOps

Что такое Docker?

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

Простыми словами:

Представьте, что вы переезжаете. Вместо того чтобы перевозить каждый предмет отдельно и потом собирать мебель заново, вы упаковываете всё в контейнер. Контейнер можно перевезти куда угодно, и всё внутри останется на своих местах. Docker делает то же самое с приложениями: упаковывает их со всеми зависимостями в "контейнер", который можно запустить на любой системе.

Docker vs Виртуальные машины

Многие путают Docker с виртуальными машинами, но это разные технологии:

Виртуальная машина (VM):
  • Полностью эмулирует операционную систему
  • Требует много ресурсов (память, процессор, место на диске)
  • Медленный запуск (минуты)
  • Изоляция на уровне железа
Docker контейнер:
  • Использует ядро хостовой ОС
  • Легковесный (мегабайты вместо гигабайт)
  • Быстрый запуск (секунды)
  • Изоляция на уровне процессов

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

Зачем нужен Docker?

Docker решает несколько критических проблем в разработке и развёртывании приложений:

1. Проблема "У меня работает, а у тебя нет"

Классическая ситуация: приложение отлично работает на вашем компьютере, но не запускается на сервере или у коллеги. Причины могут быть разные:

  • Разные версии библиотек
  • Отсутствующие зависимости
  • Различия в операционных системах
  • Разные настройки окружения

Docker решает эту проблему, упаковывая приложение со всеми зависимостями в контейнер, который работает одинаково везде.

2. Упрощение развёртывания

Без Docker развёртывание приложения может включать:

  • Установку операционной системы
  • Настройку веб-сервера
  • Установку баз данных
  • Настройку переменных окружения
  • Установку зависимостей приложения

С Docker достаточно запустить один контейнер — всё уже настроено и готово к работе.

3. Масштабируемость

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

4. Изоляция

Каждое приложение работает в своём изолированном контейнере. Если одно приложение упадёт или будет скомпрометировано, это не повлияет на другие.

Реальный пример: Представьте, что у вас есть веб-приложение на Python 3.9, база данных PostgreSQL и Redis для кэширования. Вместо того чтобы устанавливать всё это на сервер вручную, вы создаёте три контейнера и запускаете их одной командой. Это занимает минуты вместо часов.

Основные понятия 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

  1. Скачайте Docker Desktop с официального сайта docker.com
  2. Запустите установщик и следуйте инструкциям
  3. После установки перезагрузите компьютер
  4. Запустите Docker Desktop — он должен появиться в системном трее

macOS

  1. Скачайте Docker Desktop для Mac с официального сайта
  2. Откройте скачанный .dmg файл и перетащите Docker в папку Applications
  3. Запустите Docker из Applications
  4. Примите лицензионное соглашение и введите пароль администратора

Linux (Ubuntu/Debian)

Установка Docker на Linux
# Обновляем список пакетов sudo apt update # Устанавливаем необходимые пакеты sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release # Добавляем официальный GPG ключ Docker curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # Добавляем репозиторий Docker echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Устанавливаем Docker sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io # Проверяем установку docker --version

Проверка установки

После установки откройте терминал и выполните:

Проверка Docker
docker --version docker run hello-world

Если вы увидели приветственное сообщение от Docker, установка прошла успешно!

Первые шаги с Docker

Давайте начнём с базовых команд Docker:

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

Просмотр доступных образов
docker images
Загрузка образа из Docker Hub
docker pull nginx
Запуск контейнера
docker run nginx
Запуск контейнера в фоновом режиме
docker run -d nginx
Просмотр запущенных контейнеров
docker ps
Просмотр всех контейнеров (включая остановленные)
docker ps -a
Остановка контейнера
docker stop <container_id>
Удаление контейнера
docker rm <container_id>
Удаление образа
docker rmi <image_id>

Практический пример: запуск веб-сервера

Давайте запустим веб-сервер Nginx в контейнере:

Запуск Nginx с пробросом портов
docker run -d -p 8080:80 --name my-nginx nginx

Разберём команду:

  • -d — запуск в фоновом режиме (detached)
  • -p 8080:80 — проброс портов (порт хоста:порт контейнера)
  • --name my-nginx — имя контейнера
  • nginx — образ для использования

Теперь откройте браузер и перейдите по адресу http://localhost:8080 — вы увидите страницу приветствия Nginx!

Важно: Если порт 8080 уже занят, используйте другой порт, например, -p 8081:80.

Создание Dockerfile

Dockerfile — это инструкция для создания собственного образа. Давайте создадим простой Dockerfile для Python-приложения:

Пример Dockerfile для Python-приложения
# Используем официальный образ Python FROM python:3.9-slim # Устанавливаем рабочую директорию WORKDIR /app # Копируем файл с зависимостями COPY requirements.txt . # Устанавливаем зависимости RUN pip install --no-cache-dir -r requirements.txt # Копируем код приложения COPY . . # Открываем порт EXPOSE 8000 # Команда для запуска приложения CMD ["python", "app.py"]

Разбор Dockerfile

  • FROM — базовый образ (от чего наследуемся)
  • WORKDIR — рабочая директория внутри контейнера
  • COPY — копирование файлов с хоста в контейнер
  • RUN — выполнение команды во время сборки образа
  • EXPOSE — объявление порта, который будет использоваться
  • CMD — команда, которая выполнится при запуске контейнера

Сборка образа

Чтобы создать образ из Dockerfile, используйте команду:

Сборка образа
docker build -t my-python-app .

Где:

  • -t my-python-app — имя и тег образа
  • . — путь к директории с Dockerfile (текущая директория)

Запуск контейнера из собственного образа

Запуск контейнера
docker run -p 8000:8000 my-python-app

Docker Compose

Docker Compose упрощает работу с многоконтейнерными приложениями. Вместо запуска нескольких контейнеров отдельными командами, вы описываете всё в одном файле docker-compose.yml.

Пример docker-compose.yml

Создадим простое приложение с веб-сервером и базой данных:

docker-compose.yml
version: '3.8' services: web: build: . ports: - "5000:5000" depends_on: - db environment: - DATABASE_URL=postgresql://user:password@db:5432/mydb db: image: postgres:13 environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=mydb volumes: - postgres_data:/var/lib/postgresql/data volumes: postgres_data:

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

Запуск всех сервисов
docker-compose up
Запуск в фоновом режиме
docker-compose up -d
Остановка всех сервисов
docker-compose down
Просмотр логов
docker-compose logs
Пересборка образов
docker-compose build
Преимущества Docker Compose: Одна команда запускает всё приложение со всеми зависимостями. Это особенно полезно для разработки, когда нужно быстро поднять локальное окружение.

Лучшие практики Docker

Следуя этим рекомендациям, вы создадите эффективные и безопасные контейнеры:

1. Используйте .dockerignore

Создайте файл .dockerignore, чтобы исключить ненужные файлы из образа (аналогично .gitignore):

.dockerignore
node_modules .git .env *.log .DS_Store

2. Используйте многоэтапную сборку

Для уменьшения размера образа используйте многоэтапную сборку (multi-stage build):

Многоэтапная сборка
# Этап сборки FROM node:16 AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Этап запуска FROM node:16-slim WORKDIR /app COPY --from=builder /app/dist ./dist COPY package*.json ./ RUN npm install --production CMD ["node", "dist/index.js"]

3. Не запускайте контейнеры от root

Создавайте отдельного пользователя для запуска приложения:

Создание пользователя
RUN useradd -m -u 1000 appuser USER appuser

4. Используйте конкретные версии образов

Вместо FROM python:latest используйте FROM python:3.9-slim. Это обеспечит предсказуемость и стабильность.

5. Кэшируйте зависимости

Копируйте файлы зависимостей перед копированием кода, чтобы использовать кэш Docker:

Правильный порядок команд
# Сначала зависимости COPY requirements.txt . RUN pip install -r requirements.txt # Потом код COPY . .

6. Используйте переменные окружения

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

Заключение

Docker — это мощный инструмент, который изменил способ разработки и развёртывания приложений. Он решает проблемы совместимости, упрощает развёртывание и делает приложения более переносимыми и масштабируемыми.

Что мы изучили:

  • Что такое Docker и зачем он нужен
  • Основные понятия: образы, контейнеры, Dockerfile
  • Как установить Docker
  • Базовые команды для работы с контейнерами
  • Как создать собственный Dockerfile
  • Использование Docker Compose для многоконтейнерных приложений
  • Лучшие практики работы с Docker
Следующие шаги:

Попробуйте создать свой первый Dockerfile для одного из ваших проектов. Начните с простого приложения и постепенно усложняйте. Изучите Docker Hub — там много готовых образов, которые можно использовать как основу. Практика — лучший способ освоить Docker!

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