Статьи

Как создать изображение с помощью Dockerfile

Создание образа с помощью Dockerfile

Сборка приложения, установка зависимостей и сервисов, автоматизация развертывания и многое другое — все это начинается с Dockerfile. Давайте рассмотрим синтаксис, от базового до сложного, и некоторые рекомендации по созданию образов Docker.

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

Почему Докер

docker_logo

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

Технология программных контейнеров, которую реализует Docker, делает это возможным. И хотя я не буду здесь подробно останавливаться на деталях, вы можете прочитать больше о Docker, о том, что такое программные контейнеры и как они работают, в разделе «Общие сведения о Docker, контейнерах и безопасной доставке программного обеспечения» .

Установка Docker

Перед запуском необходимо установить Docker, будь то на локальном компьютере или на удаленном сервере.

К счастью, последняя версия Docker (1.12 на момент написания статьи) сделала процесс установки действительно плавным, и у вас есть простые в использовании руководства для Windows , MacOS и Linux .

Dockerfile

Чтобы создать образ в Docker, сначала необходимо установить инструкции для этой сборки в виде простого текстового файла с именем Dockerfileконтекста (подробнее об этом позже). Этот файл имеет синтаксис, аналогичный синтаксису файлов конфигурации Apache — одна инструкция на строку с соответствующими аргументами и все инструкции обрабатываются последовательно, одна за другой. Комментариям предшествуют символ # Наконец, когда у вас есть Dockerfile, команда docker build

Прежде чем мы начнем писать Dockerfile, мы установим рабочее пространство. Мы создадим каталог с именем my_imageDockerfilemkdir ~/my_build
cd ~/my_build
touch Dockerfile

 scratch

Теперь мы готовы начать строить изображение.

Выбор базового изображения

В большинстве случаев при создании изображения вы будете использовать отправную точку, то есть другое изображение. Это может быть официальный Ubuntu , MySQL , WordPress или любое другое изображение, доступное в Docker Hub . Вы также можете использовать изображение, которое вы создали ранее.

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

Например, если вы хотите начать с минимального дистрибутива Debian, вы добавите в # set the base image
FROM debian

 FROM

: должна быть первой инструкцией, которую вы используете при написании Dockerfile. Обратите внимание, что вы также можете использовать определенную версию вашего базового изображения, добавив version_name# set the base image
FROM debian:sid
Например:

 debian

В приведенном выше коде мы используем Debian «sid» (нестабильный дистрибутив). Это будет актуально также, когда вам нужна конкретная версия интерпретатора Ruby или Python, версия MySQL или что у вас есть, когда вы используете официальный базовый образ для любого из этих инструментов. Сейчас мы будем придерживаться стандартного (стабильного) образа MAINTAINER

Указание сопровождающего и добавление метаданных

При желании вы можете указать, кто является Lucero del Alba , заменив

 # author
MAINTAINER Lucero del Alba

В этом нет необходимости, но мы также можем добавить некоторые метаданные, используя инструкцию LABEL , и эта информация станет доступной позже при использовании команды docker inspect для проверки изображения:

 # extra metadata
LABEL version="1.0"
LABEL description="First image with Dockerfile."

Для получения дополнительной информации об этой функции обратитесь к меткам объектов Docker .

Создание собственного дистрибутива

Логотип Linux

На данный момент, мы собираемся выбрать некоторые инструменты и библиотеки, которые будут включены в наш образ, чтобы у нашего контейнера было все необходимое для того, что мы намереваемся сделать. В конце этого урока мы сделаем что-то, что очень близко к созданию дистрибутива Linux.

Некоторые контейнеры, например один, в котором работает база данных PostgreSQL, предназначены для работы в фоновом режиме. Но часто нам нужна консоль для выполнения некоторых операций над контейнером, поэтому нам, вероятно, понадобятся некоторые дополнительные инструменты, потому что базовый образ будет включать в себя только минимальный набор инструментов GNU.

Решение проблем с кешем

