Cómo montar un entorno de desarrollo local con Docker, Traefik y mkcert

Cómo montar un entorno de desarrollo local con Docker, Traefik y mkcert

  • Ruben
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
Antes de comenzar, asegúrate de tener instalados:

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.
  • Desarrollo
  • Guías prácticas
  • Docker
Deja un comentario: