Начнём сначала с наименования образа. По умолчанию наименование Docker образа имеет формат [REGISTRY_HOST[:PORT]/][NAMESPACE/]REPOSITORY[:TAG].

docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
cache2       1.0       df2d5fb50b42   19 hours ago   141MB
cache1       1.0       ee7e1bf4cdcd   19 hours ago   141MB
nginx        alpine    d4918ca78576   36 hours ago   52.8MB

Но в выводе выше нет никакого имени репозитория или пользователя.

  1. Дело в том что по умолчанию всё что скачано с Docker hub (nginx:alpine) или создано локально (cache2:1.0, cache1:1.0) не имеет названия репозитория в имени образа.
  2. Также если образ скачан с Docker hub и при этом это официальный образ имени пользователя также не будет в наименовании (nginx:alpine)

Для примера я скачаю другой неофициальный образ okteto/nginx:alpine с Docker hub и при просмотре образа увижу в наименовании и имя пользователя (okteto), который загрузил этот образ на Docker hub.

docker pull okteto/nginx:alpine
docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
okteto/nginx   alpine    db009330a860   6 years ago    17.8MB

Если же образ скачивается с приватного репозитория то к логическому имени образа также ещё добавляется этот репозиторий.

docker pull mcr.microsoft.com/mcr/hello-world:latest
docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mcr.microsoft.com/mcr/hello-world   latest    fce289e99eb9   6 years ago    1.84kB
  • mcr.microsoft.com - REGISTRY_HOST, т.е. URL репозитория (порт 443 опускается)
  • mcr - пространство пользователя или организации
  • hello-world - логическое имя образа

ФОРМАТ НАИМЕНОВАНИЯ DOCKER ОБРАЗОВ

Тэги

Теперь, когда понятно каким образом строится наименование образа, перейдём к тэгам. Тэг добавляется к наименованию контейнера, зачастую просто указывает версию образа. Например, человек создаёт образ nginx. На следующий день он добавляет супер функцию, которая нужна не всем пользователям. Отсюда встаёт вопрос как справится с этой ситуацией ведь если он загрузит образ с тем же именем он также обновится у всех пользователей при следующей загрузке образа.

Чтобы таких ситуаций не было как раз и используются тэги. С тэгами эта ситуация решается довольно просто человек создаёт образ nginx:1.0 и на следующий день загружает новый образ, допустим с тэгом 1.1 (nginx:1.1).

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

DOCKER TAGS: УПРАВЛЕНИЕ ВЕРСИЯМИ

docker build -t mybuild .
docker image ls
REPOSITORY                          TAG       IMAGE ID       CREATED         SIZE
mybuild                             latest    b3a05bfe8f14   4 seconds ago   124MB

Для того чтобы задать тэг для образа можно использовать 2 варианта:

  1. При создании самого образа, используя флаг -t
    docker build -t mybuild:1.0 .
    
  2. Используя docker tag для уже созданного образа
    docker tag mybuild:1.0 mybuild:2.0
    

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

НЕСКОЛЬКО ТЭГОВ = ОБЩИЕ СЛОИ

docker image ls
REPOSITORY                          TAG       IMAGE ID       CREATED         SIZE
mybuild                             1.0       b3a05bfe8f14   3 minutes ago   124MB
mybuild                             2.0       b3a05bfe8f14   3 minutes ago   124MB

В качестве тэга можно также использовать буквы не только цифры, например nginx:alpine. Т.е. скачивая образ nginx:alpine я всегда буду получать последний свежий образ nginx на alpine. Но если мне нужен конкретная версия nginx также на alpine я могу использовать тэг вида 1.29-alpine или 1.29.3-alpine3.22.

ВАРИАНТЫ DOCKER ТЭГОВ

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

docker pull nginx:latest
docker pull nginx:mainline
docker image ls
REPOSITORY                          TAG       IMAGE ID       CREATED         SIZE
nginx                               latest     9d0e6f6199dc   38 hours ago     152MB
nginx                               mainline   9d0e6f6199dc   38 hours ago     152MB

Т.е. оба образа nginx:latest и nginx:mainline идентичны и имеют один размер и дату обновления и также IMAGE ID.