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écutersudo update-ca-certificates
.