Docker, лекция 3. Сборка образов

Docker, лекция 3. Сборка образов

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

Для этой лекции контейнер будет запускать статическое HTML-приложение с использованием веб-сервера Nginx.

Имя компьютера, на котором запущен контейнер: Docker. Если вы хотите получить доступ к какой-либо из служб — используйте docker вместо localhost или 0.0.0.0.

Об образах Docker

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

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

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

Начнем создавать

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

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

Dockerfile — это простые текстовые файлы с командой в каждой строке. Чтобы определить базовый образ, нужно использовать инструкцию FROM <image-name>: <tag>. Добавим образ в Dockerfile.

FROM nginx:1.11-alpine

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

Время команд в Dockerfile

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

RUN <команда> позволяет вам выполнить любую команду, как в командной строке, например, установить различные пакеты приложений или выполнить команду сборки. Результаты RUN сохраняются в образе, поэтому важно не оставлять ненужные или временные файлы на диске, так как они будут включены в образ.

COPY <src> <dest> позволяет копировать файлы из каталога, содержащего Dockerfile, в образ контейнера. Это чрезвычайно полезно для исходного кода и ресурсов, которые вы хотите развернуть внутри своего контейнера.

Для примера создадим новый файл index.html, который добавим в контейнер. На следующей строке после команды FROM созданного ранее dockerfile добавим команду команду COPY, чтобы скопировать index.html в каталог с именем /usr/share/nginx/html

COPY index.html /usr/share/nginx/html/index.html

С настроенным образом Docker и определившись, какие порты будут открыты, нужно указать команду, которая запускает приложение.

С настроенным образом Docker и определением, какие порты мы хотим сделать доступными, теперь нам нужно определить команду, которая запускает приложение.

Строка CMD в Dockerfile определяет команду по умолчанию, запускаемую при запуске контейнера. Если команде требуются аргументы, рекомендуется использовать массив, например:

["cmd", "-a", "arga value", "-b", "argb-value"]

Массив будет объединен вместе и итоговая команда ниже будет выполнена:

cmd -a "arga value" -b argb-value

Ещё пример — передадим команду nginx. По-умолчанию демон NGINX будет выключен:

CMD ["nginx", "-g", "daemon off;"]

Порты

Файлы скопированы в наш образ, теперь нужно определить, на каком порте приложение должно быть доступно.

Используя команду EXPOSE <port>, нужно сообщить Docker, какие порты должны быть открыты. Вы можете определить несколько портов в одной команде, например, EXPOSE 80 433 или EXPOSE 7000-8000. Добавим в наш файл конфигурации:

EXPOSE 80

Время собрать контейнер

После написания Dockerfile нужно использовать команду docker build, чтобы превратить его в образ. Команда build принимает каталог, содержащий Dockerfile, выполняет шаги и сохраняет образ в вашем локальном Docker Engine. Если произошел сбой из-за ошибки, сборка прекращается.

Итоговый dockerfile этой лекции приведен ниже. Это nginx версии 1.11, в который скопирована html страница и выключен демон веб-службы.

FROM nginx:1.11-alpine COPY index.html /usr/share/nginx/html/index.html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]

Итак, выполняем команду docker build для создания образа. Можно дать образу понятное имя, используя опцию -t <name>.

docker build -t my-nginx-image:latest .

Не стоит забывать о команде docker images для просмотра списка образов.

Время запуска

После успешного создания образа можно запустить контейнер так же, как это описано в первой лекции.

NGINX предназначен для работы в качестве фоновой службы, поэтому ему нужно включить опцию -d. Чтобы сделать веб-сервер доступным, нужно привязать его к порту 80, используя -p 80:80. Например:

docker run -d -p 80:80 image-id или friendly-tag-name

Теперь можно получить доступ к запущенному веб-серверу по имени хоста docker. После запуска контейнера команда curl -i http: // docker вернет наш index.html через NGINX и созданный нами образ.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *