Как создавать (собирать) образы Docker с помощью Dockerfile в Linux

12 set 2022 4 min di lettura
Как создавать (собирать) образы Docker с помощью Dockerfile в Linux
Indice dei contenuti

Введение

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

В этом руководстве мы объясним, что такое Dockerfile, как его создать и как собрать/создать образ Docker с помощью Dockerfile.

Что такое Dockerfile

Файл Docker — это текстовый файл, содержащий все команды, которые пользователь может запустить в командной строке для создания образа. Включает все инструкции, необходимые Docker для создания образа.

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

Файл Docker имеет следующий вид:

# Comment
 INSTRUCTION arguments

INSTRUCTION не чувствительна к регистру, но принято использовать ЗАГЛАВНЫЕ РЕГИСТРЫ для ее имен.

Ниже приведен список с кратким описанием некоторых наиболее часто используемых операторов Dockerfile:

  • ARG: этот оператор позволяет вам определять переменные, которые могут быть переданы во время компиляции. Вы также можете установить значение по умолчанию.
  • FROM — базовый образ для создания нового образа. Этот оператор должен быть первым не закомментированным оператором в файле Docker. Единственное исключение из этого правила — когда вы хотите использовать переменную FROM в аргументе. В этом случае FROM может предшествовать один или несколько операторов ARG.
  • LABEL: используется для добавления к изображению метаданных, таких как описание, версия, автор и т. д. Вы можете указать более одного LABEL, и каждый оператор LABEL представляет собой пару ключ-значение.
  • RUN — команды, указанные в этом операторе, будут выполняться в процессе сборки. Каждая инструкция RUN создает новый слой над текущим изображением.
  • ADD — используется для копирования файлов и каталогов из указанного источника в указанное место назначения в образе Docker. Источником могут быть локальные файлы или каталоги или URL-адрес. Если источником является локальный tar-архив, он автоматически распаковывается в образ Docker.
  • COPY — аналогично ADD, но источником может быть только локальный файл или каталог.
  • ENV: этот оператор позволяет определить переменную среды.
  • CMD: используется для указания команды, которая будет выполняться при запуске контейнера. В Dockerfile можно использовать только один оператор CMD.
  • ENTRYPOINT — Подобно CMD, этот оператор определяет, какая команда будет выполняться при выполнении контейнера.
  • WORKDIR — эта директива устанавливает текущий рабочий каталог для операторов RUN, CMD, ENTRYPOINT, COPY и ADD.
  • USER — установите имя пользователя или UID для использования при выполнении любого из следующих операторов RUN, CMD, ENTRYPOINT, COPY и ADD.
  • VOLUME: позволяет смонтировать каталог хост-компьютера в контейнере.
  • EXPOSURE: используется для указания порта, на котором контейнер прослушивает во время выполнения.

Чтобы исключить файлы и каталоги из добавления в образ, создайте файл .dockerignore в контекстном каталоге. Синтаксис .dockerignore аналогичен синтаксису файла Git .gitignore.

Полный справочник и подробное объяснение инструкций Dockerfile см. на официальной справочной странице Dockerfile.

Создайте файл Docker

Наиболее распространенный сценарий создания образов Docker — извлечь существующий образ из реестра (обычно это Docker Hub) и указать изменения, которые вы хотите внести в базовый образ. Чаще всего при создании образов Docker используется базовый образ Alpine, поскольку он небольшой и оптимизирован для работы в оперативной памяти.

Docker Hub — это облачная служба реестра, которая, помимо прочего, используется для хранения образов Docker в общедоступном или частном репозитории.

В этом примере мы создадим образ Docker для сервера Redis. Мы будем использовать последнюю версию Ubuntu 18.04 в качестве базового образа.

Сначала создайте каталог, который будет содержать файл Docker и все необходимые файлы:

mkdir ~/redis_docker

Измените каталог и создайте следующий Dockerfile:

cd ~/redis_docker
nano Dockerfile
FROM ubuntu:18.04

 RUN apt-get update && \
 apt-get install -y redis-server && \
 apt-get clean

 EXPOSE 6379

 CMD ["redis-server", "--protected-mode no"]

Объясним значение каждой из строк в Dockerfile:

  • В строке 1 мы определяем базовое изображение.
  • Инструкции RUN начинаются в строке 3 и обновляют индекс apt, устанавливают пакет «redis-server» и очищают кеш apt. Команды, используемые в инструкциях, совпадают с командами, которые вы использовали бы для установки Redis на сервер Ubuntu.
  • Оператор EXPOSE определяет порт, который прослушивает сервер Redis.
  • В последней строке мы используем операторы CMD для установки команды по умолчанию, которая будет выполняться при запуске контейнера.

Сохраните и закройте файл, нажав CTRL + X, затем Y, чтобы сохранить изменения, а затем ENTER, если вы используете nano.

Создайте образ

Следующим шагом будет создание образа. Для этого выполните следующую команду из каталога, где находится Dockerfile:

docker build -t noviello/redis.

Параметр -t указывает имя изображения и, при необходимости, имя пользователя и тег в формате «имя пользователя /имя изображения: тег».

Результат процесса сборки будет выглядеть следующим образом:

Sending build context to Docker daemon 3.584kB
 Step 1/4: FROM ubuntu:18.04
 ---> 7698f282e524
 Step 2/4: RUN apt-get update && apt-get install -y gosu redis-server && apt-get clean
 ---> Running in e80d4dd69263...
 Removing intermediate container e80d4dd69263
 ---> e19fb7653fca
 Step 3/4: EXPOSE 6379
 ---> Running in 8b2a45f457cc
 Removing intermediate container 8b2a45f457cc
 ---> 13b92565c201
 Step 4/4: CMD ["redis-server", "--protected-mode no"]
 ---> Running in a67ec50c7048
 Removing intermediate container a67ec50c7048
 ---> d8acc14d9b6b
 Successfully built d8acc14d9b6b
 Successfully tagged noviello/redis:latest

После завершения процесса сборки новый образ будет указан в списке образов:

docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
 noviello/redis latest d8acc14d9b6b 4 minutes ago 100MB
 ubuntu 18.04 7698f282e524 5 days ago 69.9MB

Если вы хотите отправить образ в Docker Hub, см. раздел Отправка образа контейнера Docker в Docker Hub.

Запустить контейнер

Теперь, когда образ создан, запустите контейнер, выполнив:

docker run -d -p 6379:6379 --name redis noviello/redis

Параметр -d указывает Docker запустить контейнер в отдельном режиме, параметр -p 6379:6379 опубликует образ на порт 6379 хост-компьютера, а параметр --name redis указывает имя контейнера. Последний аргумент noviello/redis — это имя образа, который используется для запуска контейнера.

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

docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
 6b7d424cd915 noviello/redis:v0.0.1 "redis-server '--pro…" 5 minutes ago Up 5 minutes 0.0.0.0:6379->6379/tcp redis

Чтобы убедиться, что все работает как надо, используйте redis-cli для подключения к контейнеру докеров:

redis-cli ping

Сервер Redis должен ответить PONG.

Вывод

В этом руководстве были рассмотрены только основы использования Dockerfiles для создания образов. Дополнительные сведения о написании Dockerfile и рекомендуемых передовых методах см. в разделе Передовые методы написания Dockerfile.

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.