Diferencia entre imágenes y contenedores de Docker

1. Información general

Docker es una herramienta para crear, implementar y ejecutar aplicaciones fácilmente. Nos permite empaquetar nuestras aplicaciones con todas las dependencias y distribuirlas como paquetes individuales. Docker garantiza que nuestra aplicación se ejecutará de la misma manera en todas las instancias de Docker.

Cuando comenzamos a usar Docker, hay dos conceptos principales en los que debemos ser claros: imágenes y contenedores .

En este tutorial, aprenderemos qué son y en qué se diferencian.

2. Imágenes de Docker

Una imagen es un archivo que representa una aplicación empaquetada con todas las dependencias necesarias para ejecutarse correctamente. En otras palabras, podríamos decir que una imagen de Docker es como una clase Java .

Las imágenes se crean como una serie de capas . Las capas se ensamblan una encima de la otra. Entonces, ¿qué es una capa? En pocas palabras, una capa es una imagen.

Digamos que queremos crear una imagen de Docker de una aplicación Java de Hello World. Lo primero en lo que debemos pensar es en qué necesita nuestra aplicación.

Para empezar, es una aplicación Java, por lo que necesitaremos una JVM. Bien, esto parece fácil, pero ¿qué necesita una JVM para ejecutarse? Necesita un sistema operativo. Por lo tanto, nuestra imagen de Docker tendrá una capa de sistema operativo, una JVM y nuestra aplicación Hello World .

Una de las principales ventajas de Docker es su gran comunidad. Si queremos construir sobre una imagen, podemos ir a Docker Hub y buscar si la imagen que necesitamos está disponible.

Digamos que queremos crear una base de datos, usando la base de datos PostgreSQL. No necesitamos crear una nueva imagen de PostgreSQL desde cero. Simplemente vamos a Docker Hub, buscamos postgres , que es el nombre de imagen oficial de Docker para PostgresSQL, elegimos la versión que necesitamos y la ejecutamos.

Cada imagen que creamos o extraemos de Docker Hub se almacena en nuestro sistema de archivos y se identifica por su nombre y etiqueta. También se puede identificar por su ID de imagen .

Usando el comando docker images , podemos ver una lista de imágenes que tenemos disponibles en nuestro sistema de archivos:

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE postgres 11.6 d3d96b1e5d48 4 weeks ago 332MB mongo latest 9979235fc504 6 weeks ago 364MB rabbitmq 3-management 44c4867e4a8b 8 weeks ago 180MB mysql 8.0.18 d435eee2caa5 2 months ago 456MB jboss/wildfly 18.0.1.Final bfc71fe5d7d1 2 months ago 757MB flyway/flyway 6.0.8 0c11020ffd69 3 months ago 247MB java 8-jre e44d62cf8862 3 years ago 311MB

3. Ejecución de imágenes de Docker

Se ejecuta una imagen mediante el comando docker run con el nombre y la etiqueta de la imagen. Digamos que queremos ejecutar la imagen de postgres 11.6:

docker run -d postgres:11.6

Observe que proporcionamos la opción -d . Esto le dice a Docker que ejecute la imagen en segundo plano, también conocido como modo separado.

Usando el comando docker ps podemos verificar si nuestra imagen se está ejecutando, debemos usar este comando:

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3376143f0991 postgres:11.6 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 5432/tcp tender_heyrovsky

Observe el ID DEL CONTENEDOR en el resultado anterior. Echemos un vistazo a qué es un contenedor y cómo se relaciona con una imagen.

4. Contenedores Docker

Un contenedor es una instancia de una imagen. Cada contenedor puede identificarse por su ID. Volviendo a nuestra analogía de desarrollo de Java, podríamos decir que un contenedor es como una instancia de una clase .

Docker define siete estados para un contenedor: creado , reiniciando , en ejecución , eliminando , en pausa , salido y muerto . Es importante saberlo. Dado que un contenedor es solo una instancia de la imagen, no es necesario que se esté ejecutando.

Ahora pensemos de nuevo en el comando de ejecución que hemos visto anteriormente. Hemos dicho que se usa para ejecutar imágenes, pero eso no es del todo exacto. La verdad es que el comando de ejecución se usa para crear e iniciar un nuevo contenedor de la imagen.

Una gran ventaja es que los contenedores son como máquinas virtuales ligeras. Sus comportamientos están completamente aislados entre sí. Esto significa que podemos ejecutar varios contenedores de la misma imagen, teniendo cada uno en un estado diferente con diferentes datos y diferentes ID.

Poder ejecutar múltiples contenedores de la misma imagen al mismo tiempo es una gran ventaja porque nos permite una forma fácil de escalar aplicaciones. Por ejemplo, pensemos en los microservicios. Si cada servicio está empaquetado como una imagen de Docker, eso significa que los nuevos servicios se pueden implementar como contenedores a pedido.

5. Ciclo de vida de los contenedores

Anteriormente mencionamos los siete estados de un contenedor, ahora, vamos a ver cómo podemos utilizar la ventana acoplable herramienta de línea de comandos para procesar los diferentes estados del ciclo de vida.

Iniciar un nuevo contenedor requiere que lo creemos y luego lo iniciemos . Esto significa que tiene que pasar por el estado de creación antes de que pueda ejecutarse. Podemos hacer esto creando e iniciando el contenedor explícitamente:

docker container create : docker container start 

O podemos hacer esto fácilmente con el comando de ejecución :

docker run :

Podemos pausar un contenedor en ejecución y luego ponerlo en estado de ejecución nuevamente:

docker pause  docker unpause 

Un contenedor en pausa mostrará "En pausa" como el estado cuando verifiquemos los procesos:

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9bef2edcad7b postgres:11.6 "docker-entrypoint.s…" 5 minutes ago Up 4 minutes (Paused) 5432/tcp tender_heyrovsky

También podemos detener un contenedor en ejecución y luego volver a ejecutarlo:

docker stop  docker start 

Y finalmente, podemos eliminar un contenedor:

docker container rm 

Solo se pueden eliminar los contenedores en el estado detenido o creado.

Para obtener más información sobre los comandos de Docker, podemos consultar la Referencia de la línea de comandos de Docker.

6. Conclusión

En este artículo, analizamos las imágenes y los contenedores de Docker y cómo se diferencian. Las imágenes describen las aplicaciones y cómo se pueden ejecutar. Los contenedores son instancias de imágenes, donde se pueden ejecutar varios contenedores de la misma imagen, cada uno en un estado diferente.

También hablamos sobre el ciclo de vida de los contenedores y aprendimos los comandos básicos para administrarlos.

Ahora que conocemos los conceptos básicos, es hora de aprender más sobre el apasionante mundo de Docker y de comenzar a aumentar nuestros conocimientos.