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.
# Этап 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"]
Приложение и его база
Приложение ждёт, пока база будет готова, пароль — в файле-секрете, порт открыт только для этой машины.
# Приложение и его база запускаются одной командой: 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
Что остаётся снаружи
Без этого файла ключи и вся история проекта могут оказаться внутри образа.
# В образ не попадает никогда: секреты, зависимости и история
.env
secrets/
.git
node_modules
dist
*.log
Частые ошибки с Docker
-
Порты открыты всему интернету
3000:3000публикует порт на всех адресах в обход файрвола;127.0.0.1:3000:3000— нет. -
Данные внутри контейнера
База без тома теряет всё при первом пересоздании.
-
Секреты в образе
Ключ, скопированный в образ, остаётся в его слоях, даже если его потом удалить.
-
Тег latest
Завтра это другая версия — сборки перестают быть повторяемыми.
-
Запуск от root
Уязвимость в приложении даёт больше прав, чем должна.
-
Без лимитов
Один контейнер может забрать всю память и остановить всё остальное на сервере.
7 правил Docker в рабочем проекте
-
01
Закреплённые версии
node:22-alpine,postgres:17— никогдаlatest. -
02
Сборка в два этапа
Маленький итоговый образ быстрее выкладывается и содержит меньше уязвимостей.
-
03
Не root
Инструкция
USERв каждом образе приложения. -
04
Порты только там, где нужно
Сервисы общаются внутри сети Compose; наружу — только через веб-сервер.
-
05
Тома и копии
Каждая база — на томе, а том — в плане резервных копий.
-
06
Лимиты памяти и процессора
mem_limitиcpusдля каждого сервиса, у которого есть соседи. -
07
Регулярная пересборка
Образы пересобираются по расписанию, чтобы получать исправления безопасности.
Вопросы о Docker
Что такое Docker простыми словами?
Способ упаковать приложение со всем необходимым и запускать его одинаково на любом сервере.
Чем контейнер отличается от виртуальной машины?
Контейнер делит ядро хоста и стартует за секунды; виртуальная машина несёт целую систему.
Docker бесплатный?
Движок на сервере бесплатный; Docker Desktop платный для компаний больше определённого размера.
Нужен ли Docker сайту?
Простому сайту — нет; проекту с несколькими сервисами, командой и регулярными выкладками — да.
Docker или Kubernetes?
Docker с Compose хватает на один или несколько серверов; Kubernetes управляет контейнерами на многих.
Можно ли держать базу в Docker?
Да, с томом, копиями и лимитами памяти; для рабочей среды многие предпочитают управляемую базу.
Что такое Podman?
Альтернатива Docker, которая запускает те же образы и работает без фоновой службы и прав root.
Форма
Запуск
без сюрпризов
Сдаю готовый проект с выкладкой на ваш хостинг и вместе с вами решаю, нужен ли ему Docker или хватит обычной настройки сервера. Расскажите о проекте — отвечу в течение рабочего дня.