De mi artículo sobre Automatización de implementaciones de Docker :
Imágenes Docker vs. Contenedores
En Dockerland, hay imágenes y hay contenedores . Los dos están estrechamente relacionados, pero son distintos. Para mí, comprender esta dicotomía ha aclarado inmensamente a Docker.
¿Qué es una imagen?
Una imagen es un archivo inerte, inmutable, que es esencialmente una instantánea de un contenedor. Las imágenes se crean con el comando de compilación y producirán un contenedor cuando se inicie con la ejecución . Las imágenes se almacenan en un registro de Docker como el registro.hub.docker.com . Debido a que pueden llegar a ser bastante grandes, las imágenes están diseñadas para estar compuestas de capas de otras imágenes, lo que permite enviar una cantidad mínima de datos al transferir imágenes a través de la red.
Las imágenes locales se pueden enumerar ejecutando docker images
:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Algunas cosas a tener en cuenta:
- ID DE IMAGEN son los primeros 12 caracteres del identificador verdadero para una imagen. Puede crear muchas etiquetas de una imagen determinada, pero sus ID serán todas iguales (como se indicó anteriormente).
- TAMAÑO VIRTUAL es virtual porque suma los tamaños de todas las capas subyacentes distintas. Esto significa que la suma de todos los valores en esa columna es probablemente mucho mayor que el espacio en disco utilizado por todas esas imágenes.
- El valor en la columna REPOSITORIO proviene del
-t
indicador del docker build
comando o de docker tag
una imagen existente. Puede etiquetar imágenes usando una nomenclatura que tenga sentido para usted, pero sepa que Docker usará la etiqueta como ubicación de registro en un docker push
o docker pull
.
- La forma completa de una etiqueta es
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Por ubuntu
arriba, REGISTRYHOST se infiere que ser registry.hub.docker.com
. Entonces, si planea almacenar su imagen llamada my-application
en un registro en docker.example.com
, debe etiquetar esa imagen docker.example.com/my-application
.
- La columna TAG es solo la parte [: TAG] de la etiqueta completa . Esta es una terminología desafortunada.
- La
latest
etiqueta no es mágica, es simplemente la etiqueta predeterminada cuando no especifica una etiqueta.
- Puede tener imágenes sin etiquetar solo identificables por sus ID de IMAGEN. Estos obtendrán la
<none>
etiqueta y el repositorio. Es fácil olvidarse de ellos.
Más información sobre las imágenes está disponible en la documentación y el glosario de Docker .
¿Qué es un contenedor?
Para usar una metáfora de programación, si una imagen es una clase, entonces un contenedor es una instancia de una clase, un objeto de tiempo de ejecución. Con suerte, los contenedores son por qué estás usando Docker; son encapsulaciones ligeras y portátiles de un entorno en el que ejecutar aplicaciones.
Ver contenedores locales en ejecución con docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
Aquí estoy ejecutando una versión dockerizada del registro de docker, para tener un lugar privado para almacenar mis imágenes. De nuevo, algunas cosas a tener en cuenta:
- Al igual que la ID DE IMAGEN, la ID DE CONTENEDOR es el verdadero identificador del contenedor. Tiene la misma forma, pero identifica un tipo diferente de objeto.
docker ps
solo salidas que ejecutan contenedores. Puede ver todos los contenedores (en ejecución o detenidos ) con docker ps -a
.
- NOMBRES se pueden usar para identificar un contenedor iniciado a través de la
--name
bandera.
Cómo evitar la acumulación de imágenes y contenedores
Una de mis primeras frustraciones con Docker fue la acumulación aparentemente constante de imágenes sin etiquetar y contenedores detenidos . En un puñado de ocasiones, esta acumulación dio como resultado que los discos duros al máximo desaceleren mi computadora portátil o detengan mi tubería de compilación automatizada. ¡Habla sobre "contenedores en todas partes"!
Podemos eliminar todas las imágenes sin etiquetar combinando docker rmi
con la dangling=true
consulta reciente :
docker images -q --filter "dangling=true" | xargs docker rmi
Docker no podrá eliminar imágenes que están detrás de los contenedores existentes, por lo que es posible que docker rm
primero deba eliminar los contenedores detenidos con :
docker rm `docker ps --no-trunc -aq`
Estos son puntos débiles conocidos con Docker y pueden abordarse en futuras versiones. Sin embargo, con una comprensión clara de las imágenes y los contenedores, estas situaciones se pueden evitar con un par de prácticas:
- Siempre retire un recipiente inútil y detenido con
docker rm [CONTAINER_ID]
.
- Siempre quite la imagen detrás de un contenedor inútil y detenido con
docker rmi [IMAGE_ID]
.