¿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?

Solución

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 con docker ps (y puedes ver todos los contenedores con docker ps -a).

Así que una instancia en ejecución de una imagen es un contenedor.

Comentarios (14)

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:

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
                                  4ab0d9120985        3 months ago        486.5 MB

Algunas cosas a tener en cuenta:__

  1. El ID de la imagen son los primeros 12 caracteres del identificador real de una imagen. Puedes crear muchas etiquetas de una imagen determinada, pero sus IDs serán todos iguales (como en el caso anterior).
  2. El TAMAÑO VIRTUAL es virtual porque suma los tamaños de todas las capas subyacentes. Esto significa que la suma de todos los valores de esa columna es probablemente mucho mayor que el espacio de disco utilizado por todas esas imágenes.
  3. El valor de la columna REPOSITORIO proviene de la bandera t del comando docker build, o de la etiqueta docker 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 un docker push o docker pull.
  4. La forma completa de una etiqueta es [REGISTRYHOST/][USERNAME/]NAME[:TAG]. En el caso de ubuntu, se deduce que REGISTRYHOST es registry.hub.docker.com. Así que si planeas almacenar tu imagen llamada mi-aplicación en un registro en docker.ejemplo.com, deberías etiquetar esa imagen docker.ejemplo.com/mi-aplicación.
  5. La columna TAG es sólo la parte [:TAG] de la etiqueta full. Esta es una terminología desafortunada.
  6. La etiqueta latest no es mágica, es simplemente la etiqueta por defecto cuando no se especifica una etiqueta.
    1. Puede tener imágenes no etiquetadas que sólo sean identificables por su ID de IMAGEN. Estas obtendrán la etiqueta `y el REPOSITORIO. Es fácil olvidarse de ellas.

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:

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 docker, de modo que tengo un lugar privado para almacenar mis imágenes. De nuevo, algunas cosas a tener en cuenta:

  1. Al igual que el ID de IMAGEN, el ID de CONTENEDOR es el verdadero identificador del contenedor. Tiene la misma forma, pero identifica un tipo de objeto diferente.
  2. El programa docker ps sólo muestra los contenedores en ejecución. Puedes ver todos los contenedores (en ejecución o parados) con docker ps -a.
  3. NAMES se puede utilizar para identificar un contenedor iniciado a través de la bandera --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 consulta dangling=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:

docker rm `docker ps --no-trunc -aq`

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:

  1. Elimine siempre un contenedor inútil y detenido con docker rm [CONTAINER_ID].
    1. Elimine siempre la imagen detrás de un contenedor inútil y parado con docker rmi [IMAGE_ID].
Comentarios (11)

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.

Comentarios (5)