Почти гарантировано, что у вас возникнут проблемы с кешем при попытке установить дополнительные пакеты на ваш образ. Это связано с тем, что базовое изображение содержит кэшированные метаданные, а живые репозитории, из которых вы извлекаете данные, часто меняются.

В дистрибутивах на основе Debian вы можете справиться с этим, добавив следующие команды перед установкой новых пакетов:

 # update sources list
RUN apt-get clean
RUN apt-get update

Установка основных инструментов

Редакторы кода, локали, инструменты, такие как gittmux

Мы установим по одному на строку:

 # install basic apps, one per line for better caching
RUN apt-get install -qy git
RUN apt-get install -qy locales
RUN apt-get install -qy nano
RUN apt-get install -qy tmux
RUN apt-get install -qy wget

Мы могли бы установить их все в одну строку, но если позже мы захотим добавить или удалить пакет, нам нужно перезапустить весь процесс. Таким образом, лучшая практика здесь — устанавливать один пакет на строку, чтобы вы могли извлечь выгоду из кэширования Docker.

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

Установка исполняемых библиотек для вашего приложения

Мы также отправим наше приложение на этом изображении. Вам нужна конкретная версия PHP, Ruby или Python вместе с определенными модулями? Теперь настало время доставить все программы и среды выполнения, которые понадобятся нашему приложению.

Будьте конкретны, как хотите, так как этот контейнер предназначен для запуска только вашего приложения:

 # install app runtimes and modules
RUN apt-get install -qy python3
RUN apt-get install -qy python3-psycopg2
RUN apt-get install -qy python3-pystache
RUN apt-get install -qy python3-yaml

В этом примере мы установим Python 3 с пакетами Psycopg 2 (для подключения к базам данных PostgreSQL), модулем Mustache для Python и модулем YAML. (Естественно, вы будете устанавливать конкретные зависимости, которые вам нужны при создании собственного Dockerfile.)

Компиляция и загрузка пакетов

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

Вы даже можете написать скрипт для отдельного файла, добавить этот файл в сборку и запустить его, как мы увидим позже в разделе «Доставка вашего собственного приложения».

Убираться

Чтобы сохранить образ чистым и как можно меньшим, рекомендуется также выполнить очистку в конце последовательности установки:

 # cleanup
RUN apt-get -qy autoremove

Опять же, обратите внимание, что мы используем apt-get

Доставка вашего собственного приложения

Смысл построения этой среды заключается в том, чтобы вы могли беспрепятственно доставить ваше приложение и запустить его. Чтобы добавить файлы, каталоги и даже содержимое удаленных URL-адресов к изображению, мы будем использовать инструкцию ADD .

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

Допустим, что с приложением и всем, что мы хотим поместить в изображение, у нас есть следующие файлы в ~/my_buildapp.pylib.pyapp/

 .bashrc
.profile
app/app.py
app/lib.py
Dockerfile

Мы добавим скрипты .bashrc.profile/rootapp//app/

Мы добавляем следующие инструкции:

 # add scripts to the container
ADD .bashrc /root/.bashrc
ADD .profile /root/.profile

# add the application to the container
ADD app /app

Настройка вашей среды

Наконец, мы установим некоторые переменные среды, которые нам понадобятся на уровне системы и приложения.

Многие из вас прекрасно справятся с набором символов Debian по умолчанию, но, поскольку мы нацелены на международную аудиторию, давайте посмотрим, как получить терминал UTF-8. Ранее мы установили пакет locales

 # locales to UTF-8
RUN locale-gen C.UTF-8 && /usr/sbin/update-locale LANG=C.UTF-8
ENV LC_ALL C.UTF-8

Вам также может понадобиться установить некоторые переменные среды для вашего приложения, для обмена паролями и путями. Dockerfile предоставляет инструкцию ENV для выполнения именно этого:

 # app environment
ENV PYTHONIOENCODING UTF-8
ENV PYTHONPATH /app/

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

Полный Dockerfile

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

Вот полный файл:

 # author
MAINTAINER Lucero del Alba

