Автоматическая сборка образов Docker с помощью Dockerfile

Контейнеры Docker создаются на основе образов. Образ может содержать что угодно: от основных компонентов операционной системы до сложнейшего стека приложений, готового к запуску.

При сборке образов с помощью Docker любое действие (выполненная команда) формирует новый уровень поверх предыдущего.

Данная статья поможет автоматизировать процесс сборки образа с помощью Dockerfile.

Dockerfile – это подробный пошаговый сценарий для автоматизации сборки.

Краткий обзор Docker

Проект Docker предлагает качественные инструменты на основе некоторых функций ядра Linux, которые можно использовать в связке. Цель проекта – помочь разработчикам и системным администраторам быстро портировать и запускать приложения со всеми зависимостями.

Для этого Docker создаёт надёжное окружение на основе LXC (Linux Containers), которое называется контейнером. Такие контейнеры создаются на основе образов. Образы собираются вручную (с помощью набора команд) или автоматически (при помощи Dockerfiles).

Читайте также:

Использование Docker-контейнеров

Самые распространённые ошибки при работе с Docker

Экосистема Docker: основы контейнеризации

Что такое Dockerfile?

Dockerfile – это сценарий, который состоит из последовательности команд и аргументов, необходимых для создания образа. Такие сценарии упрощают развёртывание и процесс подготовки приложения к запуску.

Сначала Dockerfile определяет образ, на основе которого будет происходить сборка. Затем идёт ряд методов, команд и аргументов, которые создадут новый образ.

Содержимое Dockerfile передаётся демону Docker для сборки образа.

Синтаксис Dockerfile

Прежде чем начать разработку Dockerfile, нужно ознакомиться с синтаксисом этого файла.

Примечание: Синтаксис – это структура, согласно которой нужно организовывать команды, аргументы и другие компоненты кода для выполнения той или иной процедуры. Такие структуры основываются на чётко обозначенных правилах, которым должно следовать каждое приложение и программа. Если в сценарии правила не соблюдены, такой сценарий не будет работать должным образом. Каждый сценарий имеет свое предназначение, и поэтому при обработке программа должна понимать, что значит его содержимое.

Синтаксис сценариев Dockerfile довольно прост и понятен.

Пример синтаксиса Dockerfile

Синтаксис Dockerfile состоит из двух основных блоков:

  • комментарии и команды;
  • аргументы.

# Line blocks used for commenting
command argument argument ..
# Print "Hello docker!"
RUN echo "Hello docker!"

Команды Dockerfile

Dockerfile поддерживает огромное количество команд для сборки образов. Рассмотрим основные команды.

Примечание: Как говорилось ранее, все команды в файле Dockerfile нужно упорядочить по мере их выполнения. Однако некоторые команды (например, MAINTAINER) могут находиться в любом месте файла (но всегда после команды  FROM).

Команда ADD

Команда ADD имеет два аргумента: источник и назначение. Команда копирует исходный файл в целевой каталог файловой системы контейнера. Если в источнике указан URL-адрес, команда загрузит его содержимое. Например:

# Usage: ADD [destination directory] ADD /my_app_folder /my_app_folder

Команда CMD

CMD, аналогично команде RUN, можно использовать для запуска других команд. В отличие от RUN, эту команду нельзя использовать при сборке, она выполняет команду при запуске контейнера

К примеру, команда CMD может запустить приложение во время создания контейнера, установленного с помощью RUN. Команда CMD будет командой по умолчанию и заменит любую другую команду, запущенную во время создания.

Например:

# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

Аргумент ENTRYPOINT

ENTRYPOINT задаёт приложение по умолчанию, которое используется во время создания контейнера. К примеру, если образ предназначен только для запуска определённого приложения, это приложение можно обозначить в ENTRYPOINT.

Аргумент ENTRYPOINT можно использовать с командой CMD.

# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
#           or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo

Команда ENV

Команда ENV задаёт переменные среды в формате «ключ = значение», которые в дальнейшем можно использовать в сценариях и приложениях внутри контейнера. ENV обеспечивает гибкость запуска команд.

# Usage: ENV key value
ENV SERVER_WORKS 4

Команда EXPOSE

Команда EXPOSE задаёт порт, с помощью которого приложение в контейнере может взаимодействовать с внешним миром.

# Usage: EXPOSE [port] EXPOSE 8080

Команда FROM

