Основы Dockerfile: определение и создание контейнерных приложений

watch 59s
views 2

12:56, 29.05.2026

Содержание статьи
arrow

  • Введение в Dockerfile 
  • Основные инструкции, используемые в Dockerfile 
  • Пример рабочего процесса: написание и применение Dockerfile
  • Шаги по созданию вашего Dockerfile 
  • Опции, доступные при сборке Docker 
  • Запуск и использование созданного образа 
  • Рекомендуемые практики по Dockerfile 
  • 1. Избегайте использования тега `latest` для базовых образов 
  • 2. Выбирайте базовые образы только из надежных источников 
  • 3. Внедрите HEALTHCHECK для мониторинга состояния контейнера 
  • 4. Настройте ENTRYPOINT и CMD надлежащим образом 
  • 5. Никогда не храните секретные данные непосредственно в образах 
  • 6. Добавляйте метки для упорядочивания и отслеживания ваших образов 
  • 7. Запускайте контейнеры, используя пользователя, не являющегося root 
  • 8. Используйте `.dockerignore` для ускорения процесса сборки 
  • 9. Оптимизируйте размер образа, когда это возможно 
  • 10. Используйте линтеры и сканеры уязвимостей для обеспечения безопасности 
  • Итог основных выводов

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.

Поделиться

Была ли эта статья полезной для вас?

Популярные предложения VPS

-18.4%

CPU
CPU
4 Xeon Cores
RAM
RAM
2 GB
Space
Space
75 GB SSD
Bandwidth
Bandwidth
2 TB
wKVM-SSD 2048 Metered Windows

£ 20.8

£

При оплате за год

-9.9%

CPU
CPU
4 Xeon Cores
RAM
RAM
4 GB
Space
Space
100 GB HDD
Bandwidth
Bandwidth
300 Gb
KVM-HDD HK 4096 Linux

£ 10.48

£

При оплате за год

-8.1%

CPU
CPU
6 Xeon Cores
RAM
RAM
8 GB
Space
Space
200 GB HDD
Bandwidth
Bandwidth
Unlimited
wKVM-HDD 8192 Windows

£ 27.08

£

При оплате за год

-10%

CPU
CPU
3 Xeon Cores
RAM
RAM
1 GB
Space
Space
40 GB HDD
Bandwidth
Bandwidth
Unlimited
KVM-HDD 1024 Linux

£ 5.29

£

При оплате за год

-9.2%

CPU
CPU
4 Xeon Cores
RAM
RAM
4 GB
Space
Space
100 GB SSD
Bandwidth
Bandwidth
Unlimited
10Ge-wKVM-SSD 4096 Windows

£ 62.4

£

При оплате за год

-24.7%

CPU
CPU
4 Xeon Cores
RAM
RAM
4 GB
Space
Space
50 GB SSD
Bandwidth
Bandwidth
4 TB
KVM-SSD 4096 Metered Linux

£ 26.86

£

При оплате за год

-20.2%

CPU
CPU
1 Xeon Core
RAM
RAM
1 GB
Space
Space
50 GB SSD
Bandwidth
Bandwidth
300 GB
wKVM-SSD 1024 HK Windows

£ 16.46

£

При оплате за год

-4.5%

CPU
CPU
4 Xeon Cores
RAM
RAM
4 GB
Space
Space
100 GB HDD
Bandwidth
Bandwidth
300 Gb
wKVM-HDD HK 4096 Windows

£ 14.76

£

При оплате за год

-10%

CPU
CPU
8 Epyc Cores
RAM
RAM
32 GB
Space
Space
200 GB NVMe
Bandwidth
Bandwidth
Unlimited
Keitaro KVM 32768
OS
CentOS
Software
Software
Keitaro

£ 67.2

£

При оплате за год

-10%

CPU
CPU
10 Epyc Cores
RAM
RAM
64 GB
Space
Space
400 GB NVMe
Bandwidth
Bandwidth
Unlimited
KVM-NVMe 65536 Linux

£ 117.42

£

При оплате за год

Другие статьи на эту тему

cookie

Принять файлы cookie и политику конфиденциальности?

Мы используем файлы cookie, чтобы обеспечить вам наилучший опыт работы на нашем сайте. Если вы продолжите работу без изменения настроек, мы будем считать, что вы согласны получать все файлы cookie на сайте HostZealot.