Docker — это способ упаковать приложение и все его зависимости и конфигурацию в единый образ. По сути, это превращение серверной конфигурации в артефакт, которым можно управлять с помощью git и воспроизводимо запускать на любых машинах.
Что такое Docker и зачем он нужен?
Docker упрощает управление конфигурацией продакшн‑окружения. Вместо ручной настройки серверов вы автоматизируете процесс в Dockerfile и получаете однообразный образ для всех членов команды.
Образ одинаков для всех, поэтому приложение запускается везде одинаково. Это решает классическую проблему «у меня работает, а у тебя нет». Docker не эмулирует отдельную ОС целиком, как виртуальная машина. Вместо этого он использует ресурсы хоста, что уменьшает накладные расходы и повышает масштабируемость.
Важно: Docker удобен, но не всегда обязателен. Если у вас простой статичный сайт на CDN или полностью управляемая платформа, контейнеры могут добавить лишний слой. Ниже — когда Docker хорош, а когда стоит рассмотреть альтернативы.
Создание Dockerfile
Точка входа для сборки контейнера называется Dockerfile. Создайте директорию проекта и внутри файл с именем:
Dockerfile
(без расширения). Например:
touch Dockerfile
Откройте файл в редакторе.
Скорее всего, не имеет смысла начинать всё с нуля. Вы можете унаследовать образ с Docker Hub, например Ubuntu:
FROM ubuntu
Если же вам нужно полностью пустое пространство, используют FROM scratch — это значит «начать с чистого листа».
Во время сборки Docker создаёт набор слоев. Каждая инструкция, которая меняет файловую систему, создаёт новый слой. В Dockerfile вы описываете команды так, чтобы автоматизировать настройку, которую в реальной жизни вы бы выполняли на пустой Linux‑машине.
Для отладки вы можете запускать контейнер и получать shell:
docker exec -it /bin/bash
Сохранить изменения в текущем контейнере можно через:
docker commit
Это удобно для экспериментов, но окончательную конфигурацию всё равно кладите в Dockerfile — так она версионируема и воспроизводима.
Команды Dockerfile
Ниже — часто используемые инструкции с примерами и лучшими практиками.
COPY
COPY копирует файлы из контекста сборки в образ.
COPY
Пример: если в проекте есть папка /config/nginx/ с nginx.conf и папками sites-available, можно скопировать её в стандартное место контейнера:
COPY /config/nginx/ /etc/nginx/
Советы по COPY:
Копируйте только то, что нужно для сборки образа. Используйте .dockerignore, чтобы исключить node_modules, .git и временные файлы.
Старайтесь минимизировать число COPY между слоями — объединяйте шаги, если это логично.
RUN
RUN выполняет команду в контейнере и фиксирует изменения в слое.
RUN
Каждый RUN создаёт новый слой. Для сложной установки лучше поместить логику в скрипт и запускать его:
COPY install.sh .
RUN ./install.sh
Внутри install.sh можно устанавливать пакеты через apt, создавать пользователя, настраивать окружение.
Оптимизация слоёв:
Объединяйте связанные команды в один RUN через &&, чтобы уменьшить количество слоёв и размер образа.
Очищайте кэш пакетного менеджера в том же RUN, где устанавливаете пакеты (например apt clean && rm -rf /var/lib/apt/lists/*).
CMD
CMD задаёт команду по умолчанию при старте контейнера, если ничего не передано.