Поиск по сайту:

Объяснение Docker: использование Dockerfiles для автоматизации создания образов


Статус: устарело

Эта статья устарела и больше не поддерживается.

Причина

Методы, описанные в этой статье, устарели и могут больше не отражать лучшие практики Docker.

Смотрите вместо этого

  • Экосистема Docker: введение в общие компоненты
  • Справочник по файлу Docker
  • Рекомендации по созданию файлов Dockerfile

Введение

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

При создании образов с помощью Docker каждое предпринятое действие (т. е. выполняемая команда, такая как apt-get install) формирует новый слой поверх предыдущего. Затем эти базовые образы можно использовать для создания новых контейнеров.

В этой статье DigitalOcean мы увидим, как максимально автоматизировать этот процесс, а также продемонстрируем лучшие практики и методы, чтобы максимально использовать Docker и контейнеры с помощью Dockerfiles: скрипты для создания контейнеров, пошаговые поэтапно, послойно, автоматически из базового образа.

Глоссарий

1. Докер вкратце

2. Докерфайлы

3. Синтаксис Dockerfile

  1. Что такое синтаксис?
  2. Пример синтаксиса файла Docker

4. Команды Dockerfile

  1. ДОБАВИТЬ
  2. Командная команда
  3. ВХОД
  4. ОКРУГ
  5. ПОКАЗАТЬ
  6. ОТ
  7. ОБСЛУЖИВАТЕЛЬ
  8. БЕГ
  9. ПОЛЬЗОВАТЕЛЬ
  10. ОБЪЕМ
  11. РАБОЧИЙ КАТАЛОГ

5. Как использовать файлы Docker

6. Пример файла Docker: создание образа для установки MongoDB

  1. Создание пустого файла Docker
  2. Определение нашего файла и его назначения
  3. Настройка базового изображения для использования
  4. Определение сопровождающего (автора)
  5. Обновление списка репозиториев приложений
  6. Установка аргументов и команд для загрузки MongoDB
  7. Установка порта по умолчанию для MongoDB
  8. Сохранение файла Docker
  9. Создаем первое изображение
  10. Запуск экземпляра MongoDB

Докер вкратце

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

Docker достигает этого путем создания безопасных сред на основе LXC (т. е. контейнеров Linux) для приложений, называемых «контейнерами Docker». Эти контейнеры создаются с использованием образов Docker, которые можно создать либо путем выполнения команд вручную, либо автоматически через Dockerfiles.

Примечание. Чтобы узнать больше о Docker и его частях (например, о демоне Docker, интерфейсе командной строки, изображениях и т. д.), ознакомьтесь с нашей вводной статьей к проекту: Как установить и использовать Docker в Ubuntu 16.04.

Dockerfiles

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

Файлы Docker начинаются с определения образа, ИЗ которого начинается процесс сборки. Затем следуют различные другие методы, команды и аргументы (или условия), в свою очередь, предоставляющие новый образ, который будет использоваться для создания контейнеров докеров.

Их можно использовать, предоставляя содержимое файла Dockerfile различными способами демону docker для создания образа (как описано в разделе «Как использовать»).

Синтаксис Dockerfile

Прежде чем мы начнем говорить о Dockerfiles, давайте быстро рассмотрим его синтаксис и то, что это на самом деле означает.

Что такое синтаксис?

Проще говоря, синтаксис в программировании означает структуру для упорядочения команд, аргументов и всего остального, что требуется для программирования приложения для выполнения процедуры (то есть функции/набора инструкций).

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

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

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

Синтаксис Dockerfile состоит из двух основных блоков строк: комментариев и команд + аргументов.

# Line blocks used for commenting
command argument argument ..

Простой пример:

# Print "Hello docker!"
RUN echo "Hello docker!"

Команды Dockerfile (Инструкции)

В настоящее время существует около дюжины различных наборов команд, которые могут содержаться в Dockerfiles для создания образа Docker. В этом разделе мы рассмотрим их все по отдельности, прежде чем работать над примером Dockerfile.

Примечание. Как объяснялось в предыдущем разделе (Синтаксис Dockerfile), все эти команды должны быть последовательно перечислены (т. е. написаны) внутри одного простого текстового файла (т. демон docker для создания образа. Тем не менее, некоторые из этих команд (например, MAINTAINER) могут быть размещены в любом месте, где вы считаете нужным (но всегда после команды FROM), поскольку они представляют собой не какое-либо выполнение, а скорее значение определения (т. е. просто некоторые Дополнительная информация).

ДОБАВЛЯТЬ

Команда ADD получает два аргумента: источник и место назначения. По сути, он копирует файлы из источника на хосте в собственную файловую систему контейнера в указанном месте назначения. Однако если источником является URL-адрес (например, http://github.com/user/file/), то содержимое URL-адреса загружается и помещается в место назначения.

Пример:

# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder

CMD

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

Для пояснения: примером для CMD будет запуск приложения после создания контейнера, который уже установлен с помощью RUN (например, RUN apt-get install…) внутри образа. Эта команда выполнения приложения по умолчанию, заданная с помощью CMD, становится командой по умолчанию и заменяет любую команду, переданную во время создания.

Пример:

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

ВХОДНАЯ ТОЧКА

Аргумент ENTRYPOINT задает конкретное приложение по умолчанию, которое используется каждый раз при создании контейнера с использованием образа. Например, если вы установили определенное приложение внутри образа и будете использовать этот образ только для запуска этого приложения, вы можете указать это с помощью ENTRYPOINT, и всякий раз, когда из этого образа создается контейнер, ваше приложение будет целевым.

Если вы соедините ENTRYPOINT с CMD, вы можете удалить «приложение» из CMD и просто оставить «аргументы», которые будут переданы в ENTRYPOINT.

Пример:

# 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 используется для установки переменных среды (одной или нескольких). Эти переменные состоят из пар «ключ-значение», доступ к которым внутри контейнера может осуществляться как скриптами, так и приложениями. Эта функциональность Docker предлагает огромную гибкость для запуска программ.

Пример:

# Usage: ENV key value
ENV SERVER_WORKS 4

РАЗОБЛАЧАТЬ

Команда EXPOSE используется для связывания указанного порта, чтобы обеспечить сетевое взаимодействие между запущенным процессом внутри контейнера и внешним миром (т. е. хостом).

Пример:

# Usage: EXPOSE [port]
EXPOSE 8080

Чтобы узнать о сети Docker, ознакомьтесь с документацией по сети контейнера Docker.

ОТ

Директива FROM, вероятно, является самой важной среди всех остальных для Dockerfiles. Он определяет базовый образ, используемый для запуска процесса сборки. Это может быть любое изображение, в том числе созданное вами ранее. Если образ FROM не найден на хосте, Docker попытается найти его (и загрузить) из Docker Hub или другого репозитория контейнеров. Это должна быть первая команда, объявленная внутри Dockerfile.

Пример:

# Usage: FROM [image name]
FROM ubuntu

ОБСЛУЖИВАТЕЛЬ

Одна из команд, которую можно задать в любом месте файла — хотя было бы лучше, если бы она была объявлена сверху — это MAINTAINER. Эта невыполнимая команда объявляет автора, тем самым устанавливая поле автора изображений. Тем не менее, он должен идти после FROM.

Пример:

# Usage: MAINTAINER [name]
MAINTAINER authors_name

БЕГАТЬ

Команда RUN является центральной исполнительной директивой для Dockerfiles. Он принимает команду в качестве аргумента и запускает ее для формирования образа. В отличие от CMD, он фактически используется для создания образа (формирования еще одного слоя поверх предыдущего, который зафиксирован).

Пример:

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

ПОЛЬЗОВАТЕЛЬ

Директива USER используется для установки UID (или имени пользователя), который должен запускать контейнер на основе создаваемого образа.

Пример:

# Usage: USER [UID]
USER 751

ОБЪЕМ

Команда VOLUME используется для включения доступа из вашего контейнера к каталогу на хост-компьютере (т. е. его монтирования).

Пример:

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

РАБОЧИЙКАТАЛОГ

Директива WORKDIR используется для указания, где должна выполняться команда, определенная с помощью CMD.

Пример:

# Usage: WORKDIR /path
WORKDIR ~/

Как использовать Dockerfiles

Использовать Dockerfiles так же просто, как запустить демон Docker. Результатом после выполнения скрипта будет идентификатор нового образа докера.

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

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

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

В этом заключительном разделе для Dockerfiles мы создадим документ Dockerfile и шаг за шагом заполним его конечным результатом наличия Dockerfile, который можно использовать для создания образа Docker для запуска контейнеров MongoDB.

Примечание. После начала редактирования Dockerfile все содержимое и аргументы из разделов ниже должны быть записаны (дописаны) внутри него последовательно, следуя нашему примеру и пояснениям из раздела Docker Syntax. Вы можете увидеть, как будет выглядеть конечный результат, в последнем разделе этого пошагового руководства.

Создание пустого Dockerfile

Используя текстовый редактор nano, давайте начнем редактировать наш Dockerfile.

nano Dockerfile

Определение нашего файла и его назначения

Хотя это и необязательно, всегда полезно позволить себе и всем выяснить (при необходимости), что это за файл и для чего он предназначен. Для этого мы начнем наш Dockerfile с причудливых комментариев (#), чтобы описать его.

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

Настройка базового изображения для использования

# Set the base image to Ubuntu
FROM ubuntu

Определение сопровождающего (автора)

# File Author / Maintainer
MAINTAINER Example McAuthor

Установка аргументов и команд для загрузки 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
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 #####################

Установка порта по умолчанию для MongoDB

# 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.

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

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

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Example McAuthor

################## 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
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 с докером!

docker build -t my_mongodb .

Примечание. Флаг -t [имя] здесь используется для пометки изображения. Чтобы узнать больше о том, что еще можно делать во время сборки, запустите docker build --help.

Запуск экземпляра MongoDB

Используя образ, который мы создали, мы можем теперь перейти к последнему шагу: созданию контейнера с экземпляром MongoDB внутри, используя имя по нашему выбору (при желании с -name [имя]).

docker run -name my_first_mdb_instance -i -t my_mongodb

Примечание. Если имя не задано, нам придется иметь дело со сложными буквенно-цифровыми идентификаторами, которые можно получить, перечислив все контейнеры с помощью docker ps -l.

Примечание. Чтобы отсоединиться от контейнера, используйте управляющую последовательность CTRL+P, за которой следует CTRL+Q.

Наслаждаться!

Прислано: