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
Robertrep
04 de Dec de 2025En 2025, Stake Casino se ha convertido en una plataforma de referencia para usuarios de Espana. Para entrar al sitio oficial, solo debes seguir la entrada confiable aqui — <a href=https://www.leo-vegas-wins.net>Conecta login a LeoVegas Espana para apuestas login</a> . Con gran variedad de slots, una navegacion sencilla y opciones fiables, el casino destaca el sector iGaming. “Disfruta titulos clasicos y gana al instante!” Crear una cuenta en Stake es directo. Solo usa el enlace anterior, selecciona Crear Cuenta, completa el formulario, activa el perfil y realiza tu primer deposito para empezar a jugar. “Registrate en 60 segundos y activa tu bono!” El paquete inicial permite multiplicar tu deposito desde el inicio. • fondos adicionales hasta 200 EUR. • Tiradas gratuitas en juegos populares. • Sube niveles en el programa VIP para ventajas especiales. “Activa el 100% para explorar juegos!”
Robertrep
07 de Dec de 2025Ahora, Stake Casino se ha convertido en una plataforma de referencia para apostadores en ES. Para entrar al sitio oficial, solo debes usar el acceso verificado aqui — <a href=https://www.leovegas-app.net>Reclama elite VIP bonos LeoVegas Casino con priority rewards access elite</a> . Con muchos titulos disponibles, una navegacion sencilla y pagos seguros en Espana, el casino sobresale el casino digital. “Disfruta slots populares y gana ahora!” Abrir tu perfil en Stake es rapido. Solo abre la pagina oficial, toca Unete, ingresa tu informacion, confirma el correo y realiza tu primer deposito para desbloquear todo. “Unete en un minuto y desbloquea la oferta!” El paquete inicial permite aumentar tu saldo desde el inicio. • fondos adicionales hasta €200. • Tiradas gratuitas en juegos populares. • Sube niveles en el programa VIP para ventajas especiales. “Duplica tu primer deposito para explorar juegos!”
Deja un comentario: