Образ 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 для сервера Redis. Мы будем использовать последнюю версию ubuntu 18.04 в качестве базового образа.
Сначала создайте каталог, который будет содержать Dockerfile и все необходимые файлы:
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
для установки команды по умолчанию, которая будет выполняться при запуске контейнера.
Сохраните файл и закройте редактор.
Создание образа
Следующим шагом будет создание образа. Для этого выполните следующую команду из каталога, в котором находится 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 .
Если у вас есть вопросы, оставьте комментарий ниже.