Docker - Un poco más de docker run

Tutorial #3

En este tutorial vamos a explorar un poco más las opciones del comando docker run al momento de ejecutar un contenedor.

Los tags

Comencemos descargando una imagen de docker hub. En este ejercicio, vamos a descargar la imagen 'httpd', la cual contiene una instalación de Apache2.

Para obtener la imagen, ejecutemos el siguiente comando docker pull:

$ sudo docker pull httpd

Screenshot_1.png

Como podemos observar en la salida de la consola, tenemos una línea que nos indica:

Using default tag: latest

Los tags de Docker transmiten información útil sobre una versión de una imagen específica almacenada en el registry, en nuestro caso docker hub. Son alias de los ID de su imagen. En otras palabras, sirven para identificar las versiones de las imágenes, a la hora de listar las imágenes se listan con su tag asociado. En el ejemplo anterior, la versión de la imagen de httpd descargada es latest.

Hasta el momento no hemos especificado una etiqueta al descargar una imagen. Aquí es donde la etiqueta latest entra en escena. Cada vez que se etiqueta una imagen sin una etiqueta explícita, se descarga la imagen más reciente de forma predeterminada.

Si revisamos la documentación de la imagen httpd en docker hub podemos ver que tenemos 2 versiones de la imagen y que estas dos versiones la podemos referenciar con diferentes tags.

Screenshot_2.png

Para efectos prácticos, podemos descargar la versión latest sin especificar la etiqueta, o especificando latest, y las otras alternativas como lo son 2.4.52, 2.4, 2, 2.4.52-bullseye, 2.4-bullseye, 2-bullseye, bullseye.

Por lo tanto, todas las instrucciones listadas a continuación son iguales, descargan la misma versión de la imagen de httpd. Ejecute cualquiera de las presentadas.

sudo docker pull httpd
sudo docker pull httpd:latest
sudo docker pull httpd:2.4.52
sudo docker pull httpd:2.4
sudo docker pull httpd:2
sudo docker pull httpd:2.4.52-bullseye
sudo docker pull httpd:2.4-bullseye
sudo docker pull httpd:2-bullseye
sudo docker pull httpd:bullseye

Si usted lista las imágenes disponibles localmente, se dará cuenta de que no se descargaron nuevas imágenes porque todas corresponden a la versión descarga previamente. A pesar de que observamos varias imágenes, todas tienen el mismo ID.

Screenshot_4.png

Ahora, descarguemos la otra versión de la imagen, validemos que el ID de la imagen es diferente.

sudo docker pull httpd:2.4.52-alpine

Screenshot_5.png

Port mapping

Port mapping o el mapeo de puertos hace que los procesos en ejecución dentro de un contenedor estén disponibles y/o visibles desde el exterior. Al ejecutar un nuevo contenedor de docker, podemos asignar el mapeo de puertos en el comando docker run agregando la opción -p y especificando el puerto de la máquina host y el puerto del proceso en el contenedor docker.

Ejemplo:

sudo docker run -p 8080:80 --name=servidor-web httpd

En este caso el puerto 80 corresponde al puerto del servidor web apache2 que está en ejecución dentro del contenedor. El puerto 8080 corresponde al puerto en la máquina host que atenderá la petición y la mapeará desde el host al contenedor. Para probar la ejecución y el mapeo de puertos, desde un navegador apunte a la dirección IP de la máquina host y el puerto 8080.

Screenshot_6.png

Volume mapping

Los volúmenes son una forma de persistir y compartir datos entre los contenedores y el host, lo que nos permite mantener la persistencia de datos incluso después de que el contenedor se detenga o se elimine, a esta operación se le conoce Volume Mapping (mapeo de volúmenes) en docker.

Para empezar, vamos a crear un contenedor utilizando Volume Mapping para persistir datos. Supongamos que queremos ejecutar un servidor de base de datos, MySQL en un contenedor docker y mantener los datos de la base de datos fuera del contenedor, para poderlos conservar en caso de que el contenedor MySQL se detenga o se elimine.

Ejecutemos el siguiente comando para crear un contenedor con Volume Mapping:

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysecret -v /ruta/host:/var/lib/mysql --name mysql-container mysql:latest

