Un repositorio super simple aquí.
En este caso voy a levantar un serivicio para PHP, Nginx a modo de servidor y una base de datos con MariaDB.
version: '3'
services:
php:
build: ./php
volumes:
- ./php:/var/www/html
depends_on:
- mariadb
networks:
- app-network
nginx:
image: nginx:latest
ports:
- 80:80
volumes:
- ./php:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d /default.conf
- ./nginx/logs:/var/log/nginx
depends_on:
- php
- mariadb
networks:
- app-network
mariadb:
image: mariadb
restart: always
environment:
MARIADB_ROOT_PASSWORD: example
networks:
- app-network
ports:
- 3306:3306
networks:
app-network:
Aqui hay algunas peculiaridades a la hora de crear multiples serivcios y/o bases de datos.
El campo depends_on hace que el servicio concreto espere hasta que el servicio del cual dependa se haya construido correctamente. Si este fallara, entonces ocurre un error. Por ejemplo; no debe ejecutarse nada hasta que la base de datos se haya iniciado.
El apartado networks indica que red interna usar. Las redes internas las genera Docker y se utilizan para aislar los contenedores y que se comuniquen por su red privada. Esto agrega una capa de seguridad y organización extra.
Igualmetne se puede exponer puertos al exterior como en este caso con Nginx 80:80 o MariaDB 3306:3306 para poder servir el contenido y acceder a la base de datos desde la máquina host respectivamente.
Existen configuraciones avanzadas para gestionar la red y personalizar su comportamiento al detalle.
Aunque aquí no lo haya hecho, es crucial agregar volumenes a las bases de datos. Hay muchos motivos para hacer esto, pero aquí pongo alguno de los más basicos:
Persinstencia: Si reiniciamos el contenedor sin un volumen se pierden los datos internos. Velocidad: Los accesos a volumenes son más rapidos y directos que a los internos del contenedor. Portabilidad: Si quiero realizar movimientos de archivos internos es más fácil trabajar con ellos directamente desde el volumen.