Docker: Gérer des domaines personnalisés avec Traefik
Cette documentation fait partie du guide Routage HTTPS. Consultez le guide complet ici : Comment gérer le routage HTTP et le chiffrement TLS (HTTPS) dans vos conteneurs Docker.
👋 Bienvenue sur la documentation de Stackhero !
Stackhero propose une solution Docker cloud CaaS (Containers as a Service) prête à l'emploi qui offre de nombreux avantages, notamment :
- Déployez facilement vos conteneurs en production avec un simple
docker-compose up.- Nom de domaine personnalisable sécurisé en HTTPS (par exemple, https://api.votre-entreprise.com, https://www.votre-entreprise.com, https://backoffice.votre-entreprise.com).
- Performance optimale et sécurité renforcée grâce à une VM privée et dédiée.
- Mises à jour simplifiées en un clic.
Gagnez du temps et simplifiez-vous la vie : il suffit de 5 minutes pour essayer la solution Docker CaaS cloud hosting de Stackhero et déployer vos conteneurs en production !
Dans l'exemple précédent, nous avons utilisé le domaine par défaut <XXXXXX>.stackhero-network.com. En pratique, vous utiliserez probablement vos propres domaines d'entreprise ou de projet, comme www.my-company.com ou api.my-project.io. La section ci-dessous explique comment configurer des domaines personnalisés.
Configurer votre premier domaine avec Traefik
Dans cet exemple, vous allez configurer le domaine api.my-project.io. Remplacez my-project.io par un domaine que vous possédez et api par le sous-domaine de votre choix.
Commencez par mettre à jour la configuration DNS de votre domaine afin que api.my-project.io pointe vers votre domaine <XXXXXX>.stackhero-network.com.
- Connectez-vous à votre fournisseur de domaine et accédez à la configuration DNS.
- Créez une nouvelle entrée nommée
api(ou un autre sous-domaine de votre choix), définissez son type surCNAMEet indiquez<XXXXXX>.stackhero-network.comcomme destination.
Exemple de configuration DNS sur l'interface Cloudflare DNS
Une fois le DNS configuré, vous pouvez le valider en exécutant :
host api.my-project.io
Vous devriez obtenir une réponse similaire à :
api.my-project.io is an alias for <XXXXXX>.stackhero-network.com
La propagation DNS peut prendre jusqu'à 24 heures selon votre fournisseur. Si la commande
hostne retourne pas la réponse attendue, patientez et réessayez plus tard.
Ensuite, mettez à jour votre fichier docker-compose.yml avec la configuration suivante :
services:
api:
image: traefik/whoami
hostname: api
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.my-project.io`)" # Ajoutez votre domaine ici
- "traefik.http.services.api.loadbalancer.server.port=<PORT>" # Remplacez "<PORT>" par le port sur lequel votre API écoute
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
N'oubliez pas de remplacer
api.my-project.iopar votre domaine réel dans le label TraefikHost.
Déployez votre conteneur avec :
docker-compose up -d
Puis rendez-vous sur https://api.my-project.io. Vous devriez voir une page texte affichant le nom d'hôte de votre conteneur api.
Preuve que Traefik gère notre trafic HTTP avec chiffrement TLS pour notre nouveau domaine
Lors de la première création du conteneur, la génération des certificats TLS peut prendre quelques secondes. Si vous rencontrez une erreur TLS, attendez quelques secondes puis actualisez la page pour laisser le temps aux certificats d'être générés.
Félicitations, vous venez de configurer votre premier domaine personnalisé !
Comment rediriger un sous-domaine "www" vers votre domaine racine avec Traefik
Lorsque vous définissez une URL de site web comme my-company.com, il est recommandé de configurer également un sous-domaine "www". Cela permet aux utilisateurs qui se connectent via www.my-company.com d'être redirigés vers votre site principal et d'éviter les problèmes de contenu dupliqué.
Dans l'exemple ci-dessous, my-company.com et www.my-company.com sont tous deux pris en charge. Les utilisateurs accédant à www.my-company.com sont redirigés vers my-company.com :
services:
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`) || Host(`www.my-company.com`)" # Ajoutez les deux domaines ici
- "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # Remplacez "<PORT>" par le port sur lequel votre frontend écoute
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Redirige 'www.my-company.com' vers 'my-company.com' :
- 'traefik.http.routers.frontend.middlewares=redirect-www'
- "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)"
- "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}"
- "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
Router un chemin vers un conteneur spécifique avec Traefik
Supposons que vous ayez un conteneur dédié à votre site de documentation. Vous pouvez vouloir router https://my-company.com/docs vers ce conteneur, tout en envoyant les autres requêtes, comme https://my-company.com/, vers votre conteneur frontend. L'exemple ci-dessous montre comment procéder :
services:
documentations:
image: traefik/whoami
hostname: documentations
labels:
- "traefik.enable=true"
- "traefik.http.routers.documentations.rule=Host(`my-company.com`) && PathPrefix(`/docs`)" # Définissez ici le préfixe de chemin
- "traefik.http.services.documentations.loadbalancer.server.port=<PORT>" # Remplacez "<PORT>" par le port de votre conteneur documentation
- "traefik.http.routers.documentations.tls.certresolver=letsencrypt"
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`) || Host(`www.my-company.com`)"
- "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # Remplacez "<PORT>" par le port sur lequel votre frontend écoute
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Redirige 'www.my-company.com' vers 'my-company.com' :
- 'traefik.http.routers.frontend.middlewares=redirect-www'
- "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)"
- "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}"
- "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
Désormais, accéder à https://my-company.com/docs (ou à tout sous-chemin comme https://my-company.com/docs/something) affichera le contenu du conteneur documentations. Les autres chemins, par exemple https://my-company.com/help, seront servis par le conteneur frontend.
Définir un port de conteneur personnalisé dans Traefik
Par défaut, Traefik se connecte au premier port exposé du conteneur. Dans certains cas, vous pouvez avoir besoin de spécifier un port particulier. L'exemple ci-dessous montre comment définir un port personnalisé :
services:
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`)"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Route le trafic de 'https://my-company.com' vers le conteneur 'frontend' sur le port 80
- "traefik.http.services.frontend.loadbalancer.server.port=80"