Docker: полный обзор

Что такое Docker: восемь главных понятий, когда он помогает, а когда нет, плюсы и минусы, три файла для настоящего проекта, ошибки и правила для рабочей среды.

Стек и технологии Обновлено

Коротко

Docker упаковывает приложение вместе со всем, что ему нужно, — версией языка, библиотеками, настройками — в образ и запускает его изолированным контейнером. Один и тот же образ работает на ноутбуке разработчика, на тестовом сервере и в рабочей среде, поэтому «у меня всё работает» перестаёт быть проблемой. Docker Compose описывает несколько контейнеров — приложение, базу, очередь — в одном файле и запускает их одной командой. Docker полезен, когда у проекта несколько сервисов, команда или регулярные выкладки; простому сайту на виртуальном хостинге он добавляет больше, чем даёт.

Docker коротко

Главные факты одной таблицей: что такое Docker, из чего состоит и сколько стоит.

Что это
Платформа для упаковки приложений в образы и запуска их контейнерами
История
Выпущен в 2013 году компанией dotCloud, позже переименованной в Docker
Части
Docker Engine, Docker Compose, Docker Hub, Docker Desktop
Лицензия
Движок с открытым кодом; Docker Desktop платный для крупных компаний
Стандарт
Образы в формате OCI и работают также в Podman и Kubernetes
Изоляция
Контейнеры делят ядро хоста — легче виртуальных машин
Где работает
Linux — напрямую; macOS и Windows — через небольшую виртуальную машину

Docker в восьми словах

Понятия, которые встречаются в любом разговоре о Docker.

ПонятиеЧто этоБытовое сравнение
Образ замороженный пакет: система, язык, код рецепт со всеми ингредиентами
Контейнер запущенная копия образа блюдо, приготовленное по рецепту
Dockerfile инструкция сборки образа сам рецепт
Слой результат одной инструкции, кэшируется шаг, который не нужно повторять
Том хранилище, которое переживает контейнер холодильник рядом с кухней
Сеть как контейнеры видят друг друга внутренняя телефонная линия
Реестр хранилище образов: Docker Hub, GitHub библиотека рецептов
Compose несколько контейнеров в одном файле меню целого ужина

Когда Docker помогает, а когда нет

Десять типичных ситуаций с рекомендацией.

СитуацияDockerПочему
Несколько сервисов: приложение, база, очередь да один файл описывает всю систему
Команда разработчиков да у всех одинаковое окружение
Разные версии языка на одном сервере да каждый проект в своём контейнере
Автоматическая выкладка да проверенный образ уходит в работу как есть
Тесты с настоящей базой да чистая база на каждый прогон
Переезд на другой сервер да те же образы запускаются где угодно
Простой сайт на виртуальном хостинге нет хостинг обычно не позволяет, да и не нужно
Один небольшой сайт на PHP на VPS по желанию обычная настройка сервера проще
Тяжёлая работа с видеокартами осторожно можно, но нужна дополнительная настройка
Управляемые платформы часто внутри многие платформы сами собирают образ из кода

Плюсы и минусы Docker

Docker меняет немного простоты на много повторяемости.

Плюсы · 5

  • Везде одинаково

    Образ, прошедший тесты, — ровно тот, что работает в рабочей среде.

  • Проекты не мешают друг другу

    Разные версии языков и библиотек живут на одном сервере.

  • Система в одном файле

    Compose описывает все сервисы и то, как они связаны.

  • Быстрый откат

    Предыдущая версия — это предыдущий образ, одна команда назад.

  • Готовые сервисы

    PostgreSQL, Redis или поисковый движок запускаются из официального образа за минуту.

Минусы · 4

  • Ещё один слой, который надо понимать

    Сети, тома и образы добавляют свои виды поломок.

  • Данные требуют внимания

    Без тома данные исчезают вместе с контейнером.

  • Обновления сами не приходят

    Образы нужно пересобирать, чтобы получить исправления безопасности системы внутри.

  • Сюрпризы с файрволом

    Опубликованные порты обходят обычные правила файрвола в Linux.

Как выглядит Docker: 3 файла

Образ для приложения на Node.js, приложение вместе с базой и список того, что не должно попасть в образ.

Образ в два этапа

Инструменты сборки остаются на первом этапе; в итоговом образе только нужное для запуска, и он работает без прав root.

Dockerfile
# Этап 1: поставить зависимости и собрать
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build

# Этап 2: только то, что нужно для запуска, — маленький чистый образ
FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY --from=build /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]

Приложение и его база

Приложение ждёт, пока база будет готова, пароль — в файле-секрете, порт открыт только для этой машины.

compose.yaml
# Приложение и его база запускаются одной командой: docker compose up -d
services:
  app:
    build: .
    ports:
      - "127.0.0.1:3000:3000"   # только для веб-сервера на этой машине
    env_file: .env
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    secrets: [db_password]
    volumes:
      - db-data:/var/lib/postgresql/data   # данные переживают контейнер
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 10
    restart: unless-stopped

volumes:
  db-data:

secrets:
  db_password:
    file: ./secrets/db_password.txt

Что остаётся снаружи

Без этого файла ключи и вся история проекта могут оказаться внутри образа.

.dockerignore
# В образ не попадает никогда: секреты, зависимости и история
.env
secrets/
.git
node_modules
dist
*.log

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

  1. Порты открыты всему интернету

    3000:3000 публикует порт на всех адресах в обход файрвола; 127.0.0.1:3000:3000 — нет.

  2. Данные внутри контейнера

    База без тома теряет всё при первом пересоздании.

  3. Секреты в образе

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

  4. Тег latest

    Завтра это другая версия — сборки перестают быть повторяемыми.

  5. Запуск от root

    Уязвимость в приложении даёт больше прав, чем должна.

  6. Без лимитов

    Один контейнер может забрать всю память и остановить всё остальное на сервере.

7 правил Docker в рабочем проекте

  1. 01

    Закреплённые версии

    node:22-alpine, postgres:17 — никогда latest.

  2. 02

    Сборка в два этапа

    Маленький итоговый образ быстрее выкладывается и содержит меньше уязвимостей.

  3. 03

    Не root

    Инструкция USER в каждом образе приложения.

  4. 04

    Порты только там, где нужно

    Сервисы общаются внутри сети Compose; наружу — только через веб-сервер.

  5. 05

    Тома и копии

    Каждая база — на томе, а том — в плане резервных копий.

  6. 06

    Лимиты памяти и процессора

    mem_limit и cpus для каждого сервиса, у которого есть соседи.

  7. 07

    Регулярная пересборка

    Образы пересобираются по расписанию, чтобы получать исправления безопасности.

Вопросы о Docker

Что такое Docker простыми словами?

Способ упаковать приложение со всем необходимым и запускать его одинаково на любом сервере.

Чем контейнер отличается от виртуальной машины?

Контейнер делит ядро хоста и стартует за секунды; виртуальная машина несёт целую систему.

Docker бесплатный?

Движок на сервере бесплатный; Docker Desktop платный для компаний больше определённого размера.

Нужен ли Docker сайту?

Простому сайту — нет; проекту с несколькими сервисами, командой и регулярными выкладками — да.

Docker или Kubernetes?

Docker с Compose хватает на один или несколько серверов; Kubernetes управляет контейнерами на многих.

Можно ли держать базу в Docker?

Да, с томом, копиями и лимитами памяти; для рабочей среды многие предпочитают управляемую базу.

Что такое Podman?

Альтернатива Docker, которая запускает те же образы и работает без фоновой службы и прав root.

Форма

Запуск
без сюрпризов

Сдаю готовый проект с выкладкой на ваш хостинг и вместе с вами решаю, нужен ли ему Docker или хватит обычной настройки сервера. Расскажите о проекте — отвечу в течение рабочего дня.

Или пишите на [email protected]