library - download docker image
En Docker, ¿cuál es la diferencia entre una imagen y un repositorio? (4)
Soy nuevo en Docker y sigo el tutorial de introducción . En el paso 7 dice
escriba el comando
docker images
y presione RETURN. El comando enumera todas las imágenes en su sistema local. Debería verdocker/whalesay
en la lista.
$ 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
pero la primera columna dice claramente "repositorio", no por ejemplo, "nombre de imagen". También he notado en las máquinas de otras personas que, como una imagen puede tener varias etiquetas, esta lista a menudo contiene entradas duplicadas, una para cada etiqueta. Entonces, ¿es esta una lista de imágenes, una lista de repositorios, una lista de combinaciones de etiquetas de imagen o algo más? ¿Cuál es la diferencia entre una imagen y un repositorio?
Además, dado que las imágenes y los repositorios son cosas diferentes, ¿cómo puedo simplemente listar mis repositorios?
Esto no tiene nada que ver con los contenedores.
Aquí es más fácil definir varios términos porque todos se interrelacionan:
Imagen : se trata de las capas y metadatos del sistema de archivos que se utilizan para empaquetar una aplicación de manera que se puedan ejecutar contenedores. Cada imagen debe tener una identificación en el motor de una ventana acoplable.
Referencia : Este es un puntero a una imagen. Existen diferentes tipos de referencias, ya sea solo la identificación de la imagen, generalmente es un repositorio y una etiqueta, y algunas veces se asignará a una suma de comprobación específica utilizando un hash sha256 en lugar de una etiqueta modificable. La parte importante es que puede tener varios punteros a la misma imagen, y que no es necesario tener referencias a una imagen que no sea la ID de la imagen. Cuando eliminas una referencia, la ventana acoplable simplemente eliminará ese puntero a menos que sea el último puntero a esa ID de imagen.
Registro : Este es un servidor que contiene imágenes. De manera similar a como un servidor Git contiene el código fuente, o un servidor de artefactos para binarios, un registro es donde se insertan y extraen imágenes.
Repositorio : el camino a un directorio de imágenes en un servidor de registro es el repositorio. Esto incluye el nombre de host y el puerto del registro si no está utilizando el registro predeterminado de Docker Hub. En una referencia de imagen, este repositorio es la parte anterior a los dos puntos y la etiqueta finales.
Etiqueta : Una imagen específica dentro de un repositorio. Si no especifica una etiqueta, la ventana acoplable usará por defecto el nombre de la etiqueta "más reciente". Esta es la parte después de los dos puntos finales, y se usa a menudo para un número de versión.
Para tomar una referencia de ejemplo:
registry-server:5000/team/service-a:build-42
"registry-server: 5000" es el nombre del servidor de registro (y el puerto) donde debe empujar / tirar esta imagen.
"Registry-Server: 5000 / team / service-a" es el repositorio.
"build-42" es la etiqueta.
"registry-server: 5000 / team / service-a: build-42" es una referencia.
A diferencia de otros sistemas en los que usted empuja y jala a un servidor y luego especifica qué archivos enviar allí, al empujar y jalar imágenes de la ventana acoplable hacia y desde un servidor de registro define el destino y la fuente de la imagen usando una referencia que incluye el repositorio y la etiqueta. nombre. Entonces, para empujar las imágenes a una ubicación diferente, crea una nueva referencia (usando el comando de docker tag
) a la misma imagen con el nuevo repositorio y etiqueta, y luego ejecuta su comando push contra esa referencia.
Normalmente, cuando alguien se refiere a un "nombre de imagen" se refiere a un nombre de repositorio (si desea especificar una etiqueta por separado) o una referencia completa que puede usar para extraer o empujar una imagen.
¿Cómo puedo simplemente listar mis repositorios?
docker image ls --format ''{{.Repository}}'' | sort -u
Incluí la sort -u
para desduplicar la salida, ya que puedes tener varias imágenes con el mismo repositorio y diferentes etiquetas.
Citado de la documentación oficial de Docker:
Un repositorio tiene potencialmente múltiples variantes de una imagen.
(consulte: https://docs.docker.com/userguide/dockerimages )
Esto significa que: una imagen de Docker puede pertenecer a un repositorio, por ejemplo, cuando se envió a un registro de Docker (con la función docker push my/reporitory:version1
). Por otro lado, un repositorio contiene varias versiones de una imagen (= etiquetas diferentes). Así que cuando construyes una nueva versión de tu imagen, puedes asignarle una etiqueta (etiqueta docker tag 518a41981a6a my/reporitory:version2
) y docker tag 518a41981a6a my/reporitory:version2
a tu repositorio como la próxima versión ( docker push my/reporitory:version2
).
Aquí hay un ejemplo de la documentación de Docker (vea el enlace de arriba). Como puede ver, muestra un repositorio llamado ouruser/sinatra
que contiene varias versiones ( latest
, devel
, v2
) de la misma imagen:
$ 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
En su ejemplo, tiene dos repositorios ( docker/whalesay
y hello-world
) que solo contienen una imagen etiquetada (llamada latest
, lo que significa que en realidad no hay una etiqueta y se muestran las últimas imágenes).
Sí, esta es una terminología muy confusa.
La respuesta más simple:
Imagen: una sola imagen.
Repositorio: una colección de imágenes.
Detalles:
Imagen: referenciada únicamente por la Image ID
, el código hexadecimal de 12 dígitos (p. Ej., 91c95931e552). [1]
Repositorio: Contiene una o más imágenes. Así que el repositorio de hello-world
podría contener dos imágenes diferentes: 91c95931e552
y 1234abcd5678
.
Image alias
: voy a definir image alias
para indicar un alias que hace referencia a una imagen específica. El formato de un image alias
es repository:tag
. De esta manera, puedes usar un alias amigable para las personas, como hello-world:latest
lugar del código de 12 dígitos.
Ejemplo:
Digamos que tengo estas imágenes:
REPOSITORY TAG IMAGE ID
docker/whalesay latest fb434121fc77
hello-world latest 91c95931e552
hello-world v1.1 91c95931e552
hello-world v1.0 1234abcd5678
Los repositorios son: docker/whalesay
, hello-world
.
Las imágenes son fb434121fc77
, 91c95931e552
, 1234abcd5678
. Observe que las filas 2 y 3 tienen la misma Image ID
, por lo que son la misma imagen.
Los alias de las imágenes son:
docker/whalesay:latest
hello-world:latest
hello-world:v1.1
hello-world:v1.0
Así que hello-world:latest
y hello-world:v1.1
son simplemente dos alias para la misma imagen.
Detalles adicionales:
Repository name
formato delRepository name
también puede añadir un usuario opcional o espacio de nombres, lo que es útil cuando se utiliza un registro público como Docker Hub. Por ejemplo,docker/whalesay
. De lo contrario, tendrá muchos conflictos de nombre de repositorio.Si omite la
tag
al hacer referencia a un alias de imagen, se agregará automáticamente:latest
. Entonces, cuando especifiquehello-world
, se interpretará comohello-world:latest
. Advertencia: lalatest
no significa nada especial, es solo una etiqueta predeterminada.[1] En realidad, la ID de imagen completa es un código hexadecimal de 64 dígitos truncado a 12 dígitos, pero no es necesario que te importe eso.
Las imágenes se crean ejecutando la docker build
Dockerfile
docker build
con un Dockerfile
determinado y se identifican por su ID.
Los repositorios y las etiquetas son solo un medio para nombrar y organizar sus imágenes en jerarquías / arquitecturas significativas.
Un repositorio normalmente contiene múltiples imágenes relacionadas
Una imagen puede ir en múltiples repositorios.
Lo siguiente, de esta respuesta SO , brinda una explicación detallada de la salida de las docker images
de la docker images
(esto es probablemente lo que deberían haber incluido en los documentos):
ID DE IMAGEN son los primeros 12 caracteres del verdadero identificador para una imagen. Puede crear muchas etiquetas de una imagen determinada, pero sus ID serán todas iguales (como se mencionó anteriormente).
El valor en la columna REPOSITORIO proviene de la
docker tag
-t
del comando dedocker build
de ladocker build
, o de ladocker tag
ventanadocker tag
la imagen existente. Usted es libre de etiquetar imágenes usando una nomenclatura que tenga sentido para usted, pero sabe que la ventana acoplable utilizará la etiqueta como la ubicación de registro en undocker push
odocker pull
.- La forma completa de una etiqueta es
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Paraubuntu
arriba, se infiere que REGISTRYHOST esregistry.hub.docker.com
. Entonces, si planea almacenar su imagen llamadamy-application
en un registro endocker.example.com
, debe etiquetar esa imagendocker.example.com/my-application
.- La columna TAG es solo la parte [: TAG] de la etiqueta completa . Esta es una terminología desafortunada.