Hoy vamos a ver una herramienta para crear de forma sencilla una arquitectura de contenedores en Docker.

Resumen del artículo

Cómo Instalar y Usar Docker Compose en Ubuntu 20.04 0

¿Qué es Docker Compose?

Docker Compose permite crear una arquitectura basada en contenedores de forma muy sencilla.
En esta arquitectura va a estar definido los contenedores que se inicien, comuniquen y apaguen juntos. Y así crear un entorno multi aplicación. Es muy usado por desarrolladores para realizar pruebas en su aplicación antes de lanzarlas en Kubernetes y también en entornos locales. Además es muy sencillo añadir o modificar esta arquitectura al estar basada en microservicios.
La vamos a escribir en formato YAML. No es un lenguaje de programación, no vamos a tener que programar con bucles ni nada similar, solo es una forma de escribir cada detalle de nuestra arquitectura.
Solo vamos a tener que escribir un archivo, correr un comando y nada más, Docker se encarga del resto.



Instalar Docker Compose

Docker compose viene por defecto una vez instalado Docker para Mac y Windows. Viene integrado tanto en el Docker Desktop for Mac como en el Docker Desktop for Windows. Se pueden descargar ambas de forma oficial en la página de Docker Desktop.

  • Windows: Instalado por defecto al instalar Docker Desktop.
  • Windows Server: Hay que realizar un paso más.
  • Mac: Instalado por defecto al instalar Docker Desktop.
  • Linux: Hay que realizar un paso más.

Podemos utilizar nuestro entorno local o cualquier Cloud Público. En mi caso voy a utilizar Clouding.io que es una empresa Española que nos permite crear un VPS en segundos y además ahora cuenta con 5€ de regalo perfectos para hacer estas pruebas.
En Clouding podemos realizarlo de varias formas. Al crear el servidor nos deja elegir la imagen en la que podemos escoger tanto Windows, Windows Server, varias distribuciones de Linux como Ubuntu 20.04 o Debian. La otra opción es en Apps escoger Docker y ya no tendremos que instalar Docker (sí Docker Compose).
Cómo Instalar y Usar Docker Compose en Ubuntu 20.04 1
Cómo Instalar y Usar Docker Compose en Ubuntu 20.04 2

Instalar Docker Compose – En Windows Server

Abrimos una Powershell como administrador y corremos los 2 siguientes comandos separados. Con el primero utilizamos el protocolo TLS 1.2 y con el segundo descargamos de Github el ejecutable.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Windows-x86_64.exe" -UseBasicParsing -OutFile $Env:ProgramFiles\Docker\docker-compose.exe

Instalar Docker Compose – En Linux

En Linux por defecto no viene instalado el binario de Docker Compose. Para ello solo tenemos que descargarlo y otorgarle permisos de ejecución. Estos comandos son comunes tanto para Debian como Ubuntu en sus distintas versiones.
Con este comando descargamos la última versión de Docker Compose, si se quiere descargar otra versión y no la más nueva se puede ir al Github y elegir la versión deseada.

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Ahora solo queda aplicar los permisos de ejecución sobre el binario descargado, para ello utilizamos el siguiente comando:

sudo chmod +x /usr/local/bin/docker-compose

Para comprobar que está correctamente instalado utilizamos:

docker-compose --version

Antes de usar Docker Compose

Ya sabemos lo que es Docker Compose y como instalarlo en cualquier distribución, incluida Mac, Windows o Linux.
Ahora viene el paso importante y más personal. ¿Qué aplicación queremos levantar?
Este paso previo es muy importante ya que el siguiente es definir cada aspecto de la aplicación.
Siempre tenemos que tener una carpeta personal para cada proyecto o un repositorio para tener los archivos.

mkdir Prueba-Docker-compose
cd Prueba-Docker-compose

En esta entrada no vamos a entrar en cómo construir un Dockerfile, en la parte superior, en Contenido relacionado, hay una entrada de como crearlo.
Es más, voy a utilizar varias imágenes públicas para que todos podamos seguir los mismos pasos en estos casos iniciales.

Escribir el Docker Compose

Ya tenemos todo listo para comenzar a escribir nuestro Docker Compose desde 0.
Podemos utilizar cualquier gestor de texto plano como el Notepad o un IDE como Visual Studio Code.
Ahora solo tenemos que crear nuestro archivo YAML. El nombre no puede ser el que queramos, solo puede llamarse docker-compose.yml o docker-compose.yaml si no dará error. En mi ejemplo se va a llamar: docker-compose.yml

Inicio

El inicio va a ser la versión del Compose File o sea, nuestro archivo. No vale poner cualquier versión, según la actualización del Docker tenemos que poner una o otra. Podemos ver la lista de versiones oficiales aquí.
En nuestro caso como acabamos de instalar la última versión de Docker y la última de Docker Compose utilizamos la última versión que es la 3.8.
Por lo que nuestro archivo comienza con:

version: "3.8"

Cada contenedor

Ahora viene la palabra reservada services. Después de ella vamos a definir cada uno de nuestros contenedores y sus características. Se encuentra al mismo nivel que version. Recordad que es YAML, solo hay que respetar el número de espacios y saltos de línea. Importante no usar TAB si no espacios con la barra espaciadora.

version: "3.8"
services:

