Введение
Образ 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.