Начнём сначала с наименования образа. По умолчанию наименование 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
Но в выводе выше нет никакого имени репозитория или пользователя.
- Дело в том что по умолчанию всё что скачано с Docker hub (
nginx:alpine) или создано локально (cache2:1.0,cache1:1.0) не имеет названия репозитория в имени образа. - Также если образ скачан с 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 - логическое имя образа
Тэги
Теперь, когда понятно каким образом строится наименование образа, перейдём к тэгам. Тэг добавляется к наименованию контейнера, зачастую просто указывает версию образа. Например, человек создаёт образ nginx. На следующий день он добавляет супер функцию, которая нужна не всем пользователям. Отсюда встаёт вопрос как справится с этой ситуацией ведь если он загрузит образ с тем же именем он также обновится у всех пользователей при следующей загрузке образа.
Чтобы таких ситуаций не было как раз и используются тэги. С тэгами эта ситуация решается довольно просто человек создаёт образ nginx:1.0 и на следующий день загружает новый образ, допустим с тэгом 1.1 (nginx:1.1).
Дело в том, что при создании образа без тэга он всё равно добавляется, по умолчанию это тэг latest, который кстати не всегда говорит, что будет скачан самый свежий образ. Всё зависит от того, кто выкладывает образ и как, например, создатель образа может выложить конкретную версию и не добавить новый функционал в latest. Но как правило это касается только неофициальных образов.
docker build -t mybuild .
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mybuild latest b3a05bfe8f14 4 seconds ago 124MB
Для того чтобы задать тэг для образа можно использовать 2 варианта:
- При создании самого образа, используя флаг
-tdocker build -t mybuild:1.0 . - Используя
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 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.


Комментарии