Dockerfile это текстовый файл с инструкциями, которые используются для автоматизации инсталляции и конфигурации образа Docker. Файлы Dockerfile упрощают развертывание нескольких контейнеров Docker между несколькими виртуальными машинами без необходимости поддерживать одинаковый образ Docker. Инструкции выполняются в порядке, в каком они появляются в Dockerfile, что делает их использование и обновление понятной и интуитивной. В этой статье (перевод документации [1]) даны базовые понятия о том, как работает Dockerfile.
Перед тем, как начать изучение этого материала вам необходимо установить Docker (на Ubuntu это делается простой командой sudo apt install docker.io) и ознакомиться с основными командами docker [3].
[Как работает Dockerfile]
Dockerfile это скрипт, который содержит различные команды и действия для сборки образа Docker, который можно затем использовать для развертывания контейнера Docker. Команды и информация в Dockerfile может конфигурироваться для использования специфических версий программ и зависимостей для достижения стабильных инсталляций. Вы также можете использовать реестр (Docker registry) для сохранения образов Docker и публичного (или приватного) к ним доступа.
Как только Dockerfile написан и отлажен, вы можете использовать команду docker build для генерации образа Docker на основе инструкций в Dockerfile. Затем вы можете развернуть контейнер на основе этого образа, используя команды наподобие docker run или docker create.
Ниже даны общие инструкции, которыми вы можете использовать свои Dockerfile для сборки образов.
Базовые определения
FROM: определение базового образа, такого как ubuntu или debian, используемого для запуска процесса сборки. Требуется для каждого Dockerfile. MAINTAINER: определение полного имени и адреса email создателя образа (необязательная команда).
Переменные
ENV: устанавливает переменные окружения, которые сохраняющиеся при развертывании контейнера. ARG: установка допустимой переменной времени построения. Может использоваться как альтернатива ENV для создания и переменной, которая не сохраняется, когда контейнер развернут из образа.
Выполнение команды
RUN: выполняет команды, такие как команды установки пакета, на новом слое образа. CMD: выполнит определенную команду в контейнере, развернутом вместе с образом, или установит параметры по умолчанию для инструкции ENTRYPOINT. Только одна команда CMD может присутствовать в Dockerfile. ENTRYPOINT: установит приложение по умолчанию для использования каждый раз, когда контейнер развернут вместе с образом. Только одна команда ENTRYPOINT может присутствовать в Dockerfile. USER: установит UID (username, имя пользователя) для запуска команд в контейнере. WORKDIR: установит путь контейнера, где выполняются последующие команды.
Замечание: каждая из команд RUN, CMD и ENTRYPOINT может выполняться в форме shell, принимая обычные аргументы, или в форме exec, принимая аргументы из массива JSON. Поскольку форма exec не вовлекает command shell, то она обычно является предпочтительной и используется в данном руководстве.
Управление данными
ADD: копирует файлы из источника в файловую систему образа, в заданное место назначения, с автоматической обработкой tarball и remote URL. COPY: подобно ADD но без автоматической обработки tarball и remote URL. VOLUME: разрешает доступ из указанной точки монтирования (mount point) контейнере к директории на машине хоста.
Сетевые коммуникации (Networking)
EXPOSE: откроет определенный порт для разрешения сетевого обмена между контейнером и внешним миром.
Далее мы рассмотрим пример создания Dockerfile, который использует некоторые эти команды.
[Создание Dockerfile]
Для создания Dockerfile:
1. В командной строке (либо сеанс SSH, либо терминал bash), создайте новый каталог и перейдите в него:
$ mkdir ~/mydockerbuild && cd ~/mydockerbuild
Замечание: это поместит директорию сборки Docker в вашу домашнюю директорию. Хорошее правило - не храните Dockerfile в самой домашней директории или корневой директории сервера. Вместо этого создайте отдельную директорию, и поместите туда необходимые файлы (такие как Dockerfile для нашего примера), как и сделано в этом руководстве (папка mydockerbuild).
2. Создайте Dockerfile:
$ touch example_dockerfile
3. Откройте Dockerfile, используя текстовый редактор, который вы предпочитаете (в этом примере используется nano):
$ nano example_dockerfile
4. Вставьте в файл example_dockerfile следующий текст:
FROM debian
MAINTAINER Jane Doe jdoe@example.com
CMD ["echo", "Hello, Sunshine!"]
5. Сохраните example_dockerfile. Командой cat example_dockerfile убедитесь в надлежащем содержимом файла.
[Сборка образа Docker из Dockerfile]
Сборка образа из Dockerfile происходит командой docker build:
$ docker build ~/mydockerbuild -f example_dockerfile -t example_image
Пометкой example_image нашего образа упрощается развертывание контейнера на следующем шаге.
Вывод этой команды должен выглядеть примерно так:
Sending build context to Docker daemon 4.096kB
Step 1/3 : FROM debian
---> 4a7a1f401734
Step 2/3 : MAINTAINER Jane Doe jdoe@example.com
---> Running in fdd81bd8b5c6
Removing intermediate container fdd81bd8b5c6
---> 1253842068a3
Step 3/3 : CMD ["echo", "Hello, Sunshine!"]
---> Running in d33e1bacf1af
Removing intermediate container d33e1bacf1af
---> a5d95e138b97
Successfully built a5d95e138b97
Successfully tagged example_image:latest
Как вы можете видеть, инструкции из example_dockerfile были выполнены в указанном порядке. Образ с меткой example_image готов теперь для запуска, чтобы развернуть контейнер.
[Запуск образа Docker для развертывания контейнера]
Запуск образа, который был только что собран, чтобы развернуть контейнер Docker, теперь делается простой командой:
$ docker run example_image
После этого разворачивается новый контейнер, основанный на example_image, и выполняется команда, указанная в инструкции CMD. В результате в консоли контейнера мы увидим следующий вывод:
Hello, Sunshine!
Замечание: если команда docker run выполнилась, и образ Docker недоступен в текущей директории, то вместо этого он извлекается (pulled) из реестра Docker.
Поздравляем! Вы собрали свой первый Dockerfile, и запустили ваш первый образ Docker.
Для других примеров и информации по использованию файлов Dockerfile с образами Docker и контейнерами, просмотрите следующие материалы:
- How to Use Docker Images, Containers, and Dockerfiles in Depth. - Docker’s Dockerfile Best Practices.
По теме Dockerfile, образов и контейнеров Docker вы можете также обратиться к следующим ресурсам:
- Best Practices for Writing Dockerfiles. - Official Docker Images on Docker Hub. - Docker Docs.
[Ссылки]
1. How to Use a Dockerfile to Build a Docker Image site:linode.com. 2. Docker Running containers site:docs.docker.com. 3. docker: справка по командам. |