Docker для начинающих: контейнеры, Docker Compose и первый деплой в 2026
«У меня работает» — фраза, которая вызывает смех (или ужас) у любого разработчика. Docker — это инструмент, который делает эту фразу бессмысленной: если работает у вас, будет работать везде. Разбираемся, что это такое и как начать.
Что такое Docker и зачем он нужен
Docker — это платформа для контейнеризации приложений. Контейнер — это изолированная среда, в которой находится ваше приложение со всеми его зависимостями: нужной версией Node.js, нужными библиотеками, конфигурацией.
Представьте, что вы упаковываете не только приложение, но и весь «компьютер», на котором оно работает, в один портативный ящик.
Почему это важно для разработчика:
- Новый разработчик в команде запускает проект одной командой — не тратит день на настройку окружения.
- На продакшн-сервере приложение ведёт себя точно так же, как на вашем ноутбуке.
- Можно одновременно запускать несколько проектов с разными версиями Node.js без конфликтов.
- Деплой на любой сервер — одна команда.
Docker vs виртуальная машина
Распространённая путаница: Docker — это не виртуальная машина.
| Виртуальная машина | Docker контейнер | |
|---|---|---|
| Запуск | Минуты | Секунды |
| Размер | Гигабайты | Мегабайты |
| Изоляция | Полная ОС | Процессы ОС |
| Потребление RAM | Высокое | Минимальное |
Контейнер использует ядро хостовой ОС, поэтому он намного легче и быстрее VM.
Установка Docker
Docker Desktop (Windows и macOS)
Скачайте Docker Desktop на docker.com/get-started. Это графическая оболочка, которая включает Docker Engine, Docker Compose и удобный интерфейс управления.
Важно для Windows: Требуется включённый WSL 2 (Windows Subsystem for Linux). Docker Desktop подскажет, как это сделать при установке.
Docker на Ubuntu (Linux)
# Обновляем пакеты
sudo apt update
# Устанавливаем Docker
sudo apt install docker.io -y
# Запускаем и добавляем в автозагрузку
sudo systemctl start docker
sudo systemctl enable docker
# Добавляем пользователя в группу docker (чтобы не писать sudo)
sudo usermod -aG docker $USER
После этого перезайдите в систему — Docker готов.
Первый Docker контейнер
Проверьте, что всё установлено:
docker --version
# Docker version 27.x.x
Запустите первый контейнер:
docker run hello-world
Docker скачает образ hello-world и запустит его. Вы увидите приветственное сообщение — контейнер работает.
Ключевые концепции Docker
Image (образ)
Image — это шаблон для создания контейнера. Неизменяемый «слепок» файловой системы с приложением. Образы хранятся на Docker Hub — публичном реестре, как npm для пакетов.
# Скачать образ Node.js 22
docker pull node:22-alpine
# Список загруженных образов
docker images
Container (контейнер)
Контейнер — это запущенный экземпляр образа. Один образ → сколько угодно контейнеров.
# Запустить контейнер с Node.js в интерактивном режиме
docker run -it node:22-alpine node
# Запустить nginx веб-сервер на порту 8080
docker run -d -p 8080:80 nginx
# Список запущенных контейнеров
docker ps
# Остановить контейнер
docker stop <container_id>
Dockerfile
Dockerfile — это инструкция по сборке вашего образа. Пример для Node.js приложения:
# Базовый образ
FROM node:22-alpine
# Рабочая директория внутри контейнера
WORKDIR /app
# Копируем файлы зависимостей
COPY package*.json ./
# Устанавливаем зависимости
RUN npm ci --only=production
# Копируем исходный код
COPY . .
# Открываем порт
EXPOSE 3000
# Команда запуска
CMD ["node", "server.js"]
Собираем и запускаем:
# Сборка образа
docker build -t my-app .
# Запуск контейнера
docker run -p 3000:3000 my-app
Docker Compose: управление несколькими сервисами
Реальное приложение — это не один контейнер. Обычно: сервер + база данных + кэш + очередь. Docker Compose позволяет описать всю систему в одном файле и запускать её одной командой.
Пример docker-compose.yml для Full Stack приложения:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/myapp
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:
Запуск:
# Запустить все сервисы в фоне
docker compose up -d
# Посмотреть логи
docker compose logs -f app
# Остановить всё
docker compose down
Теперь любой разработчик в команде может запустить весь проект одной командой — никакой установки PostgreSQL вручную.
Типичные команды Docker, которые используют каждый день
# Запуск контейнера
docker run -d -p 8080:80 --name my-nginx nginx
# Зайти внутрь контейнера
docker exec -it my-nginx sh
# Логи контейнера
docker logs -f my-nginx
# Удалить остановленные контейнеры
docker container prune
# Удалить неиспользуемые образы
docker image prune
# Полная очистка (осторожно!)
docker system prune -af
Docker в CI/CD
В production-процессе Docker используется в паре с CI/CD пайплайном (GitHub Actions, GitLab CI):
- Push кода → триггер пайплайна.
- Сборка Docker образа → автоматические тесты.
- Push образа в реестр (Docker Hub, Yandex Container Registry).
- Деплой на сервер через
docker compose pull && docker compose up -d.
Это стандартный рабочий процесс в современных командах.
Итог
Docker — это не сложно. Это инструмент, который делает вашу работу предсказуемой и профессиональной. После знакомства с ним вы будете смотреть на деплой без Docker как на хаос.
В курсе Full Stack разработчика Docker рассматривается в модуле 17 вместе с CI/CD, reverse proxy, TLS и наблюдаемостью — всё, что нужно для реального продакшна.