Docker compose: FastAPI con MySQL, junto con un panel de control PHPMyAdmin y el proxy manager Traefik

Tiempo de lectura: 4 minutos

En este tutorial, te mostraré cómo utilizar Docker Compose para crear una aplicación FastAPI con MySQL, junto con un panel de control PHPMyAdmin y el proxy manager Traefik. Docker Compose es una herramienta que te permite definir y ejecutar aplicaciones Docker multi-contenedor.

Paso 1: Instalar Docker y Docker Compose

Para utilizar Docker Compose, primero debes tener Docker instalado en tu computadora. Puedes descargar Docker desde el sitio web oficial de Docker (https://www.docker.com/get-started). Además, debes instalar Docker Compose, que puedes descargar desde el sitio web oficial de Docker Compose (https://docs.docker.com/compose/install/).

Paso 2: Crear la aplicación FastAPI

Para crear la aplicación FastAPI que utilizaremos en este tutorial, sigue los mismos pasos que en el tutorial anterior.

Paso 3: Crear el archivo docker-compose.yml

En lugar de crear un Dockerfile para cada contenedor de la aplicación, utilizaremos un archivo docker-compose.yml para definir los contenedores. Aquí está un ejemplo de un archivo docker-compose.yml para una aplicación FastAPI con MySQL, PHPMyAdmin y Traefik:

yaml
version: '3.9'
services:
  app:
    build: .
    ports:
      - "80:80"
    depends_on:
      - db
    environment:
      - MYSQL_USER=root
      - MYSQL_PASSWORD=example
      - MYSQL_HOST=db
      - MYSQL_PORT=3306
      - MYSQL_DATABASE=mydatabase
    networks:
      - web
  db:
    image: mysql:8.0
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=example
      - MYSQL_DATABASE=mydatabase
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - web
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    environment:
      - PMA_HOST=db
      - MYSQL_ROOT_PASSWORD=example
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.phpmyadmin.rule=Host(`phpmyadmin.example.com`)"
      - "traefik.http.middlewares.phpmyadmin-auth.basicauth.users=admin:$apr1$BXjTBCuD$/XgTlNGcqehJFt78sfl1I/"
      - "traefik.http.routers.phpmyadmin.middlewares=phpmyadmin-auth"
    networks:
      - web
  traefik:
    image: traefik:v2.4
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_config:/etc/traefik
      - traefik_data:/var/lib/traefik
    networks:
      - web
volumes:
  mysql_data:
  traefik_config:
  traefik_data:
networks:
  web:

Este archivo define cuatro servicios: app, db, phpmyadmin y traefik.

El servicio app utiliza el Dockerfile del directorio actual y se ejecuta en el puerto 80. Además, este servicio depende del servicio db y define las variables de entorno para conectarse a la base de datos MySQL.

El servicio db utiliza la imagen de MySQL y se reinicia automáticamente si se detiene. También define la contraseña de root y la base de datos de MySQL, así como el volumen para los datos de MySQL.

El servicio phpmyadmin utiliza la imagen de PHPMyAdmin y se conecta al servicio db. Este servicio se ejecuta en el puerto 8080 y se define el host para acceder a través de Traefik, así como la autenticación básica de usuario y contraseña.

Finalmente, el servicio traefik utiliza la imagen de Traefik y se ejecuta en los puertos 80 y 443. También se define el volumen para la configuración de Traefik y los datos de Traefik.

El archivo también define tres volúmenes para los datos de MySQL y Traefik, y una red llamada web para conectar todos los servicios.

Paso 4: Ejecutar la aplicación con Docker Compose

Para ejecutar la aplicación con Docker Compose, simplemente ejecuta el siguiente comando en el directorio donde se encuentra el archivo docker-compose.yml:

docker-compose up -d

Este comando construirá y ejecutará todos los contenedores definidos en el archivo docker-compose.yml. La opción -d indica que los contenedores se ejecutarán en segundo plano.

Una vez que se hayan creado los contenedores, puedes acceder a la aplicación FastAPI en tu navegador web en la dirección http://localhost. También puedes acceder a PHPMyAdmin en http://phpmyadmin.example.com (asegúrate de cambiar phpmyadmin.example.com por tu propio dominio).

Paso 5: Administrar la aplicación con Traefik y Proxy Manager

Traefik es un proxy inverso y un balanceador de carga que nos permite administrar nuestras aplicaciones con facilidad. Para usar Traefik en nuestro proyecto, debemos agregar algunas etiquetas a nuestro archivo docker-compose.yml. Estas etiquetas indican a Traefik que debe enrutar el tráfico al servicio phpmyadmin en el puerto 8080.

Además, podemos usar Proxy Manager para administrar nuestras aplicaciones web de forma centralizada. Proxy Manager nos permite agregar fácilmente SSL y autenticación básica a nuestras aplicaciones. Para usar Proxy Manager en nuestro proyecto, debemos agregar algunos ajustes a nuestro archivo docker-compose.yml.

Aquí está el archivo docker-compose.yml actualizado con las etiquetas de Traefik y las configuraciones de Proxy Manager:

version: '3.9'
services:
  app:
    build: .
    ports:
      - "80:80"
    environment:
      - MYSQL_USER=root
      - MYSQL_PASSWORD=example
      - MYSQL_HOST=db
      - MYSQL_PORT=3306
      - MYSQL_DATABASE=mydatabase
    networks:
      - web
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`example.com`)"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      - "traefik.http.routers.app.middlewares=redirect-to-https"
      - "traefik.http.routers.app-secure.rule=Host(`example.com`)"
      - "traefik.http.routers.app-secure.entrypoints=websecure"
      - "traefik.http.routers.app-secure.tls.certresolver=myresolver"
  db:
    image: mysql:8.0
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=example
      - MYSQL_DATABASE=mydatabase
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - web
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    environment:
    - PMA_HOST=db
    - PMA_PORT=3306
    - PMA_USER=root
    - PMA_PASSWORD=example
    - PHP_UPLOAD_MAX_FILESIZE=1G
    - PHP_MAX_INPUT_VARS=1G
    labels:
    - "traefik.enable=true"
    - "traefik.http.routers.phpmyadmin.rule=Host(phpmyadmin.example.com)"
    - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    - "traefik.http.routers.phpmyadmin.middlewares=redirect-to-https"
    - "traefik.http.routers.phpmyadmin-secure.rule=Host(phpmyadmin.example.com)"
    - "traefik.http.routers.phpmyadmin-secure.entrypoints=websecure"
    - "traefik.http.routers.phpmyadmin-secure.tls.certresolver=myresolver"
    - "traefik.http.services.phpmyadmin.loadbalancer.server.port=80"
    networks:
    - web
  traefik:
    image: traefik:v2.4
    restart: always
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - ./traefik:/etc/traefik
    - /var/run/docker.sock:/var/run/docker.sock
    labels:
    - "traefik.enable=true"
    - "traefik.http.routers.traefik.rule=Host(traefik.example.com)"
    - "traefik.http.routers.traefik.entrypoints=websecure"
    - "traefik.http.routers.traefik.tls.certresolver=myresolver"
    
  networks:
    - web
  volumes:
    mysql_data:
    traefik:
    traefik_data:
    networks:
  web:
    external: true

En la sección labels del servicio app, hemos agregado algunas etiquetas para definir cómo Traefik debe enrutar el tráfico al servicio. Hemos definido que la regla de enrutamiento de Traefik debe ser Host(example.com) para enrutar el tráfico al servicio app. También hemos agregado una etiqueta para redirigir todo el tráfico HTTP a HTTPS.

En la sección labels del servicio phpmyadmin, hemos agregado algunas etiquetas para definir cómo Traefik debe enrutar el tráfico al servicio phpmyadmin. Hemos definido que la regla de enrutamiento de Traefik debe ser Host(phpmyadmin.example.com) para enrutar el tráfico al servicio phpmyadmin. También hemos agregado una etiqueta para redirigir todo el tráfico HTTP a HTTPS.

En la sección labels del servicio traefik, hemos agregado algunas etiquetas para definir cómo Traefik debe enrutar el tráfico al servicio traefik. Hemos definido que la regla de enrutamiento de Traefik debe ser Host(traefik.example.com) para enrutar el tráfico al servicio traefik.

Además, hemos agregado algunas etiquetas para definir la autenticación básica en los servicios app y phpmyadmin. Para hacer esto, debes agregar los siguientes volúmenes al servicio traefik en el archivo docker-compose.yml:

volumes:
  - ./traefik:/etc/traefik
  - /var/run/docker.sock:/var/run/docker.sock
  - ./proxy-manager:/data
  - ./proxy-manager/auth:/auth

Luego, debes crear un archivo llamado usersfile dentro del directorio auth y agregar tus credenciales en el siguiente formato:

usuario:contraseña

Finalmente, agrega las siguientes etiquetas en la sección labels del servicio que deseas proteger con autenticación básica:

      - "traefik.http.middlewares.auth.basicauth.usersfile=/auth/usersfile"
      - "traefik.http.middlewares.auth.basicauth.removeheader=true"
      - "traefik.http.routers.app-secure.middlewares=auth"
      - "traefik.http.routers.phpmyadmin-secure.middlewares=auth"

Ahora, cuando accedas a los servicios app y phpmyadmin, se te pedirá que ingreses tus credenciales para iniciar sesión.

Finalmente, ejecuta el siguiente comando para iniciar los servicios:

docker-compose up -d

Una vez que los servicios se hayan iniciado correctamente, puedes acceder a FastAPI en https://example.com y a phpMyAdmin en https://phpmyadmin.example.com. También puedes acceder a Traefik en https://traefik.example.com.

En conclusión, Docker Compose es una herramienta muy poderosa para definir y ejecutar aplicaciones en contenedores Docker. Con este tutorial, aprendiste cómo crear un Docker Compose para una aplicación FastAPI y MySQL, junto con phpMyAdmin y Traefik. También aprendiste a agregar autenticación básica para proteger tus servicios con contraseña. Esperamos que esta guía te haya sido útil y que hayas podido crear tu propio Docker Compose para tu aplicación.

Deja un comentario