Руководство по тегам в Docker
В этом уроке мы изучим концепцию тегов в Docker .
Docker поддерживает хранение образов в репозитории Docker Hub . Тег Docker обеспечивает уникальную идентификацию образа Docker. В репозитории Docker есть наборы похожих образов с разными версиями, идентифицируемыми тегами.
Здесь мы научимся помечать образ с помощью команды docker build и docker tag .
2. Понимание тегов Docker
Тег Docker помогает поддерживать версию сборки для отправки образа в Docker Hub . Docker Hub позволяет нам группировать изображения вместе на основе имени и тега. Несколько тегов Docker могут указывать на определенное изображение. По сути, как и в Git, теги Docker похожи на конкретный коммит. Теги Docker — это просто псевдоним для идентификатора изображения.
Имя тега должно быть строкой символов ASCII и может включать строчные и прописные буквы, цифры, символы подчеркивания, точки и тире. Кроме того, имена тегов не должны начинаться с точки или дефиса и могут содержать не более 128 символов.
3. Создайте образ с помощью тега Docker
Прежде чем мы двинемся дальше, давайте сначала создадим образец Dockerfile, чтобы продемонстрировать теги:
FROM centos:7 RUN yum -y install wget RUN yum -y install unzip RUN yum -y install java-1.8.0-openjdk RUN yum clean all ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ RUN export JAVA_HOME
В приведенном выше Dockerfile мы запускаем все необходимые команды для установки java, используя «centos: 7» в качестве базового образа.
3.1. Создайте образ с одним тегом Docker
В Docker мы можем пометить образ во время сборки. Чтобы проиллюстрировать это, давайте проверим команду для пометки изображения:
$ docker build -t foreach-java:5 . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM centos:7 ---> eeb6ee3f44bd Step 2/2 : RUN yum -y install wget ---> Using cache ---> 46ee47a7422d Successfully built 46ee47a7422d Successfully tagged foreach-java:5
Здесь, в приведенной выше команде, мы указали « foreach-java:5 » в качестве тега для образа Docker. Тег в Docker полезен для сохранения версии сборки для отправки образа в DockerHub. Управление версиями обычно используется для развертывания любого образа Docker или возврата к более старой версии.
Мы также можем предоставить тегу имя пользователя и имя изображения, используя следующий синтаксис:
$ docker build -t foreach/foreach-java:5 . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM centos:7 ---> eeb6ee3f44bd .... Successfully built 46ee47a7422d Successfully tagged foreach/foreach-java:5
Здесь, в приведенной выше команде, мы предоставили имя пользователя «foreach» с именем изображения « foreach-java » и тегом « 5 ».
3.2. Создайте образ с несколькими тегами Docker
В Docker мы также можем присвоить изображению несколько тегов. Здесь мы будем использовать команду сборки docker для назначения нескольких тегов изображению с помощью одной команды.
Чтобы продемонстрировать, давайте проверим команду для вышеуказанного Dockerfile:
$ docker build -t foreach-java:5 -t foreach-java:6 . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM centos:7 ---> eeb6ee3f44bd .... Successfully built 46ee47a7422d Successfully tagged foreach-java:5 Successfully tagged foreach-java:6
Здесь мы видим, что 2 тега «foreach-java:5» и «foreach-java:6» созданы для imageId « 46ee47a7422d ».
3.3. Создайте изображение без каких-либо тегов
Мы также можем создать образ Docker без использования тега. Но чтобы отслеживать изображение, мы всегда должны предоставлять тег с именем изображения. Давайте рассмотрим команду для создания образа без тега:
$ docker build -t foreach-java . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM centos:7 ---> eeb6ee3f44bd ... Successfully built 46ee47a7422d Successfully tagged foreach-java:latest
Здесь, в приведенной выше команде, мы создали образ без какого-либо тега, поэтому по умолчанию Docker предоставляет тег для образа как последний « foreach-java:latest» .
Docker всегда указывает на последнюю стабильную версию, используя последний тег. Старые релизы можно даже назвать последними. Но мы не можем предсказать, будет ли это основная или второстепенная версия.
4. Пометьте изображение с помощью команды docker tag
До сих пор мы обсуждали пометку образа с помощью команды сборки docker . Но мы также можем явно пометить изображение с помощью команды docker tag . Пометка изображения просто создает псевдоним для имени изображения или imageId . Здесь мы рассмотрим оба способа пометки изображения.
Общий формат имени образа Docker выглядит следующим образом:
user-name>/image-name>:tag-name>
В приведенном выше фрагменте компонент после двоеточия указывает на тег, прикрепленный к изображению.
Давайте посмотрим на команду, чтобы пометить изображение, используя имя изображения:
$ docker tag foreach-java:6 foreach-java:8
Команда пометить изображение с помощью imageId выглядит следующим образом:
$ docker tag 46ee47a7422d foreach-java:9
Давайте проверим все изображения, созданные на данный момент:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE foreach-java 5 46ee47a7422d 13 minutes ago 370MB foreach-java 6 46ee47a7422d 13 minutes ago 370MB foreach-java 8 46ee47a7422d 13 minutes ago 370MB foreach-java 9 46ee47a7422d 13 minutes ago 370MB foreach-java latest 46ee47a7422d 13 minutes ago 370MB centos 7 eeb6ee3f44bd 7 months ago 204MB
Здесь мы найдем все изображения, созданные на данный момент.
5. Использование тега в команде docker pull
Теги Docker полезны при создании образа или извлечении образа из репозитория Docker Hub.
В нашем Dockerfile мы использовали команду FROM centos:7. Это потянет версию « 7» общедоступного образа Centos .
Мы также можем вытащить изображение с тегом или без него.
Давайте рассмотрим команду с определенным тегом:
$ docker pull centos:7
Команда docker pull без тега:
Рекомендации по использованию тегов и управлению версиями образов контейнеров
Чтобы отправлять образы контейнеров в реестр и развертывать их, нужно разработать стратегию по использованию тегов и управлению версиями. В этой статье описаны два вида тегов для разных этапов жизненного цикла контейнера:
- Стабильные теги можно использовать повторно, например, чтобы указывать основную или дополнительную версию mycontainerimage:1.0.
- Уникальные теги разные для каждого образа, который вы отправляете в реестр, например mycontainerimage:abc123.
Стабильные теги
Рекомендация: используйте стабильные теги для обслуживания базовых образов сборок контейнера. Мы не рекомендуем проводить развертывание со стабильными тегами, потому что они продолжают получать обновления и могут привести к несогласованности в рабочих средах.
Разработчики и системы сборки могут работать со стабильными тегами, которые продолжают получать обновления. Стабильность в этом случае не означает, что содержимое всегда остается одинаковым. Такие теги указывают на стабильность определенной версии образа, которая обеспечивается благодаря обновлениям систем безопасности и платформы.
Пример
Разработчики выпускают версию 1.0. В будущем для этой версии будут созданы обновления, в том числе незначительные. Существует две группы стабильных тегов для основного и вспомогательного номера версии.
- :1 — стабильный тег для основного номера версии. 1 — для новой или последней версии 1.*.
- :1.0 — стабильный тег для версии 1.0. С его помощью разработчики привязывают обновления к этой версии и не допускают наката до версии 1.1.
Когда появляются обновления для базового образа или выпуск для обслуживания платформы, образы со стабильными тегами обновляются до актуального стабильного выпуска версии.
В этом случае постоянно обслуживаются как основной, так и дополнительный номер версии. Такой подход позволяет владельцу предоставлять обслуживаемые базовые образы.
Удаление манифестов без тегов
Во время обновления образа со стабильным тегом тег из прежнего образа удаляется. Манифест предыдущего образа и данные уникального слоя остаются в реестре. Чтобы сохранить размер реестра, можно периодически удалять манифесты без тегов, полученные после обновления образов. Для этого включите автоматическую очистку манифестов без тегов, которые хранятся больше указанного срока, или установите для них политику хранения.
Уникальные теги
Рекомендация: используйте уникальные теги для развертываний, особенно в среде, которая может масштабироваться на нескольких узлах. Скорее всего, вам понадобится проводить принудительное развертывание актуальной версии компонентов. Во время перезагрузки контейнера или масштабировании оркестратора для нескольких экземпляров узлы не получают новую версию, которая не соответствует другим узлам.
Уникальные теги означают, что отправляемые в реестр образы имеют собственный тег. Такие теги не используются повторно. Уникальные теги можно создавать на основе следующих принципов:
- Метка даты и времени. Этот популярный подход показывает, когда был создан образ. Но как снова сопоставить его с системой сборки? Искать ту, что была выполнена в это время? А если вы в другом часовом поясе? Откалиброваны ли все системы сборки по времени в формате UTC?
- Фиксация в Git. Этот подход работает, пока вы не начали обновлять базовые образы. В это случае ваша система сборки отправляет ту же фиксацию Git, что и для прежней сборки. Но ведь у базового образа новое содержимое. Фиксация Git обычно используется для частично стабильных тегов.
- Хэш манифеста. Все образы контейнера, отправляемые в реестр, связаны с манифестом, который обладает уникальным хэшем SHA-256. Этот хэш очень длинный, его трудно читать, а также он не связан со средой сборки.
- Идентификатор сборки. Это самый удобный подход, потому что идентификатор его можно сопоставлять с определенной сборкой, чтобы находить артефакты и журналы. Но его трудно читать, как и хэш манифеста. Если у вашей организации несколько систем сборки, вы можете указывать префикс для тега с ее названием: — . Так вы сможете отличать сборки системы Jenkins команды API от сборок Azure Pipelines.
Теги для блокировки развернутых образов
Рекомендуется блокировать теги развернутых образов, установив для их атрибута write-enabled значение false . Так вы не сможете случайно удалить образ из реестра и создать проблемы с развертываниями. Процесс блокировки можно включить в конвейер выпуска.
Если вы заблокируете развернутый образ, то все равно сможете удалять неразвернутые образы из реестра с помощью Реестра контейнеров Azure. Для этого включите автоматическую очистку манифестов без тегов или незаблокированных образов, которые хранятся больше указанного срока, или установите для них политику хранения.
Дальнейшие действия
Чтобы максимально повысить производительность и снизить расходы на Реестр контейнеров Azure, изучите статью Рекомендации по работе с Реестром контейнеров Azure.
docker tag
A full image name has the following format and components:
- HOST : The optional registry hostname specifies where the image is located. The hostname must comply with standard DNS rules, but may not contain underscores. If the hostname is not specified, the command uses Docker’s public registry at registry-1.docker.io by default. Note that docker.io is the canonical reference for Docker’s public registry.
- PORT_NUMBER : If a hostname is present, it may optionally be followed by a registry port number in the format :8080 .
- PATH : The path consists of slash-separated components. Each component may contain lowercase letters, digits and separators. A separator is defined as a period, one or two underscores, or one or more hyphens. A component may not start or end with a separator. While the OCI Distribution Specification open_in_new supports more than two slash-separated components, most registries only support two slash-separated components. For Docker’s public registry, the path format is as follows:
- [NAMESPACE/]REPOSITORY : The first, optional component is typically a user’s or an organization’s namespace. The second, mandatory component is the repository name. When the namespace is not present, Docker uses library as the default namespace.
After the image name, the optional TAG is a custom, human-readable manifest identifier that is typically a specific version or variant of an image. The tag must be valid ASCII and can contain lowercase and uppercase letters, digits, underscores, periods, and hyphens. It cannot start with a period or hyphen and must be no longer than 128 characters. If the tag is not specified, the command uses latest by default.
You can group your images together using names and tags, and then push them to a registry.
Examples
Tag an image referenced by ID
To tag a local image with ID «0e5574283393» as «fedora/httpd» with the tag «version1.0»:
content_copy
Tag an image referenced by Name
To tag a local image «httpd» as «fedora/httpd» with the tag «version1.0»:
content_copy
Note that since the tag name is not specified, the alias is created for an existing local version httpd:latest .
Tag an image referenced by Name and Tag
To tag a local image with the name «httpd» and the tag «test» as «fedora/httpd» with the tag «version1.0.test»:
content_copy
Tag an image for a private registry
To push an image to a private registry and not the public Docker registry you must include the registry hostname and port (if needed).
Работа с образами — Docker: Основы
Docker — больше, чем просто программа. Это целая экосистема со множеством проектов и сервисов.
В работе с Docker часто приходится иметь дело с Registry. Это хранилище образов, которое работает как репозиторий пакетов любого пакетного менеджера. Именно здесь хранятся образы, которые Docker скачивает во время выполнения команды docker run . Посмотреть список образов хранилища можно на сайте https://hub.docker.com/ .
docker images
Список образов, скачанных на компьютер, можно посмотреть командой docker images :
# В вашем случае вывод будет отличаться docker images REPOSITORY TAG IMAGE ID CREATED SIZE workshopdevops*web latest cfd7771b4b3a 2 days ago 817MB hexletbasics*app latest 8e34a5f631ea 2 days ago 1.3GB mokevnin/rails latest 96487c602a9b 2 days ago 743MB ubuntu latest 2a4cca5ac898 3 days ago 111MB ruby 2.4 713da53688a6 3 weeks ago 687MB ruby 2.5 4c7885e3f2bb 3 weeks ago 881MB nginx latest 3f8a4339aadd 3 weeks ago 108MB elixir latest 93617745963c 4 weeks ago 889MB postgres latest ec61d13c8566 5 weeks ago 287MBВторая колонка в выводе выше называется TAG. Когда мы выполняли команду docker run nginx , то на самом деле выполнялась команда docker run nginx:latest . То есть мы не просто скачиваем образ nginx, а скачиваем его конкретный тег. latest — тег по умолчанию. По задумке он обозначает последнюю версию образа.
Такая работа с тегами не является строгим правилом. Конкретный образ вообще может не иметь тега latest, либо иметь, но он не будет содержать последние изменения, просто потому, что никто их не публикует. Впрочем, популярные образы следуют соглашению.
Теги в Docker изменяемы. Другими словами, создатель образа может перезаписать образ, связанный с любым тегом. Такой подход может показаться странным и ненадежным, ведь нет гарантий. К счастью, на практике, есть определенные соглашения, которым стараются следовать все популярные образы. Тег latest действительно содержит последнюю версию и постоянно обновляется, но кроме этого тега активно используется семантическое версионирование . Рассмотрим теги https://hub.docker.com/_/nginx
Теги с полной семантической версией (x.x.x) делают неизменяемыми, даже если в них встречается что-то еще — например, 1.12.2-alpine. Такую версию смело можно брать для продакшен-окружения, так как создатели образа гарантируют, что они будут следовать общим правилам. Теги, подобные такому 1.12, обновляются при изменении patch версии. То есть внутри образа может оказаться и версия 1.12.2 и в будущем 1.12.8. Точно такая же схема и с версиями, в которых указана только мажорная версия, например, 1. Только в данном случае обновление идет не только по патчу, но и по минорной версии.
docker pull
Как влияют теги на работу команды docker run во время скачивания образа? docker run скачивает образ если его нет, но эта проверка не связана с обновлением содержимого. Если nginx:latest обновился, то docker run его не будет скачивать, он использует тот latest, который прямо сейчас уже загружен. Для гарантированного обновления образа существует другая команда: docker pull . Вот она всегда проверяет, обновился ли образ для определенного тега.
# Пытается скачать обновления в образе # даже если он присутствует в локальной системе docker pull nginxКроме тегов имя образа может содержать префикс, например, etsy/chef . Этот префикс является именем аккаунта на сайте, через который создаются образы, попадающие в Registry. Большинство образов как раз такие, с префиксом. И есть небольшой набор, буквально сотня образов, которые не имеют префикса. Их особенность в том, что эти образы поддерживает сам Docker. Поэтому если вы видите, что в имени образа нет префикса, значит это официальный образ. Список таких образов можно увидеть здесь .
docker rmi
Удаляются образы командой docker rmi .
Удаление иногда бывает нужно, когда заканчивается место. Образы могут быть тяжелыми и в случае ограниченных ресурсов их регулярно удаляют.
Если в Docker присутствует хоть один контейнер из удаляемого образа, то Docker не даст его удалить, так как это автоматически бы привело к исчезновению всех контейнеров, что может быть нежелательным поведением. Если вы все же хотите удалить и образ, и все контейнеры, связанные с ним, используйте флаг -f .
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях: