
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: true
Dentro 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: true
Recuerde 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.
Deja un comentario: