Что такое 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 разработчику

  1. Одинаковое окружение — «works on my machine» больше не проблема
  2. Быстрый onboardingdocker compose up вместо длинной инструкции
  3. Изоляция — разные версии Node.js, БД и т.д. не конфликтуют
  4. CI/CD — тесты в контейнере = предсказуемый результат
  5. Деплой — один и тот же образ на dev, staging и production

Частые ошибки

Ошибка Проблема Решение
port is already allocated Порт уже занят Используй другой порт: -p 3001:3000
no such image Образ не скачан Сначала docker pull
permission denied Нет прав на Docker Добавь пользователя в группу docker
Контейнер сразу останавливается Нет foreground-процесса Нужен CMD, который не завершается
Данные теряются при удалении Нет volumes Используй -v для сохранения данных

Практика

  1. Установи Docker Desktop и запусти docker run hello-world
  2. Запусти nginx-контейнер с пробросом порта и открой в браузере
  3. Запусти PostgreSQL в контейнере и подключись через psql или GUI
  4. Создай файл index.html и запусти его через nginx-контейнер
  5. Посмотри логи контейнера через docker logs

Связанные темы

Ресурсы