Développer en local avec Docker

Dans ce guide, je vous propose d’utiliser Docker et Docker Compose pour conteneuriser un environnement de développement local.

Fichiers

Dockerfile

On va créer une image pour notre conteneur mkcert :

FROM alpine:3.20.3 AS build

WORKDIR /mkcert

RUN apk --no-cache add curl
RUN curl -JLO "https://dl.filippo.io/mkcert/v1.4.4?for=linux/amd64" && \
    chmod +x mkcert-v1.4.4-linux-amd64

FROM alpine:3.20.3

COPY --from=build /mkcert/mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert

WORKDIR /root/.local/share/mkcert

CMD mkcert -install && for i in $(echo $DOMAIN | sed "s/,/ /g"); do mkcert $i; done && tail -f -n0 /etc/hosts

dynamic.yml

La configuration TLS pour Traefik, qui va utiliser les certificats générés par mkcert :

tls:
  certificates:
    - certFile: "/etc/certs/_wildcard.localhost.pem"
      keyFile: "/etc/certs/_wildcard.localhost-key.pem"

    - certFile: "/etc/certs/_wildcard.app.localhost.pem"
      keyFile: "/etc/certs/_wildcard.app.localhost-key.pem"

docker-compose.yml

services:
  mkcert:
    platform: linux/amd64
    build: .
    environment:
      - DOMAIN=*.localhost,*.app.localhost
    volumes:
        - mkcert_data:/root/.local/share/mkcert
    labels:
      - "traefik.enable=false"

  traefik:
    image: traefik:latest
    command:
      - "--api"
      - "--providers.docker"
      - "--accesslog=true"
      - "--accesslog.filepath=/var/log/traefik.log"
      - "--pilot.dashboard=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      - "--entrypoints.web.http.redirections.entrypoint.permanent=true"
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - ./dynamic.yml:/etc/traefik/dynamic.yml:ro
      - mkcert_data:/etc/certs:ro
      - traefik_logs:/var/log
    environment:
      - TZ=Europe/Paris
    labels:
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.rule=Host(`traefik.localhost`)"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.tls=true"

volumes:
  mkcert_data:
  traefik_logs:

DNS

Modifier le fichier hosts pour autoriser la résolution des noms :

  • Sous macOS et Linux, /etc/hosts ;
  • Sous Windows, C:\Windows\System32\drivers\etc\hosts.

Ajoutez-y les lignes suivantes :

127.0.0.1        localhost
127.0.0.1        app.localhost

Certificats

Faire confiance aux certificats pour éviter les erreurs dans le navigateur :

  • Sous macOS: ouvrir le fichier .pem avec Keychain Access et ajouter le certificat à la keychain System or Login. Marquer le certificat comme trusted.
  • Sous Windows: exécuter certutil -addstore -f "ROOT" example.com+1.pem depuis un terminal en tant qu’administrateur.
  • Sous Linux: la méthode varie d’une distribution à l’autre. Sous Ubuntu, copier le fichier .pem vers /usr/local/share/ca-certificates/ et exécuter sudo update-ca-certificates.