Explicación del comando:

  • -d: ejecuta el contenedor en modo daemon (en segundo plano).

  • -p 3306:3306: mapea el puerto 3306 del host al puerto 3306 del contenedor para acceder al servidor MySQL.

  • -e MYSQL_ROOT_PASSWORD=mysecret: establece la contraseña mysecret para el root para del servidor MySQL dentro del contenedor.

  • -v /ruta/host:/var/lib/mysql: Crea un volumen en el host (su máquina local fisica, o su máquina virtual o su servidor) y lo mapea al directorio /var/lib/mysql dentro del contenedor, donde se almacenarán los datos de MySQL.

  • --name mysql-container: asigna el nombre mysql-container al contenedor para facilitar su manejo.

  • mysql:latest: Utiliza la imagen de MySQL más reciente disponible en Docker Hub.

Para verificar que el Volume Mapping ha funcionado correctamente, podemos detener y eliminar el contenedor. Luego, al volver a crear el contenedor con el mismo comando, los datos de la base de datos deberían persistir.

Nota: Almacene algunos datos en la base de datos, como usuarios, bases de datos y algunas tablas, para que posteriormente pueda validar que estos se conservaron.

Ejecutemos los siguientes comandos para detener y eliminar el contenedor:

docker stop mysql-container
docker rm mysql-container

Volvamos a crear el contenedor con el mismo comando utilizado anteriormente:

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysecret -v /ruta/host:/var/lib/mysql --name mysql-container mysql:latest

Ahora, si revisamos la base de datos dentro del contenedor, deberíamos encontrar que los datos se mantuvieron, incluso después de detener y eliminar el contenedor.

Inspect

El comando docker inspect es una herramienta poderosa para obtener información detallada sobre contenedores e imágenes en docker. Nos permite acceder a metadatos importantes y comprender mejor la configuración y el estado de los elementos en nuestro entorno docker. Con la capacidad de extraer datos específicos de la salida, docker inspect se convierte en una herramienta esencial para los ingenieros DevOps y desarrolladores que necesitan depurar y entender a fondo sus contenedores e imágenes.

Para obtener información detallada de un contenedor o imagen, simplemente ejecutamos el comando docker inspect seguido del nombre o ID del contenedor o imagen que queremos inspeccionar.

Ejemplo:

# Para inspeccionar un contenedor
docker inspect nombre_del_contenedor

# Para inspeccionar una imagen
docker inspect nombre_de_la_imagen

La salida de docker inspect será un JSON que contiene toda la información detallada del contenedor o imagen. Puede ser una gran cantidad de datos, por lo que es útil redirigir la salida a un archivo para un análisis más cómodo.

Ejemplo:

# Guardar la salida en un archivo
docker inspect nombre_del_contenedor > salida_contenedor.txt

Una vez que tenemos la salida de docker inspect, podemos explorarla para obtener información específica sobre el contenedor o imagen.

Por ejemplo:

Logs

El comando docker logs es una herramienta útil para acceder a los registros generados por un contenedor en docker. Nos permite ver la salida estándar y de error en tiempo real o consultar logs almacenados hasta el momento. Con las opciones adicionales, podemos obtener logs de canales específicos y limitar la cantidad de líneas mostradas, lo que facilita la tarea de monitorear y depurar la ejecución de nuestras aplicaciones en contenedores docker.

Para ver los logs de un contenedor, simplemente ejecutamos el comando docker logs seguido del nombre o ID del contenedor que queremos inspeccionar.

Ejemplo:

docker logs nombre_del_contenedor

Por defecto, docker logs muestra los logs almacenados hasta el momento. Si queremos seguir los logs en tiempo real y ver las nuevas líneas que se agregan, podemos utilizar la opción -f o --follow.

Ejemplo:

docker logs -f nombre_del_contenedor

Por ejemplo:

Referencias

  1. Comando docker run

  2. Docker Network

  3. Docker Volumes

  4. Comando docker inspect

  5. Comando docker logs

Did you find this article valuable?

Support Jesse Padilla by becoming a sponsor. Any amount is appreciated!