Cómo montar un entorno de desarrollo local con Docker, Traefik y mkcert
Cuando desarrollamos aplicaciones web, contar con un entorno local que simule un entorno de producción real es crucial. Esto incluye tener múltiples servicios (como backend, frontend, bases de datos, etc.), enrutamiento de dominios personalizados y certificados HTTPS válidos.
En este artículo, aprenderás a montar un entorno de desarrollo local con Docker, Traefik como proxy inverso y mkcert para generar certificados TLS válidos en tu máquina. Este enfoque te permitirá trabajar con URLs como https://miapp.localhost sin advertencias de seguridad en el navegador.
Requisitos Previos
Requisitos Previos
Antes de comenzar, asegúrate de tener instalados:
- Docker
- Docker Compose
Primeramente comenzamos montando nuestro entorno traefix + mkcert:
Creamos nuestra red para docker para traefix y nuestro entorno:
docker network create web
Luego creamos una carpeta con el nombre que querramos por ejemplo:
mrkdir traefik
Dentro de la misma creamos nuestro docker compose y agregamos la configuración para nuestro entorno, domain, sería los dominios locales que usaremos en nuestro entorno local y para el cual generaremos certificados:
touch docker-compose.yml
services:
mkcert:
restart: unless-stopped
environment:
- domain=*.home.com,*.site.com,*.local.com
container_name: mkcert
volumes:
- ./certs/:/root/.local/share/mkcert
image: vishnunair/docker-mkcert
labels:
- "traefik.enable=false"
networks:
- web
traefik:
image: traefik:latest
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./config/traefik.yml:/etc/traefik/traefik.yml:ro"
- "./config/dynamic.yml:/etc/traefik/dynamic.yml:ro"
- "./certs/:/etc/certs:ro"
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`traefik.home.com`)"
- "traefik.http.routers.traefik.entrypoints=https"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.service=traefik@docker"
- "traefik.http.services.traefik.loadbalancer.server.port=8080"
networks:
- web
networks:
web:
external: trueDentro de la carpeta traefix generamos una carpeta config y agregaremos la configuración necesaria para traefix:
mkrdir config touch config/traefik.yml touch config/dynamic.yml
En los cuales agregaremos la siguiente configuración
#traefik.yml
global:
sendAnonymousUsage: false
api:
dashboard: true
insecure: true
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
watch: true
exposedByDefault: false
file:
filename: /etc/traefik/dynamic.yml
watch: true
log:
level: INFO
format: common
entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
scheme: https
https:
address: ":443"tls:
certificates:
- certFile: "/etc/certs/_wildcard.home.com.pem"
keyFile: "/etc/certs/_wildcard.home.com-key.pem"
- certFile: "/etc/certs/_wildcard.site.com.pem"
keyFile: "/etc/certs/_wildcard.site.com-key.pem"
- certFile: "/etc/certs/_wildcard.local.com.pem"
keyFile: "/etc/certs/_wildcard.local.com-key.pem"Dentro de la carpeta traefix ejecutámos:
docker compose up -d
Con esto ya tendriamos nuestro proxy para dominios locales, solo nos quedaría agregar el host del traefix a /etc/host para poder acceder a traefik.home.com:
127.0.0.1 traefik.home.com
Para montar nuevas aplicaciones con rutas solo debemos agregar a nuestros dockers compose:
labels:
- "traefik.enable=true"
- "traefik.http.routers.mailhog.rule=Host(`mailhog.home.com`)"
- "traefik.http.routers.mailhog.entrypoints=https"
- "traefik.http.routers.mailhog.tls=true"
- "traefik.http.services.mailhog.loadbalancer.server.port=15672"
- "traefik.docker.network=web"A continuación les comparto un docker compose con un grupo de aplicaciones o servicios que uso para el desarrollo día a día, el cual incluye mariadb, redis, rabbitmq y mailog y phpmyadmin:
services:
mariadb:
image: mariadb
restart: unless-stopped
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
networks:
- backend
volumes:
- backend-database:/var/lib/mysql
phpmyadmin:
image: phpmyadmin
restart: unless-stopped
environment:
PMA_HOST: mariadb
PMA_PORT: 3306
UPLOAD_LIMIT: 1G
PHP_INI_SCAN_DIR: /usr/local/etc/php/conf.d
networks:
- backend
- web
labels:
- "traefik.enable=true"
- "traefik.http.routers.phpmyadmin.rule=Host(`phpmyadmin.home.com`)"
- "traefik.http.routers.phpmyadmin.entrypoints=https"
- "traefik.http.routers.phpmyadmin.tls=true"
- "traefik.http.services.phpmyadmin.loadbalancer.server.port=80"
- "traefik.docker.network=web"
redis:
image: redis:7
container_name: redis
restart: unless-stopped
ports:
- "6379:6379"
networks:
- backend
rabbitmq:
image: rabbitmq:3-management
container_name: rabbitmq
restart: unless-stopped
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}
ports:
- "5672:5672"
- "15672:15672"
networks:
- backend
- web
labels:
- "traefik.enable=true"
- "traefik.http.routers.rabbitmq.rule=Host(`rabbitmq.home.com`)"
- "traefik.http.routers.rabbitmq.entrypoints=https"
- "traefik.http.routers.rabbitmq.tls=true"
- "traefik.http.services.rabbitmq.loadbalancer.server.port=15672"
- "traefik.docker.network=web"
mailhog:
image: mailhog/mailhog
container_name: mailhog
restart: unless-stopped
ports:
- "8025:8025"
labels:
- "traefik.enable=true"
- "traefik.http.routers.mailhog.rule=Host(`mailhog.home.com`)"
- "traefik.http.routers.mailhog.entrypoints=https"
- "traefik.http.routers.mailhog.tls=true"
- "traefik.http.services.mailhog.loadbalancer.server.port=15672"
- "traefik.docker.network=web"
networks:
- web
- backend
volumes:
backend-database:
networks:
backend:
external: true
web:
external: trueRecuerde que debe crear .env al lado de este docker compose para los usuarios rabbitmq y mariadb:
MYSQL_ROOT_PASSWORD=
MYSQL_DATABASE=
MYSQL_USER=
MYSQL_PASSWORD=
RABBITMQ_USER=
Además de agregar al host, los dominios del docker compose.
127.0.0.1 mailhog.home.com 127.0.0.1 phpmyadmin.home.com 127.0.0.1 rabbitmq.home.com
Puede agregar nuevos servicios o eliminar en dependencia de las necesidades de su entorno base.
Espero este contenido les sea de utilidad.
Referencias:
https://dev.to/agusrdz/setting-up-traefik-and-mkcert-for-local-development-48j5
Deja un comentario: