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

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

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

Что такое Dockerfile

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

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

Файл Docker имеет следующую форму:

# Comment
INSTRUCTION arguments

INSTRUCTION не чувствительна к регистру, но по соглашению для ее имен используется ЗАПИСЬ.

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

  • ARG — эта инструкция позволяет вам определять переменные, которые могут быть переданы во время сборки. Вы также можете установить значение по умолчанию.
  • FROM — базовое изображение для построения нового изображения. Эта инструкция должна быть первой инструкцией без комментариев в Dockerfile. Единственное исключение из этого правила — когда вы хотите использовать переменную в аргументе FROM . В этом случае FROM может предшествовать одна или несколько инструкций ARG .
  • LABEL — используется для добавления метаданных к изображению, таких как описание, версия, автор и т. Д. Вы можете указать несколько LABEL , и каждая инструкция LABEL представляет собой пару "ключ-значение".
  • RUN — команды, указанные в этой инструкции, будут выполняться в процессе сборки. Каждая инструкция RUN создает новый слой поверх текущего изображения.
  • ДОБАВИТЬ — используется для копирования файлов и каталогов из указанного источника в указанное место назначения в образе докера. Источником могут быть локальные файлы, каталоги или URL. Если источником является локальный tar-архив, он автоматически распаковывается в образ Docker.
  • КОПИРОВАТЬ — аналогично ADD но источником может быть только локальный файл или каталог.
  • ENV — Эта инструкция позволяет вам определить переменную среды.
  • CMD — используется для указания команды, которая будет выполняться при запуске контейнера. Вы можете использовать только одну инструкцию CMD в своем Dockerfile.
  • ENTRYPOINT — аналогично CMD , эта инструкция определяет, какая команда будет выполняться при запуске контейнера.
  • WORKDIR — эта директива устанавливает текущий рабочий каталог для инструкций RUN , CMD , ENTRYPOINT , COPY и ADD .
  • ПОЛЬЗОВАТЕЛЬ — Установите имя пользователя или UID для использования при выполнении любых следующих инструкций RUN , CMD , ENTRYPOINT , COPY и ADD .
  • VOLUME — позволяет подключить каталог хост-машины к контейнеру.
  • EXPOSE — используется для указания порта, на котором контейнер прослушивает во время выполнения.

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

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

Создать Dockerfile

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

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

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

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

mkdir ~/redis_docker

Перейдите в каталог и создайте следующий Dockerfile:

cd ~/redis_dockernano Dockerfile
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 для установки команды по умолчанию, которая будет выполняться при запуске контейнера.

Сохраните файл и закройте редактор.

Создание образа

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

docker build -t linuxize/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 linuxize/redis:latest

Когда процесс сборки завершится, новый образ появится в списке образов:

docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
linuxize/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 linuxize/redis

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

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

docker container ls
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
6b7d424cd915        linuxize/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 для создания образов. Чтобы узнать больше о том, как писать файлы Docker, и рекомендуемые передовые методы, см. Рекомендации по написанию файлов Docker .

Если у вас есть вопросы, оставьте комментарий ниже.

Оставьте комментарий