
Образы неизменяемы, то есть их нельзя изменить после создания. Чтобы внести изменения, нужно создать новый образ. Образы также многослойны, то есть каждый образ строится поверх базового образа, добавляя только те изменения, которые необходимы для этого конкретного образа. Это делает образы легкими, многоразовыми и быстрыми в создании.
Работа с образами Docker состоит из двух основных этапов:
- Сборка — создание образа Docker из файла Dockerfile
- Pushing — загрузка образа в реестр, например Docker Hub
В этом руководстве мы подробно рассмотрим эти шаги, включая:
- Основы работы с докерфайлами
- Локальная сборка образов
- Тегирование изображений
- Отправка изображений в реестры
- Управление изображениями
Основы работы с докерфайлами
Образы Docker создаются из Dockerfile — текстового файла, содержащего инструкции по созданию образа. Dockerfile определяет все, что входит в образ — ОС, конфигурации, файлы и папки для копирования, сетевые порты для выставления, тома Docker для создания и многое другое.
Некоторые распространенные инструкции Dockerfile включают:
FROM
— Устанавливает базовый образ для сборкиCOPY
— Копирование файлов с хоста в образRUN
— Запуск команд и сценариев оболочки во время сборкиEXPOSE
— Открыть сетевые порты, которые будет прослушивать контейнерENV
— Установка переменных окруженияENTRYPOINT
— Определите исполняемый файл, который будет запускаться при старте контейнераCMD
— Параметры по умолчанию, которые передаются в ENTRYPOINT
Вот пример простого Dockerfile, который создает приложение Node.js:
# Use the latest Node.js 11 base image
FROM node:11
# Set the working directory in the container
WORKDIR /app
# Copy package files and install dependencies
COPY package*.json ./
RUN npm install
# Copy app source code
COPY . .
# Expose port and start application
EXPOSE 8080
CMD ["node", "app.js"]
Здесь используется node:11
образ в качестве отправной точки, копирует исходный код приложения в образ, устанавливает зависимости и устанавливает запуск приложения при запуске контейнера.
Создание локальных образов
Подготовив Dockerfile, вы можете собрать образ с помощью команды docker build
команду. При этом образ будет собираться шаг за шагом в соответствии с инструкциями Dockerfile.
Основной формат следующий:
$ docker build [options] PATH
Где PATH — местоположение Dockerfile.
Например:
$ docker build -t my-app .
Это приведет к поиску Dockerfile в текущем каталоге и созданию образа под названием my-app
из него.
Некоторые ключевые опции:
-t
— Пометить изображение именем репозитория и тегом--no-cache
— Сборка образа с нуля вместо использования кэша-f
— Путь к Dockerfile, если он не находится в текущем каталоге
Вы можете создавать образы для разных окружений или параметров, просто имея несколько Dockerфайлов, например, Dockerfile.dev, Dockerfile.prod.
Во время разработки вы захотите быстро выполнять итерации, часто перестраивая образы по мере внесения изменений в приложение. Использование кэша значительно ускоряет время пересборки.
Тегирование изображений
Теги изображений идентифицируют принадлежность изображения к репозиторию и указывают название версии или варианта.
Теги состоят из имени репозитория и имени тега, разделенных двоеточием, например my-app:latest
.
При сборке образа в качестве параметра -t
флаг помечает его:
$ docker build -t my-app:latest .
Это название изображения my-app
и помечает его тегами latest
.
Если тег не указан, latest
предполагается.
Некоторые распространенные стратегии маркировки:
latest
— Самая последняя стабильная версия- Git commit SHA — пометить сборку коммитом SHA для отслеживания
- Семантические версии — Метки типа
v1.0.2
для версий релизов - Теги вариантов — такие как
prod
,test
,dev
для обозначения того, для чего используется изображение
Примечание: Метки придают изображению смысл и контекст. Неотмеченными изображениями трудно управлять.
Вы можете изменить существующее изображение, добавив или изменив теги:
$ docker tag my-app:latest my-app:v1.0
Отправка образов в реестры Docker
Чтобы поделиться образами Docker с другими, нужно отправить их в реестр. В реестре хранятся образы Docker, которые затем могут быть извлечены и использованы любым хостом Docker.
По умолчанию используется реестр Docker Hub, где есть публичные и частные репозитории.
Чтобы выложить изображение:
- Пометьте изображение именем реестра:
$ docker tag my-app:latest mydockerid/my-app:latest
- Переместите помеченное изображение:
$ docker push mydockerid/my-app:latest
Это позволит загрузить изображение my-app:latest
в mydockerid
пространство имен на Docker Hub.
Чтобы переместить в другой реестр:
$ docker push registry.example.com/my-app:latest
Некоторые компании ведут внутренние частные реестры для хранения собственных изображений. Они требуют аутентификации и SSL для обеспечения безопасности.
В конвейере CI/CD можно автоматизировать сборку и отправку образов в реестры при каждом изменении кода. Это позволяет непрерывно развертывать приложения, используя самые свежие образы.
Управление локальными образами
По мере создания образов хост Docker будет хранить их локально в движке Docker. Чтобы освободить место на диске, необходимо время от времени очищать старые и неиспользуемые образы.
Некоторые полезные команды для управления образами:
docker images
— Перечисляет все изображения на хостеdocker image rm
— Удалить одно или несколько изображенийdocker image prune
— Удаление неиспользуемых и висящих изображенийdocker rmi
— Удаление изображений по идентификатору или имени
Пример удаления изображений:
# Remove specific image
$ docker image rm my-app:latest
# Remove all images matching name
$ docker image rm my-app
# Remove dangling images
$ docker image prune
# Remove all images
$ docker rmi $(docker images -q)
Используйте эти команды с осторожностью, чтобы случайно не удалить изображения, которые еще используются или необходимы.
Вы также можете настроить автоматические политики удаления старых изображений. Например, всегда сохранять только 10 самых последних тегов изображений для каждого хранилища.
Заключение
На этом основы создания, маркировки, распространения и управления образами Docker исчерпаны!
Основные выводы:
- Файлы Dockerfiles определяют, как создаются образы
docker build
превращает Dockerfile в запускаемый образ- Образы должны быть помечены именами репозитория и версии
docker push
загружает изображения в реестры, такие как Docker Hubdocker image
команды управления образами на хосте Docker
Овладев этими основами, вы сможете эффективно использовать образы Docker для последовательной и надежной упаковки и развертывания приложений. Автоматизация создания и развертывания образов позволит вам перейти к зрелым практикам DevOps.