# extra metadata
LABEL version="1.0"
LABEL description="First image with Dockerfile."

# set the base image
FROM debian

# update sources list
RUN apt-get clean
RUN apt-get update

# install basic apps, one per line for better caching
RUN apt-get install -qy git
RUN apt-get install -qy locales
RUN apt-get install -qy nano
RUN apt-get install -qy tmux
RUN apt-get install -qy wget

# install app runtimes and modules
RUN apt-get install -qy python3
RUN apt-get install -qy python3-psycopg2
RUN apt-get install -qy python3-pystache
RUN apt-get install -qy python3-yaml

# cleanup
RUN apt-get -qy autoremove

# add scripts to the container
ADD .bashrc /root/.bashrc
ADD .profile /root/.profile

# add the application to the container
ADD app /app

# locales to UTF-8
RUN locale-gen C.UTF-8 && /usr/sbin/update-locale LANG=C.UTF-8
ENV LC_ALL C.UTF-8

# app environment
ENV PYTHONIOENCODING UTF-8
ENV PYTHONPATH /app/

Создание изображения

Внутри каталога my_builddocker build , передавая флаг -tmy_image . указывает, что Dockerfile

 cd ~/my_build
docker build -t my_image .

Это создаст длинный вывод, где каждый «шаг» является инструкцией в нашем Dockerfile. Это усеченный вывод:

 Sending build context to Docker daemon  5.12 kB
Step 1 : FROM debian
 ---> 7b0a06c805e8
Step 2 : MAINTAINER Lucero del Alba
 ---> Running in d37e46e5455d
 ---> 2d76561de558
Removing intermediate container d37e46e5455d
Step 3 : LABEL version "1.0"
 ---> Running in 904dde1b4cd7
 ---> a74b7a492aaa
Removing intermediate container 904dde1b4cd7
Step 4 : LABEL description "First image with Dockerfile."
 ---> Running in 9aaef0353256
 ---> 027d8c10e966
Removing intermediate container 9aaef0353256
Step 5 : RUN apt-get clean
 ---> Running in bc9ed85dda16
 ---> a7407036e74a
Removing intermediate container bc9ed85dda16
Step 6 : RUN apt-get update
 ---> Running in 265e757a7563
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
Ign http://deb.debian.org jessie InRelease
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]
Get:3 http://deb.debian.org jessie Release.gpg [2373 B]
Get:4 http://deb.debian.org jessie Release [148 kB]
Get:5 http://security.debian.org jessie/updates/main amd64 Packages [402 kB]
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [17.6 kB]
Get:7 http://deb.debian.org jessie/main amd64 Packages [9064 kB]
Fetched 9843 kB in 10s (944 kB/s)
Reading package lists...
 ---> 93fa0a42fcdc
Removing intermediate container 265e757a7563
Step 7 : RUN apt-get install -qy git
 ---> Running in c9b93cecd953
(...)

Листинг изображений

Мы можем перечислить наши изображения с помощью команды docker images :

 docker images

Это выведет наш недавно созданный my_image

 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_image            latest              e71dc183df2b        8 seconds ago       305.6 MB
debian              latest              7b0a06c805e8        2 weeks ago         123 MB
debian              sid                 c1857cb435d7        3 weeks ago         97.77 MB

… И вот оно, наш образ готов к отправке и запуску !

Запуск контейнера

Наконец, чтобы запустить интерактивный терминал нашего вновь созданного образа, мы будем использовать команду docker run :

 docker run -ti my_image /bin/bash

Что делать дальше

Я не раскрыл все возможности Dockerfile. В частности, я не рассмотрел, как EXPOSE порты, чтобы вы могли запускать службы и даже связывать контейнеры между собой; как HEALTHCHECK контейнеры, чтобы убедиться, что они все еще работают; или даже как указать VOLUME для хранения и восстановления данных с хост-машины… среди других полезных функций.

Мы расскажем о них в следующих статьях. На данный момент, вы можете проверить следующие ресурсы.

С веб-сайта Docker:

Из SitePoint: