Tabla de Contenidos

4.b Despliegue avanzado en Servidor: Docker Compose

Docker Compose es una herramienta que permite definir y administrar aplicaciones Docker de múltiples contenedores. Utiliza un archivo YAML para configurar los servicios, las redes y los volúmenes, facilitando la definición y el despliegue de aplicaciones complejas.

Estructura Básica de un archivo docker-compose.yml

Un archivo docker-compose.yml define la configuración de una aplicación multi-contenedor. Aquí se presentan las secciones principales:

services: 
  nombre_contenedor_1:
    image: imagen_servicio1
    restart: opciones si se reinicia el servidor
    hostname: nombre del host 
    volumes:
      - /ruta/host:/ruta/contenedor
    ports:
      - "puerto_host:puerto_contenedor"
    environment:
      - VARIABLE=valor
    tty: true
    stdin_open: true
    pull_policy: never

  nombre_contenedor_2:
    # Configuración del segundo servicio

Comandos Básicos de Docker Compose

  1. Iniciar la aplicación basada en la configuración de docker-compose.yml.

docker compose up -d

  1. Detener y eliminar los contenedores definidos en el archivo docker-compose.yml.

docker compose down

- Muestra el estado de los contenedores definidos en el archivo docker-compose.yml.

docker compose ps

Ejemplo de Uso

Supongamos un archivo docker-compose.yml para una aplicación web con un servicio de frontend y otro de base de datos:


services:
  peliculas_java:
    image: temurin_peliculas
    restart: always
    hostname: peliculas_java
    volumes:
      - /opt/peliculas/target:/opt/app
    ports:
      - "80:8080"
  peliculas_mysql:
    image: mysql:8.3.0
    restart: always
    hostname: peliculas_java
    environment:
      - MYSQL_ROOT_PASSWORD=peliculas
      - MYSQL_DATABASE=peliculas
      - MYSQL_USER=peliculas
      - MYSQL_PASSWORD=peliculas

Para iniciar esta aplicación, ejecutamos:

docker compose up -d

Esto levantará los contenedores de frontend y base de datos con la configuración especificada.

Docker Compose simplifica la gestión de aplicaciones Docker complejas, permitiendo definir y coordinar múltiples servicios con facilidad.

Para pasar un script de docker al formato de docker compose se puede usar la herramienta: https://it-tools.tech/docker-run-to-docker-compose-converter

Construir las imágenes con Compose

Hemos visto que con docker compose up es como hacer un docker container run. Pues resulta que también puede crear las imágenes con su Dockerfile antes de levantar los contenedores. Para ello, en el servicio se pone build: con el Dockerfile a usar y la carpeta de donde copia los ficheros:

services:
  peliculas_java:
    build:
      context: .
      dockerfile: Dockerfile.tienda-back
    restart: always
    hostname: peliculas_java
    volumes:
      - /opt/peliculas/target:/opt/app
    ports:
      - "80:8080"

docker compose up construye la imagen la primera vez. Para reconstruirla cuando cambia el código, Reconstruir las imágenes.

Reconstruir las imágenes

Cada vez que cambia el código hay que volver a crear las imágenes, y hacerlo sin más tiene tres problemas:

Los tres se resuelven bajando todo, borrando las imágenes y la caché y volviendo a levantar:

docker compose down --rmi local
docker buildx prune -f
docker compose up -d

docker buildx prune -f vacía la caché de build de toda la máquina, no solo la de tu proyecto. En un servidor con varios compose.yaml, los de los demás proyectos pueden tardar más en crear sus imágenes la próxima vez, porque ya no tienen la caché. No se rompe nada.