В Docker, в чем разница между изображением и репозиторием?
Я новичок в Docker и следую Учебник по началу работы. На шаге 7 говорится:
введите docker images
и нажмите RETURN. Команда отображает все изображения в вашей локальной системе. Вы должны увидеть docker/whalesay
в списке.
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker/whalesay latest fb434121fc77 3 hours ago 247 MB
hello-world latest 91c95931e552 5 weeks ago 910 B
но в первом столбце четко сказано "репозиторий", а не, например, "имя изображения". Я также заметил на компьютерах других людей, что, поскольку изображение может иметь несколько тегов, это перечисление часто содержит повторяющиеся записи - по одному для каждого тега. Итак, это список изображений, список репозиториев, список комбинаций тегов изображений или что-то еще? В чем разница между изображением и репозиторием?
Кроме того, учитывая, что изображения и репозитории - это разные вещи, как я могу просто перечислить свои репозитории?
Это не связано с контейнерами.
Ответы
Ответ 1
Цитата из официальной документации Docker:
Репозиторий потенциально содержит несколько вариантов изображения.
(см.: https://docs.docker.com/userguide/dockerimages)
Это означает: Изображение Docker может принадлежать репозиторию, например. когда он был перенесен в реестр Docker (с docker push my/reporitory:version1
). С другой стороны, репозиторий содержит несколько версий изображения (= разные теги). Поэтому, когда вы создаете новую версию своего изображения, вы можете дать ей тег (docker tag 518a41981a6a my/reporitory:version2
) и вставить его в свой репозиторий в качестве следующей версии (docker push my/reporitory:version2
).
Вот пример из документации Docker (см. ссылку выше). Как вы можете видеть, в нем показан один репозиторий под названием ouruser/sinatra
, который содержит различные версии (latest
, devel
, v2
) одного и того же изображения:
$ docker images ouruser/sinatra
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 MB
ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB
ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB
В вашем примере у вас есть два репозитория (docker/whalesay
и hello-world
), который содержит только одно помеченное изображение (называемое latest
, что означает, что на самом деле нет тега и отображаются последние изображения).
Ответ 2
Да, это очень запутанная терминология.
Самый простой ответ:
Изображение: одно изображение.
Репозиторий: коллекция изображений.
Детали:
Изображение: однозначно ссылается на Image ID
, шестнадцатеричный код из 12 цифр (например, 91c95931e552). [1]
Репозиторий: содержит одно или несколько изображений. Таким образом, репозиторий hello-world
может содержать два разных изображения: 91c95931e552
и 1234abcd5678
.
Image alias
- Я собираюсь определить Image alias
как псевдоним, который ссылается на конкретное изображение. Формат Image alias
равен repository:tag
. Таким образом, вы можете использовать дружественный для человека псевдоним, такой как hello-world:latest
вместо 12-значного кода.
Пример:
Скажем, у меня есть эти изображения:
REPOSITORY TAG IMAGE ID
docker/whalesay latest fb434121fc77
hello-world latest 91c95931e552
hello-world v1.1 91c95931e552
hello-world v1.0 1234abcd5678
Репозитории: docker/whalesay
, hello-world
.
Изображения fb434121fc77
, 91c95931e552
, 1234abcd5678
. Обратите внимание, что 2-я и 3-я строки имеют одинаковый Image ID
, поэтому они являются одним и тем же изображением.
Алиасы изображений:
docker/whalesay:latest
hello-world:latest
hello-world:v1.1
hello-world:v1.0
Итак, hello-world:latest
и hello-world:v1.1
- это просто две псевдонимы для одного и того же изображения.
Дополнительная информация:
-
Формат
-
Repository name
также может содержать необязательный пользователь или пространство имен, что полезно при использовании публичного реестра, такого как Docker Hub. Например. docker/whalesay
. В противном случае у вас будет много конфликтов имен репозитория.
-
Если вы не укажете tag
при обращении к псевдониму изображения, он автоматически добавит :latest
. Поэтому, когда вы укажете hello-world
, он будет интерпретироваться как hello-world:latest
. Предупреждение: latest
на самом деле не означает ничего особенного, это просто тег по умолчанию.
-
[1] Фактически, полный идентификатор изображения представляет собой 64-разрядный шестнадцатеричный код, усеченный до 12 цифр, но вам не нужно об этом заботиться.
Ответ 3
Изображения построены путем запуска docker build
с заданным Dockerfile
и идентифицируются их идентификатором.
Репозитории и теги - это просто средства для обозначения и организации ваших изображений в значащих иерархиях/архитектурах.
Следующее из этого SO-ответа дает подробное объяснение вывода docker images
(это, вероятно, то, что они должны были поместить в документы):
- Идентификатор IMAGE - это первые 12 символов истинного идентификатора для изображения. Вы можете создать много тегов данного изображения, но их идентификаторы будут все будет одинаковым (как указано выше).
- VIRTUAL SIZE является виртуальным, потому что он объединяет размеры всех отдельных слоев. Это означает, что сумма всех значения в этом столбце, вероятно, намного больше, чем используемое дисковое пространство всеми этими изображениями.
- Значение в столбце REPOSITORY происходит от флага
-t
команды docker build
или от docker tag
-весьте существующее изображение. Вы можете пометить изображения, используя номенклатуру, которая имеет смысл вы, но знаете, что докер будет использовать тег в качестве места реестра в docker push
или docker pull
. - Полная форма тега
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Для ubuntu
выше, REGISTRYHOST определяется как registry.hub.docker.com
. Поэтому, если вы планируете хранить свое изображение под названием my-application
в реестре в docker.example.com
, вы должны пометить это изображение docker.example.com/my-application
. - Столбец TAG - это только часть [: TAG] полного тега. Это печальная терминология.