¿Cuál es la diferencia entre una imagen Docker y un contenedor?
Al utilizar Docker, empezamos con una imagen base. La arrancamos, creamos cambios y esos cambios se guardan en capas formando otra imagen.
Así que eventualmente tengo una imagen para mi instancia de PostgreSQL y una imagen para mi aplicación web, cuyos cambios siguen siendo persistentes.
¿Qué es un contenedor?
802
3
Una instancia de una imagen se llama contenedor. Usted tiene una imagen, que es un conjunto de capas como usted describe. Si inicias esta imagen, tienes un contenedor en ejecución de esta imagen. Puedes tener muchos contenedores en ejecución de la misma imagen.
Puedes ver todas tus imágenes con
docker images
mientras que puedes ver tus contenedores en ejecución condocker ps
(y puedes ver todos los contenedores condocker ps -a
).Así que una instancia en ejecución de una imagen es un contenedor.
De mi artículo sobre Automatización de los despliegues 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 Docker inmensamente.
¿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 build, y producen un contenedor cuando se inician con run. Las imágenes se almacenan en un registro Docker como registry.hub.docker.com. Debido a que pueden llegar a ser bastante grandes, las imágenes están diseñadas para estar compuestas por capas de otras imágenes, lo que permite enviar una cantidad mínima de datos cuando se transfieren imágenes a través de la red.
Las imágenes locales pueden ser listadas ejecutando
docker images
:Algunas cosas a tener en cuenta:__
t
del comandodocker build
, o de la etiquetadocker
de una imagen existente. Eres libre de etiquetar las imágenes utilizando una nomenclatura que tenga sentido para ti, pero debes saber que docker utilizará la etiqueta como la ubicación del registro en undocker push
odocker pull
.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. En el caso deubuntu
, se deduce que REGISTRYHOST esregistry.hub.docker.com
. Así que si planeas almacenar tu imagen llamadami-aplicación
en un registro endocker.ejemplo.com
, deberías etiquetar esa imagendocker.ejemplo.com/mi-aplicación
.latest
no es mágica, es simplemente la etiqueta por defecto cuando no se especifica una etiqueta.Hay más información sobre las imágenes en la documentación de Docker y en el glosario.
¿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. Es de esperar que los contenedores sean la razón por la que usas Docker; son encapsulaciones ligeras y portátiles de un entorno en el que ejecutar aplicaciones.
Vea los contenedores locales en ejecución con
docker ps
:Aquí estoy ejecutando una versión dockerizada del registro docker, de modo que tengo un lugar privado para almacenar mis imágenes. De nuevo, algunas cosas a tener en cuenta:
docker ps
sólo muestra los contenedores en ejecución. Puedes ver todos los contenedores (en ejecución o parados) condocker ps -a
.--name
.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 no etiquetadas y contenedores detenidos. En un puñado de ocasiones esta acumulación resultó en discos duros al máximo ralentizando mi portátil o deteniendo mi canal de construcción automatizado. ¡Hablando de "contenedores por todas partes"!
Podemos eliminar todas las imágenes no etiquetadas combinando
docker rmi
con la reciente consultadangling=true
:docker images -q --filter "dangling=true" | xargs docker rmi
Docker no podrá eliminar las imágenes que están detrás de los contenedores existentes, por lo que es posible que tenga que eliminar los contenedores detenidos con
docker rm
primero:Estos son puntos de dolor conocidos con Docker y pueden ser abordados 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:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.Aunque lo más sencillo es pensar en un contenedor como una imagen en funcionamiento, esto no es exacto.
Una imagen es realmente una plantilla que puede convertirse en un contenedor. Para convertir una imagen en un contenedor, el motor Docker toma la imagen, añade un sistema de archivos de lectura-escritura en la parte superior e inicializa varios ajustes, incluyendo los puertos de red, el nombre del contenedor, el ID y los límites de recursos. Un contenedor en funcionamiento tiene un proceso en ejecución, pero un contenedor también puede ser detenido (o exited en la terminología de Docker). Un contenedor salido no es lo mismo que una imagen, ya que puede ser reiniciado y retendrá su configuración y cualquier cambio en el sistema de archivos.