Cada servicio puede tener el nombre simple que queramos.
Dentro de cada contenedor definimos la imagen (image) a utilizar de forma obligatoria.
Y de forma opcional podemos definir:

  • ports: Los puertos abiertos de la aplicación
  • environment: Variables de entorno.
  • restart: La política de reinicio. Cómo debería comportarse el contenedor en caso de error.
    • no: Es la opción por defecto si no se especifica. No se reinicia hasta que nosotros tomemos acción.
    • on-failure: Se reinicia solo si el contenedor sale con un estado de salida distinto de cero. Se puede indicar de forma opcional el número de intentos.
    • always: Siempre se reinicia el contendor. De forma indefinida.
    • unless-stopped: Igual que el anterior excepto si se para antes Docker.
  • volumes: Si queremos especificar algún tipo de almacenamiento en volúmenes.
  • depend_on: Política de inicio. Si necesita otro contenedor antes de iniciarse, por ejemplo una base de datos antes de iniciar el frontend.
version: "3.8"
services:
  prueba:
   image: redxlus/just-template-http:calculadora
   ports:
    - "80:80"
   restart: always

Enlace de Github: https://gist.github.com/RedxLus/f0bef26cf6a21b07a7859faf404d90c5
Y así en 7 simples líneas tendríamos una arquitectura básica de nuestra aplicación.

Ejecutar nuestro Docker Compose

Ya tenemos listo nuestro archivo. Ahora solo tenemos que ejecutar el siguiente comando:

docker-compose up

Es importante ejecutarlo en la misma carpeta en la que se encuentra nuestro archivo recién creado docker-compose.
Ahora vamos a la IP Pública y ya podremos ver nuestra app levantada, en este caso era una calculadora.
Cómo Instalar y Usar Docker Compose en Ubuntu 20.04 3
Para cerrar el Docker Compose y parar la aplicación simplemente en la terminal hacemos CTRL +C para parar el proceso.

Otro ejemplo – Minecraft Docker Compose

Ya hemos visto que tan sencillo es crear nuestro Docker Compose. Ahora vamos a realizar más pruebas de ejemplo reales. Vamos a centrarnos un poco más en una aplicación real.
Para este ejemplo voy a utilizar la imagen pública de Minecraft: Redxlus/minecraft-server
En este caso vamos a necesitar una forma de almacenar datos. Para ello vamos a utilizar volúmenes dentro de nuestro Docker Compose.
Podemos hacer 2 cosas. Podemos crear primero el volumen y luego utilizarlo en el Compose. O podemos correr el Compose y nos va a crear automáticamente el volumen. De ambas formas se va a mantener el volumen y vamos a poder utilizarlo posteriormente aunque se pare el Compose. Para más información sobre cómo usar volúmenes con Docker Compose podemos ir a la documentación oficial.
Como siempre, creamos la carpeta, accedemos y creamos el archivo Docker Compose Yaml con los siguientes datos.

version: "3.8"
services:
  prueba-minecraft:
   image: redxlus/minecraft-server
   ports:
    - "25565:25565"
   restart: always
   volumes:
    - "my-minecraft-data:/minecraft/world"
volumes:
 my-minecraft-data: {}

Enlace a Github: https://github.com/RedxLus/open-source-hosting/blob/master/HOSTING/GAMES/Minecraft/docker-compose.yml
Ahora pase lo que pase al Compose el World de Minecraft va a estar en nuestro volumen.

Otro ejemplo – WordPress Docker Compose

Clouding.io tiene dentro de Apps la opción para utilizar e instalar WordPress directamente sin necesidad de toda esta configuración.
Para este ejemplo voy a utilizar 2 imágenes públicas que trabajen juntas: WordPress y Mysql
En este caso además de crear volúmenes vamos a utilizar variables de entorno. Si vamos a la imagen de DockerHub de WordPress vemos que podemos utilizar variables para configurarlo directamente desde la terminal o en nuestro caso, del Compose. Lo mismo para la base de datos MySQL. Podemos, es más, debemos cambiarlas, la contraseña wordpress de la base de datos no es segura, podemos utilizar algún generador o una propia.
Vamos a separar en dos contenedores que se comuniquen entre sí, WordPress y la base de datos. Y además WordPress no va a empezar hasta que la base de datos este activa ya que le hemos añadido el depends_on.

version: "3.8"
services:
  prueba-mysql:
    image: mysql:5.7
    restart: always
    volumes:
      - "db:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  prueba-wordpress:
    depends_on:
      - prueba-mysql
    image: wordpress:latest
    volumes:
      - "wp:/var/www/html"
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db: {}
  wp: {}

Enlace a Github: https://gist.github.com/RedxLus/e8ea06b0d7aa71addae6649194e1b8ac

Resumen

Como podemos ver, Docker Compose es la herramienta oficial y perfecta para crear nuestras propias arquitecturas de forma muy sencilla. Todo el potencial de Docker y su portabilidad en 1 solo archivo y con 1 solo comando. Los casos de uso son infinitos y se usa sobre todo en la parte de desarrollo y en entornos automatizados de CI/CD.
Sobre los servidores VPS ya habéis comprobado lo fácil que es utilizar Clouding, puedes crear y borrar los servidores para crear nuevas arquitecturas en segundos. Total control desde el panel de control, con IP en España, que para proyectos que necesiten recopilar correos u otros datos es un detalle crucial. Y un precio por horas muy reducido. Además cualquier problema o duda tienen soporte 24/7