Упаковка вашего программного обеспечения
Dockerfile
Все начинается с Docker-файла.
Docker собирает образы, считывая инструкции из Dockerfile. Это текстовый файл, содержащий инструкции, которые придерживаются определённого формата, необходимого для сборки вашего приложения в образ контейнера, и для которого вы можете найти ссылку на его спецификацию в справочнике на Docker-файл.
Вот наиболее распространенные типы инструкций:
Оператор |
Описание |
---|---|
|
Определяет основу для вашего образа. |
|
Выполняет любые команды в новом слое поверх текущего образа и фиксирует результат. |
|
Устанавливает рабочий каталог для всех инструкций |
|
Копирует новые файлы или каталоги из |
|
Позволяет определить программу по умолчанию, которая будет запущена после запуска контейнера на основе этого образа. Каждый Dockerfile имеет только один |
Файлы Dockerfiles являются важнейшими исходными данными для сборки образов и могут способствовать автоматизированной многоуровневой сборке образов на основе ваших уникальных конфигураций. Dockerfiles могут начинаться просто и развиваться в зависимости от ваших потребностей и поддерживать образы, требующие сложных инструкций. Все возможные инструкции см. в справочнике на Docker-файл.
Имя файла по умолчанию для Dockerfile — Dockerfile
, без расширения. Использование имени по умолчанию позволяет выполняет команду docker build
без необходимости указывать дополнительные флаги команды.
Некоторые проекты могут нуждаться в отдельных Docker-файлах для конкретных целей. Обычно принято называть их <something>.Dockerfile
. Такие Dockerfiles можно использовать с помощью опции --file
(или сокращенно -f
) в команде docker build
. Обратитесь к Раздел «Указывает Dockerfile» в справке docker build
, чтобы узнать об опции --file
.
Примечание
Мы рекомендуем использовать значение по умолчанию (Dockerfile
) для основного Dockerfile вашего проекта.
Образы Docker состоят из слоев, доступных только для чтения, каждый из которых является результатом инструкции в Dockerfile. Слои укладываются последовательно, и каждый из них представляет собой дельту, отражающую изменения, примененные к предыдущему слою.
Пример
Вот простой пример Dockerfile, который поможет вам начать работу с созданием образов. Мы возьмем простое Python Flask-приложение «Hello World» и соберем его в Docker-образ, который можно тестировать локально или развернуть где угодно!
Допустим, у нас есть файл hello.py
со следующим содержимым:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
Не беспокойтесь о понимании полного примера, если вы не знакомы с Python, это всего лишь простой веб-сервер, который будет содержать единственную страницу с текстом «Hello World».
Примечание
Если вы тестируете пример, не забудьте также копирует отступ! Дополнительные сведения об этом примере приложения Flask см. на странице Быстрый старт Flask.
Вот Dockerfile, который будет использоваться для создания образа для нашего приложения:
# syntax=docker/dockerfile:1
FROM ubuntu:22.04
# install app dependencies
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip install flask==2.1.*
# install app
COPY hello.py /
# final configuration
ENV FLASK_APP=hello
EXPOSE 8000
CMD flask run --host 0.0.0.0 --port 8000
Первой строкой, добавляемой в Dockerfile, является # директива парсера. Хотя эта директива необязательна, она указывает программе Docker builder, какой синтаксис использовать при разборе Dockerfile, и позволяет старым версиям Docker с BuildKitenabled использовать определённый Внешний интерфейс докерфайла перед началом сборки. Директивы парсера должна появляться перед любым другим комментарием, пробелом или инструкцией Dockerfile в вашем Dockerfile, и должна быть первой строкой в Dockerfiles.
# syntax=docker/dockerfile:1
Примечание
Мы рекомендуем использовать docker/dockerfile:1
, который всегда указывает на последний релиз синтаксиса версии 1. BuildKit автоматически проверяет наличие обновлений синтаксиса перед сборкой, гарантируя, что вы используете самую последнюю версию.
Далее мы определяем первую инструкцию:
FROM ubuntu:22.04
Здесь FROM оператор устанавливает наш базовый образ на версию Ubuntu 22.04. Все следующие инструкции выполняются для этого базового образа, в данном случае для среды Ubuntu. Обозначение ubuntu:22.04
соответствует стандарту name:tag
для именования образов докеров. Когда вы создаёте свой образ, вы используете эту нотацию для именования ваших образов и используете её для указания любого существующего образа Docker. Есть много общедоступных образов, которые вы можете использовать в своих проектах. Исследуйте ДокерХаб, чтобы узнать.
# install app dependencies
RUN apt-get update && apt-get install -y python3 python3-pip
Эта оператор RUN выполняет команду shell в build context.
В данном примере нашим контекстом является полная операционная система Ubuntu, поэтому у нас есть доступ к её менеджеру пакетов, apt. Представленные команды обновляют наши списки пакетов, а затем, после успешного завершения, устанавливают python3
и pip
, менеджер пакетов для Python.
Также обратите внимание на строку # install app dependencies
. Это комментарий. Комментарии в Dockerфайлах начинаются с символа #
. По мере развития вашего Dockerfile комментарии могут быть полезны для документирования работы вашего dockerfile для любых будущих читателей и редакторов файла.
Примечание
Начало вашего Dockerfile с #
, как и обычные комментарии, рассматривается как директива, если вы используете BuildKit (по умолчанию), в противном случае оно игнорируется.
RUN pip install flask==2.1.*
Эта вторая оператор RUN
требует, чтобы мы ранее установили pip в слой. После применения предыдущей директивы мы можем использовать команду pip для установки веб-фреймворка flask. Данный фреймворк мы использовали для написания нашего базового приложения «Hello World», поэтому, чтобы запускает его в Docker, нам нужно убедиться, что он установлен.
COPY hello.py /
Теперь мы используем инструкцию КОПИРОВАТЬ для копирования нашего файла hello.py
из локального каталога build context в корневой каталог нашего образа. После выполнения мы получим файл с именем /hello.py
внутри образа.
ENV FLASK_APP=hello
Эта оператор ENV устанавливает переменную окружения Linux, которая понадобится нам позже. Это специфическая для flask переменная, которая настраивает команду, используемую позже для запуска нашего приложения hello.py
. Без этого flask не будет знать, где найти наше приложение, чтобы запускает его.
EXPOSE 8000
Эта оператор ОБНАРУЖИТЬ отмечает, что наш конечный образ имеет службу, прослушивающую порт 8000
. Это не обязательно, но это хорошая практика, т. к. пользователи и инструменты могут использовать это, чтобы понять, что делает ваш образ.
CMD flask run --host 0.0.0.0 --port 8000
Наконец, Оператор CMD задаёт команду, которая будет выполняться, когда пользователь запускает контейнер на основе этого образа. В данном случае мы запустим сервер разработки flask, прослушивающий все адреса на порту 8000
.
Тестирование
Чтобы протестировать наш Dockerfile, мы сначала создадим его с помощью команды сборка докеров:
$ docker build -t test:latest .
Здесь опция -t test:latest
указывает имя (обязательно) и тег (необязательно) образа, которое мы создаём. .
указывает build context в качестве текущего каталога. В данном примере это место, где build ожидает найти Dockerfile и локальные файлы, к которым Dockerfile должен получает доступ, в данном случае ваше Python-приложение.
Итак, в соответствии с выданной командой сборки и тем, как работает build context, ваш Dockerfile и python-приложение должны находиться в одном каталоге.
Теперь запускает только что созданный образ:
$ docker run -p 8000:8000 test:latest
На компьютере открывает браузер и перейдите по адресу http://localhost:8000
Примечание
Вы также можете создавать и запускать с помощью Играйте с Docker, который предоставляет вам временный экземпляр Docker в облаке.
Другие ресурсы
Если вас интересуют примеры на других языках, например, на Go, посмотрите наш руководства по конкретным языкам в разделе «Руководства».