ksergio.com

I love coding

← Volver

Multiples servicios con docker-compose

13/1/2024

docker-compose-imagen

Inicializar multiples serivicios

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.

Dependencia entre servicios

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.

Red interna

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.

Bases de datos y volúmenes

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:

  1. Persistencia de datos
  2. Velocidad
  3. Portabilidad

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.