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.
Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.