En el post anterior vimos una introducción a los contenedores, y una aproximación a Docker, ahora lo que haremos es entender la arquitectura en sí de Docker.
Como ya sabemos Docker es un contenedor de aplicaciones el cual está basado en los contenedores Linux.
Antes de hablar de los contenedores Docker, hablaremos de Docker Engine, un sistema cliente-servidor, que está constituido por tres partes.
- El demonio de Docker: Este es el encargado de procesar todas las peticiones del cliente. Por ejemplo: la creación de imágenes y contenedores.
- API Rest: Es el puente entre el cliente y el demonio de Docker, es una API Rest común, utilizado por algunos clientes que no se comunican por línea de comandos.
- El cliente de Docker: Es la consola o interfaz de linea de comandos con el cual realizaremos las tareas de gestionar las imágenes y contenedores.
En Docker vamos a diferenciar dos cosas en particular, por un lado las imágenes y por el otro, los contenedores.
Imagen
Las imágenes son plantillas de solo lectura, es donde definimos todas las capas del contenedor, entendiéndose como capas al sistema operativo, librerías, sistemas de ficheros, configuraciones y todo lo necesario para desplegar nuestras aplicaciones.
Contenedor
El contenedor es una instancia de la imagen con el cual podemos interactuar, éste tiene todas las capas y ejecuta todos los comandos y configuraciones realizadas con antelación dentro de la imagen.
Es similar a una maquina virtual, pero lógicamente como explicamos en el post anterior, solo contiene el núcleo del sistema operativo, y demás capas de la imagen, lo cual como te estarás imaginando hace que sea muy liviano.
A tener en cuenta:
- A partir de una imagen podemos crear muchos contenedores, o si queremos también otras imágenes.
- La información almacenada en los contenedores no será persistente, éste solo existirá mientras el contenedor exista.
- Pero para persistir información existen los volúmenes, y si queremos comunicar contenedores también podemos crear redes en Docker.
- La forma de comunicarnos con los contenedores será por medio de su shell, ya sea del S.O o de las aplicaciones instaladas.
Docker Hub
Docker Hub es el repositorio de imágenes de Docker, aquí se almacenan todas las imágenes para diferentes aplicaciones, en algunos casos no será necesario crear una imagen, sino solamente descargarlo y utilizarlo para crear nuestros contenedores.
También nos sirve para compartir imágenes, lo publicamos en la nube para que los demás lo utilicen.
Hasta aquí vamos a dejar esta introducción teórica de Docker para empezar a jugar y divertirnos con esta tecnología.
Toda la parafernalia de la instalación la voy a omitir, porque hay demasiada información relacionada, en general lo único que se tiene que hacer es descargar Docker de su página oficial y seguir el asistente de la instalación, no tiene más complicaciones.
En adelante vamos a utilizar la imagen de MongoDB version 4-xenial para los ejemplos con imágenes y contenedores.
Para gestionar las imágenes y contenedores existen muchos comandos, pero iremos por partes.
Para las imágenes
Buscar y descargar una imagen
docker search mongo:4-xenial docker pull mongo:4-xenial
Línea 1: Busca la imagen mongo: 4-xenial.
Línea 2: Descarga la imagen mongo:4-xenial (cabe mencionar que si no consideras la versión o tag, por defecto descarga la última).
Las imágenes tienen un nombre, seguido dos puntos y el tag (versión) <<name:tag>> como el caso de mongo:4-xenialTambién se pueden buscar las imágenes desde la página de Docker Hub para luego descargarlas con el comando docker pull.
Listar las imágenes, ver el historial y eliminar
docker images docker history mongo:4-xenial
docker rmi mongo:4-xenial
Línea 1: Lista las imágenes que tienes descargadas.
Línea 2: Muestra los cambios y configuraciones que se hicieron en la imagen.
Línea 3: Elimina la imagen, puede ser por su nombre como en este caso, o por su ID.
Estos comandos son los que necesitas conocer para trabajar con las imágenes. Para crear imágenes más complejas y personalizadas lo haremos con el Dockerfile, si hay algún comando que se me olvida lo iremos viendo en los ejemplos.
Para los Contenedores
Creación de un contenedor
docker run -it --name mongo_prueba mongo:4-xenial bash docker run -it -d --name mongo_prueba mongo:4-xenial /bin/bash docker run -it -d --name mongo_prueba -p 27018:27017 mongo:4-xenial /bin/bash
Línea 1: Crea un contenedor con el nombre mongo_prueba, a partir de la imagen mongo:4-xenial, con el parámetro -it hacemos que se conecte a un terminal interactivo en este caso bash.
Línea 2: Es similar al anterior, pero con el parámetro -d le indicamos que se ejecute en segundo plano.
Línea 3: Con el comando -p exponemos el puerto 27017 que es el puerto por defecto de mongoDB que está en nuestro contenedor mongo_prueba, por el puerto 27018 de nuestra máquina local.
De esta forma podemos conectar un cliente de MongoDB, como Robo3T a nuestra base de datos mongoDB que está expuesto por el puerto 27018 de nuestra máquina local.
Visualizar los contenedores y el consumo de los recursos
docker ps docker ps -a docker stats mongo_prueba docker logs mongo_prueba
Línea 1: Muestra solo los contenedores en ejecución.
Línea 2: Muestra todos los contenedores.
Línea 3: Muestra el consumo de memoria y CPU.
Línea 4: Cuando ejecutas un contenedor, alguna veces vas a tener la necesidad de ver los logs para saber si todo va funcionando bien, con este comando lo puedes hacer.
Vincularse a un contenedor, iniciar, reiniciar, parar
docker exec -it mongo_prueba bash docker stop mongo_prueba docker start mongo_prueba docker restart mongo_prueba
Línea 1: Se conecta a un contenedor que está en ejecución.
Línea 2: Detiene el contenedor.
Línea 3: Inicia un contenedor que está detenido.
Línea 4: Reinicia el contenedor.
Pasar y traer archivos del contenedor
En ocasiones necesitamos copiar archivos o carpetas de nuestra máquina local a nuestro contenedor, eso lo hacemos con este sencillo comando:
docker cp e:/source mongo_prueba:/dest
Línea 1: Con el comando cp pasamos archivos de la ruta e:/source de nuestra maquina local hacia nuestro contenedor, en este caso se guardará en la carpeta dest de la raíz.
Seguro que este no fue el post mas prolijo sobre los comandos de Docker, pero contiene lo necesario para gestionar las imágenes y los contenedores.
Si deseas conocer más sobre la línea de comandos puedes visitar la guía de referencia de Docker.
En un siguiente post, construiremos imágenes personalizadas con el Dockerfile. Te adelanto que el Dockerfile no es más que un archivo estructurado donde se registran todas las capas de la imagen ;).
Hasta la próxima!!.