Introducción a Docker: Docker Compose

Es hora de ir recapitulando todo lo que hemos aprendido de Docker hasta ahora:

  1. Introducción a Docker: Nginx
  2. Introducción a Docker: Nginx + PHP
  3. Introducción a Docker: Nginx + PHP + Redis

Lo peor de las anteriores publicaciones ha sido el tener que introducir comandos muy largos en la terminal, de manera que vamos a intentar reducir esa fricción. ¿Y si os dijera que podemos hacer lo mismo pero ejecutando un comando, uno solo, y muy cortito? “Yes, we can!”.

“Por favor Sr. Docker-Compose, preséntese en la sala”

Docker-compose acude al rescate para ayudarnos a agrupar configuraciones, y dejar a un lado esos comandos infernales, que podemos agrupar bajo un mismo alias/servicio para arrancar juntas o de manera individual. A continuación vamos trasladar todo lo aprendido hasta ahora a un fichero YML, y sin miedo (lo tenéis en https://github.com/avcconti/ph-docker-intro/blob/master/4-docker-compose/docker-compose.yml):

version: '3'

services:
  redis:
    image: 'redis:latest'
    ports:
      - '6379:6379'
    volumes:
      - 'redis_data:/data'
    networks:
      - 'mynet'
  php:
    build:
      context: .
      dockerfile: DockerfilePHP
    volumes:
      - '.:/www/myapp'
    ports:
      - '9000:9000'
    networks:
      - 'mynet'
  web:
    build: .
    depends_on:
      - 'php'
    ports:
      - '8080:80'
    volumes:
      - '.:/www/myapp'
    networks:
      - 'mynet'
    
volumes:
  redis_data: {}

networks:
  mynet: {}

Docker-compose se instala normalmente con Docker, por lo que deberíais recibir respuesta satisfactoria del siguiente comando:

docker-compose -h

Descargad/clonad/actualizad el repositorio local de https://github.com/avcconti/ph-docker-intro para obtener la carpeta 4-docker-compose, y dentro de esa carpeta ejecutad el siguiente comando:

docker-compose up

Cuando veáis algo similar a esto:

visitad con el navegador la URL http://localhost:8080/ y el resultado debería ser:

Traduciendo

Si nos fijamos en el fichero YML, y hemos seguido la serie de publicaciones, veremos una relación directa entre la configuración de cada servicio y los comandos que introdujimos en el pasado, por ejemplo:

web:
    build: .
    depends_on:
      - 'php'
    ports:
      - '8080:80'
    volumes:
      - '.:/www/myapp'
    networks:
      - 'mynet'
  1. Construye el servicio web usando la imagen por defecto (al no especificarse busca Dockerfile ).
  2. No arranca hasta que el servicio php esté levantado y corriendo gracias al depends_on.
  3. Engancha puerto local 8080 al 80 del contenedor.
  4. Enlaza el path actual al volumen indicado del contenedor.
  5. Usa la red mynet

Y ahora con el de Redis:

redis:
    image: 'redis:latest'
    ports:
      - '6379:6379'
    volumes:
      - 'redis_data:/data'
    networks:
      - 'mynet'
  1. Este servicio se basa en la imagen redis:latest (que buscará en Dockerhub)
  2. Engancha mi puerto 6379 al mismo puerto del contenedor
  3. Enlaza redis_data al path indicado del contenedor
  4. Usa la red mynet

Si os vais al fichero docker_assets/myapp.conf del repositorio veréis que hemos cambiado el nombre de dominio con el que buscaremos a PHP-FPM, en este caso buscaremos php, ya que es el nombre que le hemos puesto al servicio en docker-compose, y el que se usará para la resolución de dominios dentro de mynet.

Despedida

Hasta aquí hemos llegado con la introducción a Docker, espero que hayáis aprendido tanto como lo hice yo en su momento, y que me permitió agilizar tareas de desarrollo del día a día. Seguiremos hablando de Docker en el futuro, pero de manera más concisa y menos dirigida, como lo han sido estas cuatro publicaciones.

¡Nos vemos pronto!

Leave a Reply