Что такое Docker
Зачем нужно
Docker — платформа для контейнеризации приложений. Контейнер упаковывает приложение со всеми зависимостями в изолированную среду, которая одинаково работает на любом компьютере. Больше никакого «у меня работает, а у тебя нет».
Ключевая идея: ship the environment, not just the code.
Где используется
- Разработка — единая среда для всей команды
- CI/CD — тесты и сборка в контейнерах
- Деплой — предсказуемое развёртывание на серверах
- Микросервисы — каждый сервис в своём контейнере
- Обучение — быстрый запуск нужного окружения
Containers vs Virtual Machines
┌──────────────────────┐ ┌──────────────────────┐
│ VM │ │ Container │
│ ┌──────┐ ┌──────┐ │ │ ┌──────┐ ┌──────┐ │
│ │ App1 │ │ App2 │ │ │ │ App1 │ │ App2 │ │
│ ├──────┤ ├──────┤ │ │ ├──────┤ ├──────┤ │
│ │Libs/B│ │Libs/B│ │ │ │Libs/B│ │Libs/B│ │
│ ├──────┤ ├──────┤ │ │ └──────┘ └──────┘ │
│ │GuestOS│ │GuestOS│ │ │ ┌──────────────────┐ │
│ └──────┘ └──────┘ │ │ │ Docker Engine │ │
│ ┌──────────────────┐ │ │ └──────────────────┘ │
│ │ Hypervisor │ │ │ ┌──────────────────┐ │
│ └──────────────────┘ │ │ │ Host OS │ │
│ ┌──────────────────┐ │ │ └──────────────────┘ │
│ │ Host OS │ │ └──────────────────────┘
│ └──────────────────┘ │
└──────────────────────┘
| Параметр | VM | Container |
|---|---|---|
| Размер | Гигабайты | Мегабайты |
| Запуск | Минуты | Секунды |
| Изоляция | Полная (свой OS) | На уровне процесса |
| Потребление ресурсов | Высокое | Низкое |
| Переносимость | Средняя | Высокая |
Основные понятия
Image (Образ)
Неизменяемый шаблон для создания контейнеров. Содержит OS, зависимости и приложение.
# Скачать образ
docker pull node:20-alpine
# Посмотреть все образы
docker images
Container (Контейнер)
Запущенный экземпляр образа. Можно создать несколько контейнеров из одного образа.
# Создать и запустить контейнер
docker run -d -p 3000:3000 --name my-app node:20-alpine
# Посмотреть запущенные контейнеры
docker ps
# Остановить контейнер
docker stop my-app
# Удалить контейнер
docker rm my-app
Docker Hub
Публичный реестр (registry) образов. Аналог npm для Docker.
# Поиск образа на Docker Hub
docker search nginx
# Популярные образы:
# node — Node.js
# nginx — веб-сервер
# postgres — PostgreSQL
# redis — Redis
# python — Python
Базовые команды
# === Работа с образами ===
docker pull <image> # скачать образ
docker images # список образов
docker rmi <image> # удалить образ
# === Работа с контейнерами ===
docker run <image> # создать и запустить
docker run -d <image> # запуск в фоне (detached)
docker run -p 8080:80 <image> # проброс портов host:container
docker run -v /host:/container <image> # монтирование тома
docker ps # запущенные контейнеры
docker ps -a # все контейнеры (включая остановленные)
docker stop <container> # остановить
docker start <container> # запустить остановленный
docker rm <container> # удалить
docker logs <container> # логи контейнера
docker exec -it <container> sh # зайти внутрь контейнера
# === Очистка ===
docker system prune # удалить неиспользуемые ресурсы
Пример: запуск Node.js приложения
# 1. Запустить контейнер с Node.js
docker run -it --rm node:20-alpine node -e "console.log('Hello from Docker!')"
# 2. Запустить nginx с локальным HTML
docker run -d -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html nginx:alpine
# 3. Запустить PostgreSQL
docker run -d \
--name my-postgres \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=mydb \
-p 5432:5432 \
postgres:16-alpine
Зачем Docker разработчику
- Одинаковое окружение — «works on my machine» больше не проблема
- Быстрый onboarding —
docker compose upвместо длинной инструкции - Изоляция — разные версии Node.js, БД и т.д. не конфликтуют
- CI/CD — тесты в контейнере = предсказуемый результат
- Деплой — один и тот же образ на dev, staging и production
Частые ошибки
| Ошибка | Проблема | Решение |
|---|---|---|
port is already allocated |
Порт уже занят | Используй другой порт: -p 3001:3000 |
no such image |
Образ не скачан | Сначала docker pull |
permission denied |
Нет прав на Docker | Добавь пользователя в группу docker |
| Контейнер сразу останавливается | Нет foreground-процесса | Нужен CMD, который не завершается |
| Данные теряются при удалении | Нет volumes | Используй -v для сохранения данных |
Практика
- Установи Docker Desktop и запусти
docker run hello-world - Запусти nginx-контейнер с пробросом порта и открой в браузере
- Запусти PostgreSQL в контейнере и подключись через psql или GUI
- Создай файл
index.htmlи запусти его через nginx-контейнер - Посмотри логи контейнера через
docker logs
Связанные темы
- Dockerfile — как создавать свои образы
- Docker Compose — запуск нескольких контейнеров
- Что такое CI-CD — Docker в пайплайнах
- GitHub Actions — Docker в GitHub CI