FROM – пожалуй, одна из самых важных команд Dockerfile. Она определяет базовый образ, на основе которого будет собран новый образ. В качестве базового можно использовать любой доступный образ, включая созданные ранее. Если указанный образ не найден, Docker попытается найти и загрузить его из индекса образов. С этой команды должен начинаться Dockerfile.

# Usage: FROM [image name] FROM ubuntu

Команда MAINTAINER

Одна из команд, которые можно поместить в любую точку сценария (хотя рекомендуется всё же указывать её в начале). Эта команда не выполняется, она позволяет задать имя автора. Она всегда должна идти после FROM.

# Usage: MAINTAINER [name] MAINTAINER authors_name

Команда RUN

RUN – основная команда Dockerfile для запуска других команд. Она запускает указанную команду внутри контейнера с учётом всех аргументов. В отличие от CMD, её можно использовать для сборки образа (формирования нового уровня).

# Usage: RUN [command] RUN aptitude install -y riak

Директива USER

Эта директива задаёт имя пользователя (или UID), с помощью которого нужно запустить контейнер.

# Usage: USER [UID] USER 751

Команда VOLUME

VOLUME разрешает контейнеру доступ к заданному каталогу на локальной машине.

# Usage: VOLUME ["/dir_1", "/dir_2" ..] VOLUME ["/my_files"]

Директива WORKDIR

WORKDIR устанавливает рабочий каталог, в котором будет выполнена команда, указанная в CMD.

# Usage: WORKDIR /path
WORKDIR ~/

Использование Dockerfile

Использовать Dockerfile не сложнее, чем демон Docker. После запуска сценарий выведет ID нового образа.

# Build an image using the Dockerfile at current location
# Example: sudo docker build -t [name] .
sudo docker build -t my_mongodb .

Пример Dockerfile: образ для установки MongoDB

Теперь попробуйте создать Dockerfile и добавить в него пошаговые инструкции по установке MongoDB.

Примечание: Все нижеприведённые команды и аргументы нужно добавить в Dockerfile последовательно. В конце руководства можно найти полный код файла.

Создайте Dockerfile с помощью текстового редактора:

sudo nano Dockerfile

Определите цель файла. Это опционально, но очень полезно: так вы можете сообщить другим, для чего будет предназначен данный образ. К примеру, в начало файла можно поместить такой комментарий:

############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################

Задайте базовый образ:

# Set the base image to Ubuntu
FROM ubuntu

Укажите его автора:

# File Author / Maintainer
MAINTAINER Example McAuthor

Обновите список репозитория приложения.

# Update the repository sources list
RUN apt-get update

Задайте команды и аргументы для загрузки MongoDB:

################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
# Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
# Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
# Update the repository sources list once more
RUN apt-get update
# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen
# Create the default data directory
RUN mkdir -p /data/db
##################### INSTALLATION END #####################

Затем укажите порт по умолчанию:

# Expose the default port
EXPOSE 27017
# Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"] # Set default container command
ENTRYPOINT usr/bin/mongod

Сохраните Dockerfile, добавив в него всё необходимое. Для этого нажмите CTRL+X и Y.

В результате файл должен выглядеть так:

############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################
# Set the base image to Ubuntu
FROM ubuntu
# File Author / Maintainer
MAINTAINER Example McAuthor
# Update the repository sources list
RUN apt-get update
################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
# Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
# Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
# Update the repository sources list once more
RUN apt-get update
# Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen
# Create the default data directory
RUN mkdir -p /data/db
##################### INSTALLATION END #####################
# Expose the default port
EXPOSE 27017
# Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"] # Set default container command
ENTRYPOINT usr/bin/mongod

Теперь можно собрать образ MongoDB с помощью этого сценария.

sudo docker build -t my_mongodb .

Примечание: Флаг -t [name] задаёт название образа. Чтобы получить справку по сборке, введите команду:

sudo docker build --help

Запуск MongoDB

С помощью образа MongoDB можно создать контейнер.

Примечание: Чтобы задать имя контейнера, добавьте флаг -name [].

sudo docker run -name my_first_mdb_instance -i -t my_mongodb

Если при запуске контейнера вы не укажете его имя, docker присвоит ему сложный алфавитно-цифровой ID. Его можно узнать с помощью команды:

sudo docker ps -l

Чтобы отключить контейнер, нажмите CTRL+P и CTRL+Q.

Tags: , , ,

Добавить комментарий