Основы Dockerfile: определение и создание контейнерных приложений
12:56, 29.05.2026
Docker — это платформа, необходимая для запуска и, что еще важнее, для создания контейнерных приложений. С помощью контейнеров можно объединить в один пакет зависимости, исходный код и среду выполнения. Это можно сделать с помощью Docker, установленного на вашем компьютере, или с помощью кластера Kubernetes в качестве инфраструктуры.
При запуске контейнеров необходим образ контейнера. Образы определяют начальное состояние файловых систем контейнеров. Это можно сделать с помощью Dockerfile, и в этой статье мы расскажем вам о процессе создания контейнерных приложений и поделимся полезными практиками.
Введение в Dockerfile
Dockerfile содержит инструкции в виде текста, необходимые для построения образа контейнера. Чтобы обработать все инструкции в файле для сборки образа, следует использовать следующую команду:
docker build
После использования этой команды все инструкции обрабатываются последовательно. Если строка начинается с #, это не команда, а комментарий или пояснение к команде. Аргументы в строках можно разделять с помощью обратной косой черты.
Основные инструкции, используемые в Dockerfile
Существует более 15 инструкций, которые можно использовать в Dockerfile для настройки некоторых параметров и добавления содержимого. Вот список самых популярных из них:
- FROM обычно находится в начале файла и является основой для сборки.
- COPY нужна для добавления папок/файлов в файловую систему. Процесс копирования происходит между образом и хостом Docker.
- ADD работает аналогично вышеупомянутой инструкции, но также поддерживает распаковку архивов и URL-адреса файлов. Использование ADD может упростить некоторые задачи. Например, архивные файлы распаковываются в контейнере, а не просто копируются.
- RUN используется для выполнения команды в образе. Это означает, что создается новый слой образа с некоторыми необходимыми изменениями. Обычно эта команда необходима для настройки и установки дополнительных пакетов.
- ENV – необходима для настройки среды.
Пример рабочего процесса: написание и применение Dockerfile
Теперь, когда вы поняли некоторые основные команды, перейдем к фактическому примеру рабочего процесса.
Начните с создания нового каталога, используя следующий код и сохранив его:
import { v4 as uuid } from "uuid";
console.log("Hello World");
console.log(`Your ID is ${uuid()}`);
Затем добавьте пакет в проекты следующим образом:
$ npm install uuidСледующим шагом будет добавление следующих инструкций и их сохранение в файле Dockerfile:
FROM node:16
WORKDIR /app
COPY package.json .
COPY package-lock.json .
RUN npm install
COPY main.js .
ENTRYPOINT ["node"]
CMD ["main.js"]
Попробуем объяснить некоторые детали кода:
- node:16 – официальный образ, используемый в качестве основы.
- WORKDIR – в этой части каталог меняется на /app.
- COPY используется для добавления 2 файлов из каталога хоста в рабочий каталог внутри контейнера.
- npm install – используется для установки в файловой системе контейнера с целью загрузки зависимостей.
- COPY main.js – исходный код копируется в контейнер.
Шаги по созданию вашего Dockerfile
На этом этапе вы можете начать создание образа из Dockerfile с помощью следующей команды:
$ docker build -t demo-image:latest .
После создания образа вы увидите инструкции в терминале.
Опции, доступные при сборке Docker
Используя docker build команду, вы указываете пути, на которые ссылаетесь в файле. Пути вне контекста не будут заметны для большинства инструкций.
Docker автоматически проверяет инструкции относительно рабочего каталога, но можно указать другой файл с помощью -f, как показано ниже:
docker build -f dockerfiles/app.dockerfile -t demo-image:latest -t demo-image:v1.0 .
Запуск и использование созданного образа
Чтобы запустить созданный образ, воспользуйтесь следующим:
docker run demo-image:latest node main.js
Рекомендуемые практики по Dockerfile
Написание Dockerfile считается довольно простой задачей, но следует учесть некоторые рекомендации для улучшения производительности, удобства использования и уровня безопасности.
1. Избегайте использования тега `latest` для базовых образов
В инструкции FROM лучше избегать использования «latest», поскольку это может привести к некоторым непредвиденным изменениям. Большинство авторов образов сразу используют последнюю версию. При перекомпиляции образа это может незаметно привести к использованию другой версии, что вызовет определенные проблемы.
Поэтому лучше быть более конкретным и указать node:16.
2. Выбирайте базовые образы только из надежных источников
Использование надежного источника для базового образа чрезвычайно важно, иначе вы можете столкнуться с некоторыми рисками безопасности. Ненадежный базовый образ может содержать вредоносное программное обеспечение, которое работает вне контейнеров. Поэтому лучше использовать образы, опубликованные проверенными пользователями или официальные.
3. Внедрите HEALTHCHECK для мониторинга состояния контейнера
Очень важно отслеживать состояние контейнера. Это можно сделать с помощью оркестраторов, таких как Kubernetes, чтобы проблемные контейнеры можно было автоматически перезапустить.
HEALTHCHECK следует добавить в Dockerfile, чтобы команда запускалась внутри и проверяла, все ли работает должным образом:
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost || exit 1
Состояние контейнеров можно проверить с помощью команды ps.
4. Настройте ENTRYPOINT и CMD надлежащим образом
Инструкции CMD и ENTRYPOINT несколько похожи. CMD предоставляет аргументы по умолчанию, а ENTRYPOINT запускает этот процесс. Аргументы в CMD можно настроить при запуске контейнеров с помощью docker run.
5. Никогда не храните секретные данные непосредственно в образах
Из соображений безопасности ваших секретных данных не рекомендуется хранить API-ключи или пароли в образах. Ведь любой пользователь, имеющий доступ к образу, может проверить эту информацию и использовать ее.
Также лучше использовать переменные среды, а не значения по умолчанию в Dockerfile. Это поможет минимизировать некоторые риски безопасности.
6. Добавляйте метки для упорядочивания и отслеживания ваших образов
Если в вашей команде много образов, лучше использовать инструкцию LABEL. Это означает, что вы можете добавлять ценную информацию для каждого проекта. Метки устанавливаются на основе синтаксиса обратного DNS следующим образом:
LABEL com.sample.team=backend
7. Запускайте контейнеры, используя пользователя, не являющегося root
По умолчанию контейнеры работают как пользователь root. Это может повлечь за собой определенные риски безопасности, поскольку хакеры могут войти в контейнер и выполнить некоторые команды на хосте.
Эту проблему можно решить, добавив инструкцию USER в файл Dockerfile. Лучшая рекомендация здесь — использовать пользователей, не являющихся root, для всех файлов.
USER demo-app
USER 1000
USER demo-app:demo-group
8. Используйте `.dockerignore` для ускорения процесса сборки
Образы обычно собираются с рабочим каталогом, который может содержать ненужные каталоги и файлы. Для повышения производительности необходимо исключить ненужные пути. Это поможет ускорить процесс, когда Docker копирует контекст сборки на начальном этапе процесса сборки.
Используйте файл dockerignore в каталоге, чтобы исключить ненужные каталоги/файлы.
9. Оптимизируйте размер образа, когда это возможно
Образы могут стать чрезвычайно большими, и это напрямую влияет на время сборки. Чтобы оптимизировать размер образа, рекомендуется использовать только необходимые пакеты и исключить все остальное. Также лучше использовать компактный базовый образ, если это возможно. Например, Alpine Linux вместо Ubuntu.
10. Используйте линтеры и сканеры уязвимостей для обеспечения безопасности
Файлы Dockerfile могут содержать ошибки, которые могут привести к серьезным проблемам или неожиданному поведению. Для проверки возможных проблем можно использовать линтеры, такие как Hadolint.
Чтобы запустить его, используйте следующую команду:
$ docker run --rm -i hadolint/hadolint < Dockerfile
Также рекомендуется использовать такие сканеры, как Trivy, которые помогут обнаружить устаревшие пакеты. Попробуйте использовать его перед развертыванием, чтобы минимизировать некоторые риски.
Итог основных выводов
Docker — чрезвычайно популярная технология, которая напрямую влияет на доставку программного обеспечения благодаря использованию контейнеров, идеально работающих в различных средах. Для правильного использования Docker необходимо написать файл Dockerfile, содержащий все необходимые инструкции. Эти инструкции определяются спецификацией образов OCI и создают образы, необходимые для среды выполнения контейнеров, совместимой с OCI.