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?
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.
De mi artículo sobre Automatización de los despliegues de Docker:
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.
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
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Algunas cosas a tener en cuenta:__
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
.[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
.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.
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:
docker ps
sólo muestra los contenedores en ejecución. Puedes ver todos los contenedores (en ejecución o parados) con docker ps -a
.--name
.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:
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.