Docker Compose

1. Qué es Docker Compose

Docker Compose es un orquestador local. Permite definir varios contenedores y sus relaciones en un único archivo docker-compose.yml. Es como dirigir una pequeña obra de teatro donde cada servicio tiene su papel, y Compose levanta el escenario entero con un comando.

Puntos clave:

  • Escritura declarativa: defines lo que quieres, Compose lo monta.
  • Multi-servicio: web, base de datos, caches, workers… todo junto.
  • Entornos replicables: mismo resultado en cualquier máquina.

2. Componentes del archivo docker-compose.yml

Cada service es un contenedor.

Los atributos más habituales:

  • image: Imagen a usar.
  • build: Directorio donde está el Dockerfile.
  • ports: Mapeo de puertos HOST:CONTAINER.
  • volumes: Persistencia o montajes locales.
  • environment: Variables de entorno.
  • depends_on: Orden de arranque.
  • networks: Redes personalizadas.

Ejemplo:





services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=atriosecreto
    volumes:
      - dbdata:/var/lib/mysql

volumes:
  dbdata:

3. Comandos esenciales de Docker Compose

  • docker compose up → Levanta todo (añade -d para modo demonio).
  • docker compose down → Apaga y borra contenedores, redes.
  • docker compose ps → Ver contenedores activos del proyecto.
  • docker compose logs -f → Logs en directo.
  • docker compose exec <servicio> <cmd> → Ejecutar dentro del contenedor.
  • docker compose build → Construir imágenes indicadas.

4. Redes y volúmenes en Compose

Compose crea:

  • Una red por defecto para todos los servicios.
  • Volúmenes declarados que sobreviven a los up/down.

Beneficio práctico: un contenedor puede llamar a otro simplemente por su nombre de servicio, por ejemplo:





mysql://usuario:pass@db:3306

5. Buenas prácticas

  • Evitar meter passwords en el YAML → usar .env.
  • Un contenedor, un rol.
  • Mantener separado docker-compose.yml y docker-compose.override.yml.
  • Versionar siempre el YAML en Git.
  • Usar volúmenes en lugar de bind-mounts para producción.

PRÁCTICA GUIADA:
Web + Base de datos con PHPMyAdmin y Apache

montar un stack clásico LAMP con un archivo docker-compose.yml.

Paso 1: crear carpeta del proyecto





mkdir proyecto_compose
cd proyecto_compose

Paso 2: Crear el archivo docker-compose.yml





services:
  db:
    image: mysql:8
    container_name: mysql_compose
    environment:
      - MYSQL_ROOT_PASSWORD=curso2025
      - MYSQL_DATABASE=tienda
    volumes:
      - dbdata:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: pma_compose
    ports:
      - "8081:80"
    environment:
      - PMA_HOST=db
    depends_on:
      - db

  web:
    build: ./web
    container_name: apache_compose
    ports:
      - "8080:80"
    volumes:
      - ./web:/var/www/html
    depends_on:
      - db

volumes:
  dbdata:

Paso 3: Crear la carpeta web con un HTML/PHP mínimo





mkdir web
nano web/index.php

Contenido:





<?php
$mysqli = new mysqli("db", "root", "curso2025", "tienda");
echo $mysqli->connect_error ? "Error de conexión" : "Conexión OK a la BD";
?>
<h1>Hola desde Apache en Docker Compose</h1>

Paso 4: Crear Dockerfile para Apache + PHP

Dentro de web/:





FROM php:8.2-apache
RUN docker-php-ext-install mysqli

Paso 5: Levantar el proyecto





docker compose up -d

Paso 6: Probar que todo funciona

Entra al web:





curl localhost:8080

En docker:





docker compose logs web 
docker compose exec db mysql -uroot -p