
Образ 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создаёт новый слой поверх текущего изображения. - 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 — позволяет монтировать каталог хост-машины в контейнер.
- EXPOSE — используется для указания порта, который контейнер прослушивает во время выполнения.
Чтобы исключить файлы и каталоги из добавления в образ, создайте файл .dockerignore в каталоге контекста. Синтаксис файла .dockerignore аналогичен синтаксису файла .gitignore в Git.
Полную справку и подробное объяснение инструкций Dockerfile см. на официальной странице справки Dockerfile .
Создать Dockerfile
Самый распространённый сценарий создания образов Docker — извлечение существующего образа из реестра (обычно из Docker Hub) и указание изменений, которые необходимо внести в базовый образ. В качестве базового образа чаще всего используется 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 Server . - Инструкция
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 для подключения к контейнеру Docker:
redis-cli ping
Сервер Redis должен ответить PONG .
Заключение
В этом руководстве рассматриваются только основы использования Dockerfiles для создания образов. Подробнее о написании Dockerfiles и рекомендуемых практиках см. в статье «Рекомендации по написанию Dockerfiles» .
Если у вас есть вопросы, пожалуйста, оставьте комментарий ниже.
Связанные руководства
- Как установить и использовать Docker Compose в Debian 10 Linux
- Команда Docker Run с примерами
- Как составить список контейнеров в Docker
- Как подключиться к Docker-контейнеру
- Как установить и использовать Docker в Debian 10 Linux
- Как установить и использовать Docker на Raspberry Pi
- Как установить Docker Compose в Ubuntu 20.04