Docker
Docker es el sistema de virtualización con contenedores más utilizado en la actualidad, posee una gran cantidad de repositorios e imágenes, además de poder crear y personalizar imágenes propias en función de las necesidades.
Se ha de diferenciar entre:
- Repositorio: Lugar, normalmente remoto en el que se encuentran las imágenes.
- Imagen: Plantilla en la que no se puede escribir y en la que se definen las instrucciones para la creación del contenedor.
- Contenedor: Instancia ejecutable de una imagen y que ejecuta la aplicación o servicio.
Instalación
Existen versiones para Windows (necesita WSL2), Linux y Mac que instala la interfaz para interactuar con el motor con una API un CLI y el motor propiamente dicho con elementos para la red, volúmenes, construcción, distribución o la orquestación entre otros.
Docker se puede encontrar en este enlace.
Una vez instalado se puede ir a la linea de comandos y ejecutar el comando:
- docker: Apareciendo el listado de comandos disponible (CLI).
Descargando imágenes y creando contenedores
Ya se tiene Docker instalado, ahora es necesario o bien crear imágenes y contenedores a partir de las primeras o usar un repositorio de imágenes, siendo el más conocido DockerHub. Dispone de cuentas gratuitas y de pago, y permite subir imágenes propias para su posterior uso.
Por ejemplo se desea instalar una imagen de la conocida tienda web magento, para ello ir a la página web del repositorio y buscar la palabra magento o usando el comando:
docker search magento
Una vez localizada la imagen que se desea obtener ejecutar el comando:
docker pull alexcheng/magento
En este momento ya es posible crear contenedores a partir de la imagen descargada, para comprobar las imágenes locales:
docker images
Para iniciar un contenedor ejecutar, en el que el parámetro -p indican el mapeo de puerto de la máquina anfitriona y del contenedor:
docker run -p [host port]:[container port] [nombre imagen]
Al entrar en la IP o URL de la máquina anfitriona se puede ver el instalador de Magento para iniciar el proceso.
Para apagar los contenedores ejecutar:
docker stop [nombre_contenedor]
Es posible ver los contenedor de la máquina con el comando
docker container ls -all
Persistencia de datos
Los contenedores no tienen acceso al sistema de archivos y son simplemente un conjunto de procesos y librerías aislados del resto de los elementos del sistema operativo anfitrión, al eliminarse también se eliminan los datos que contiene.
Para solucionar este problema existen diferentes alternativas, siendo la más usual la de creación de volúmenes y asignación a los contenedores.
Para crear un volumen en Docker:
docker volume create [nombre_volumen]
Para listar los volúmenes existentes:
docker volume ls
Y para ver los detalles de alguno de ellos:
docker volume inspect [nombre]
Por último, para borrar un volumen usar el comando:
docker volume rm [nombre_contenedor]
Para "montar" el volumen en el árbol de directorios del contenedor usar el comando run con el parámetro mount en el que se indica el volumen con source y con target el punto de montaje dentro del contenedor. Un ejemplo con el volumen anterior:
docker run --source=ejemplovolumen, target/var/lib/mysql
Unidad lógica de almacenamiento asignada a un tipo de sistema de archivos.
Dockerfile
Es posible la ejecución de parámetros en el contenedor tanto al iniciarlo como una vez en ejecución usando los comandos:
- docker run
- docker exec
Por ejemplo para realizar un Is dentro de un contenedor ya iniciado:
docker exec -it confident_poítras ls -1
Se puede encontrar información mucho más completa en la documentación oficial acerca del comando docker exec.
Tener que estar ejecutando cada uno de los comandos en el contenedor para configurar el mismo es una tarea tediosa, además es interesante adaptar una imagen base a las necesidades del proyecto. Para crear una imagen personalizada se utiliza el fichero Dockerfile que contiene comandos que se ejecutan al instanciar la imagen, estos comandos se encuentran precedidos de otros que indican ciertas acciones:
- FROM
- imagen: Indica la imagen base.
- RUN
- comandos: se ejecuta en la imagen.
- CMD
- comandos: se ejecuta posteriormente a la instancia del contenedor.
- ADD
- Posee dos formatos:
- ADD
- -- chown <user>:<group>
- ADD
- -- chown <user>:<group>”<src>”,...”<dest>”
Por supuesto chown solo es aplicable en contenedores Linux. La segunda forma simplemente añade un conjunto de ficheros/directorios de forma local y/o remota. En caso de añadir ficheros comprimidos es capaz de reconocerlos y descomprimir.
- COPY: Similar al anterior, la documentación oficial recomienda este antes que ADD en ficheros normales (no comprimidos).
- EXPOSE
- <port>/<protocol>: Se definen los puertos en lo que el contenedor se encuentra escuchando.
- ENV: Da valor a variables de entorno.
- LABEL: Añade metainformación a la imagen.
- ENTRYPOINT: Indica el comando y los parámetros a ejecutar al iniciar el contenedor.
- VOLUME: Crea un volumen y lo monta en el directorio indicado.
- WORKDIR: Establece el directorio en el que se ejecutan el resto de comandos.
Una vez creado el Dockerfile ejecutar el comando en el directorio en el que se encuentra el fichero Dockerfile:
docker build -t nombre_imagen
Buenas prácticas para la creación de ficheros Dockerfile
Este documento cubre las mejores prácticas y métodos recomendados para crear imágenes eficientes.
Docker crea imágenes automáticamente leyendo las instrucciones de un archivo Dockerfile de texto que contiene todos los comandos, necesarios para crear una imagen determinada. El formato especifico y un conjunto de instrucciones de Dockerfile, que puede encontrar en la referencia de la documentación oficial.
GESTIÓN AUTOMATIZADA DE CONFIGURACIÓN DE SISTEMAS
En el punto anterior se han tratado los comandos básicos para la gestión de contenedores, aunque existen muchos otros. La configuración de forma manual de los contenedores puede ser una tarea laboriosa, repetitiva y en la cual se pueden olvidar algunos pasos al realizarlas varias veces.
La primera idea que viene a la mente es la de la creación de un guión que ejecute los comandos de forma automática, si bien no es una mala práctica tiene varios inconvenientes como la portabilidad o la falta de estandarización.
Docker posee una herramienta que permite la gestión automatizada de la configuración de los contenedores Docker Compose, esta facilita la configuración de contenedores usando un fichero en formato YAML. Un ejemplo típico es la de una aplicación web que posee un servidor web, una base de datos y un servidor de correo para la gestión de usuarios/contraseñas, en el que cada uno de ellos se ejecuta en un contenedor diferenciado, pero que forman parte de la misma aplicación, gracias a Compose, poner en marcha los contenedores se realiza ejecutando únicamente un comando.
Es un lenguaje de señalización de datos similar a XML y JSON, amigable para los humanos. Es muy útil para las necesidades de programación que van desde archivos de configuración hasta mensajería de Internet, persistencia de objetos y auditoria de datos.
Instalar Docker Compose
En Windows y MAC viene incluido con Docker por lo que no es necesario realizar ninguna acción, en Linux se han de ejecutar los siguientes comandos:
$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
Por último comprobar que funciona se ha instalado correctamente con el comando:
docker-compose --version
Formato fichero docker-compose.ylm
El fichero que especifica los servicios a levantar y sus características se encuentra escrito en formato YAML, tal y como se ha comentado. La especificación del fichero se puede encontrar en este enlace.
El elemento principal es el servicio, el cual se define dentro de la propiedad services del fichero. Estos servicios son una definición abstracta de un recurso informático dentro de una aplicación. Estos se encuentran respaldados por contenedores que se ejecutan en función a los requisitos de la aplicación.
Cada servicio posee un nombre que lo identifica además de decenas de propiedades para su configuración, algunas de ellas son:
- image: Indica la base a usar.
- deploy: Permite configurar el despliegue del servicio, posee propiedades como:
- Endpoint_mode: para indicar cómo los clientes se conectan al servicio.
- Labels: para añadir meta-información al servicio, mode que indica cómo se realiza la replicación en caso de ser necesario.
- Constrains: para fijar requisitos de ejecución de la plataforma como que el dispositivo de almacenamiento sea ssd.
- Replicas: para especificar el número de contenedores que han de ejecutarse al mismo tiempo.
- Resource: Requisitos normalmente hardware para el servicio, como el número de CPUS o la memoria, se puede indicar los limites y establecer reservas.
- Restartpolicy: Configurar como se reinician los contenedores, indicando si existe un retraso (delay), un número máximo de intentos (mcvLattempts)
- blkio_config: Establece los limites de los dispositivos de entrada/salida de bloques, con las propiedades path y rate.
- weight: Limita el ancho de banda.
- container_name: Fija el nombre del contenedor.
- depends_on: Orden de inicio y arranque en función de otros servicios, por ejemplo el servicio de base de datos se ha de iniciar previamente al del servidor web.
- loggins: Permite configurar el log del contenedor, por ejemplo definir el sistema syslog e indicar la url en el que se almacenan los logs.
- network: Se utiliza para establecer la comunicación entre los servicios. Se especifican con un nombre. A su vez posee diferentes propiedades como la IPv4 e IPv6 o la prioridad.
- ports: Puertos en los que el servicio se encuentra escuchando, posee diferentes formatos (rango de puertos, ip o tcp/udp).
- read_only: El sistema de ficheros del contenedor es de solo lectura.
- volumes: Define los volúmenes a usar por el contenedor y en qué lugar se almacenan el anfitrión. Es posible compartir volúmenes en varios servicios. Algunas de las propiedades son:
- type: Tipo de montaje, bind, tmpfs o npipe.
- source: Directorio del host anfitrión.
- target: Ruta en el que se montará en el contenedor.
- read_only: Indica que el volumen es de solo lectura.
Comando docker-compose
Una vez creado el fichero se ejecuta el comando docker-compose para la gestión de esa configuración, las diferentes opciones del CLI se pueden encontrar en este enlace. Las más usuales:
- docker-compose up: A partir de docker-compose.yaml crea los contenedores y los inicia.
- docker-compose down: apaga los servicios levantados.
- docker-compose ps: Equivalente al comando ps del sistema operativo.
- docker-compose exec: Similar al comando exe de Docker.
- docker-compose log: Permite ver los logs de los servicios.
- docker-compose rm: Borra un servicio (contenedor) previamente parado.

