· 9 min read
Déployer vos applications en production sur un cluster Docker Swarm et 3 VPS
Découvrez comment déployer vos applications en production sur un cluster Docker Swarm et 3 VPS de manière simple et rapide.
Introduction
Vous êtes développeur•euse, et vous avez besoin de déployer vos applications en production. Vous vous sentez bloqué•e sur la gestion de votre infrastructure :
-
Un serveur mutualisé ? Pourquoi pas mais c’est pas le plus flexible et le plus performant !
-
Un PaaS ? C’est pratique mais ça peut rapidement coûter cher.
-
Un Kubernetes “as a service” ? C’est une bonne solution, mais vous avez un expert sous la main ?
Et finalement, si je vous disais quand quelques étapes vous pourriez avoir une solution, robuste et performante, avec des coûts prévisibles, oui oui !
Découvrons ensemble comment déployer vos applications en production sur un cluster Docker Swarm et 3 VPS de manière simple et rapide (et sans prise de tête).
C’est quoi Docker Swarm ?
Docker Swarm est une solution d’orchestration native à Docker qui permet de gérer un cluster de machines exécutant des conteneurs Docker de manière centralisée et simplifiée.
En transformant un ensemble de machines en un “Swarm”, Docker Swarm fournit un environnement dans lequel les conteneurs peuvent être déployés de manière hautement disponible, tolérante aux pannes, et extensible.
Les nœuds de ce cluster peuvent être désignés en tant que managers (responsables de la gestion et de l’orchestration) ou workers (qui exécutent les tâches attribuées par les managers).
Grâce à une interface unifiée et des fonctionnalités comme le load balancing, la scalabilité automatique des services et les mises à jour sans interruption (rolling updates), Docker Swarm est une solution idéale pour gérer des applications conteneurisées avec une simplicité d’utilisation et une haute résilience.
Pré-requis
Pour cette démo je vais utiliser 3 VPS Ubuntu 22.O4 chez Hidora avec les configurations suivantes :
- Scalabilité horizontale :
- Min: 1 Cloudlet (128Mo de RAM, 400MHz de CPU)
- Max: 10 Cloudlets (1Go de RAM, 3,2GHz de CPU)
- Facturation à l’usage
- 1 IPv4 Publique
- Pas de SLB
Le tuto fonctionne de la même manière avec d’autres VPS (hormis, la configuration du Firewall Jelastic qui est spécifique à la plateforme Jelastic utilisée par Hidora).
L’un de vos VPS sera votre manager Docker Swarm, je vous invite à choisir celui qui vous convient le mieux 😀.
Firewall Jelastic
Comme nous utilisons des VPS chez Hidora, nous devons configurer un firewall pour autoriser les connexions entrantes et sortantes entre nos VPS sur les ports spécifiques que nous allons utiliser avec Docker Swarm.
Ports
Assurez-vous que les ports suivants sont ouverts dans votre firewall Jelastic :
80
: Port HTTP (uniquement pour le manager Docker Swarm)443
: Port HTTPS (uniquement pour le manager Docker Swarm)22
: Port SSH TCP/UDP2377
: Port Docker Swarm4789
: Port Docker Swarw Overlay Network UDP7946
: Port Docker Swarm Discovery TCP7946
: Port Docker Swarm Discovery UDP
Préparation des VPS
Avant de commencer à déployer notre cluster Docker Swarm, nous allons préparer les VPS en améliorant (très basiquement) leur sécurité et en installant quelques outils nécessaires.
Je vous invite par ailleurs à désactiver la possibilité de connexion SSH à distance sur vos VPS via login/mot de passe et d’utiliser uniquement des clés SSH pour se connecter à vos VPS.
Ce tuto a vocation à vous donner des notions de base pour pouvoir déployer un cluster Docker Swarm sereinement, pas à faire de vous des pros de la sécurité (c’est un métier !).
Connectez-vous en SSH sur chaque VPS et laissez vous guider ✨
Mise à jour des packages et installation de quelques outils
sudo apt update && sudo apt upgrade -y
sudo apt install curl git unzip -y
Configuration d’un Firewall (UFW)
Nous allons utiliser le firewall UFW pour autoriser les connexions entrantes et sortantes entre nos VPS sur les ports spécifiques que nous allons utiliser avec Docker Swarm.
sudo apt install ufw -y
sudo ufw allow OpenSSH
sudo ufw allow 2376/tcp # Docker API port
sudo ufw allow 2377/tcp # Docker Swarm port
sudo ufw allow 7946/tcp # Docker Swarm intra-node communication
sudo ufw allow 7946/udp
sudo ufw allow 4789/udp # Overlay network traffic
sudo ufw allow 80/tcp # HTTP traffic
sudo ufw allow 443/tcp # HTTPS traffic
sudo ufw enable
Configuration de Fail2Ban
Nous allons utiliser Fail2Ban pour bloquer les connexions non autorisées, nous utilsierons la configuration par défaut de Fail2Ban mais sentez-vous libre de la modifier selon vos besoins.
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Configuration de Docker
Passons à une étape cruciale : l’installation de Docker sur nos VPS !
Cette suite de commandes est basée sur la documentation officielle, n’hésitez pas à consulter cette documentation si vous avez des questions, il est possible que certaines commandes ne fonctionnent pas sur votre système.
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
sudo docker run hello-world
Installation de Docker Swarm
Nous VPS sont un peu plus sécurisés, les outils préalable sont installés et nous avons configuré un firewall, le moment est venu de pouvoir installer Docker Swarm 🔥 !
Sur le manager Docker Swarm
L’installation du manager Docker Swarm se fait en une seule commande :
docker swarm init --advertise-addr <ip-address-manager>
Le paramètre
--advertise-addr
permet de définir l’adresse IP publique du manager Docker Swarm. Remplacer<ip-address-manager>
par l’adresse IP Publique de votre VPS.
Sur les workers Docker Swarm
Pour installer les workers Docker Swarm, nous allons utiliser la commande docker swarm join
:
docker swarm join --token <token-manager> <ip-address-manager>:2377
Le paramètre
--token
permet de définir le jeton de connexion du manager Docker Swarm. Remplacer<token-manager>
par le jeton de connexion du manager Docker Swarm fourni lors de l’installation du manager Docker Swarm.
Le paramètre
<ip-address-manager>:2377
permet de définir l’adresse IP Publique et le port 2377 du manager Docker Swarm. Remplacer<ip-address-manager>
par l’adresse IP Publique de votre VPS “manager Docker Swarm”.
Vérification de l’installation
Pour vérifier que tout s’est bien passé, nous pouvons utiliser la commande docker node ls
:
docker node ls
Vous devriez voir l’ensemble de votre cluster Docker Swarm :
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
6ku5trllktjizqbb1k6ahx4a5 nodexxxxxxxxxxxxxxxxxx.sh1.hidora.com Ready Active 27.3.1
cavwrvtgiol0i88i5ahqxa1v1 * nodexxxxxxxxxxxxxxxxxx.sh1.hidora.com Ready Active Leader 27.3.1
he3zp17ps3co8734k0stbtgrm nodexxxxxxxxxxxxxxxxxx.sh1.hidora.com Ready Active 27.3.1
Un Load Balancer pour le cluster Docker Swarm avec Caddy
Dans ce tutoriel, nous allons mettre en place un Load Balancer Caddy pour notre cluster uniquement sur notre manager (Oui c’est un SPOF, n’oubliez pas c’est un tuto de découverte).
Pour que la solution soit pratique au quotidien, nous allons utiliser une image Docker de Caddy qui permet de déclarer vos services via l’utilisation de labels Docker: lucaslorentz/caddy-docker-proxy.
L’idée c’est de pouvoir indiquer à Caddy quel service doit être accessible à partir de quel nom de domaine hyper simplement en utilisant les labels Docker. Caddy se chargera ensuite de rediriger les requêtes vers le service correspondant, et au passage de négocier le certificat SSL avec Let’s Encrypt 🙌
Petite modification des DNS Docker de notre manager
Nous allons modifier la configuration DNS de notre manager pour minimiser les erreurs de négociation de certificats SSL.
sudo nano /etc/docker/daemon.json
Ajouter les lignes suivantes :
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
Puis relancer Docker :
sudo systemctl restart docker
Pour info, le DNS “8.8.8.8” est le DNS Google et le DNS “8.8.4.4” est le DNS Cloudflare.
Mise en place d’un réseau pour nos containers
Nous allons créer un réseau pour que nos containers puissent communiquer avec le load balancer Caddy :
docker network create -d overlay caddy_network
Création du service Docker pour le load balancer Caddy
Perso, j’aime bien me connecter avec VSCode avec l’extension Remote - SSH pour me connecter à mon manager Docker Swarm et manipuler facilement les fichiers.
Créons un fichier compose.yml
pour déclarer notre service Docker :
mkdir -p /srv/docker/caddy
touch /srv/docker/caddy/compose.yml
Ajoutons les lignes suivantes :
services:
caddy:
image: lucaslorentz/caddy-docker-proxy:latest
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- caddy_data:/data
- caddy_config:/config
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
networks:
- caddy_network # Caddy est connecté à ce réseau
networks:
caddy_network:
external: true # Réseau externe partagé
volumes:
caddy_data:
caddy_config:
Et déployez le service Docker :
docker stack deploy -c /srv/docker/caddy/compose.yml caddy
Vérifiez que le service est bien déployé :
docker service ls
Vous devriez voir quelque chose comme :
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
2ndlblde2a3t caddy_caddy replicated 1/1 lucaslorentz/caddy-docker-proxy:latest *:80->80/tcp, *:443->443/tcp
Déployer un service dans notre cluster Docker Swarm
On y est presque ! On va déployer notre premier service Docker dans notre cluster Docker Swarm !
Pour la démo, nous allons uriliser l’image traefik/whoami qui est un service web simple qui affiche des informations sur l’utilisateur connecté. C’est un exemple très simple, mais qui permet de découvrir le fonctionnement de notre cluster Docker Swarm.
Enregistrement DNS
Avant de déployer notre service Docker, vous devez devez créer un enregistrement DNS qui pointe vers l’adresse IP de votre manager Docker Swarm.
Dans mon cas, voci un exemple de domaine whoami.yoandev.co
qui pointe vers l’adresse IP de mon manager Docker Swarm.
whoami.yoandev.co 3600 IN A xxx.xxx.xxx.xxx
Remplacer
whoami.yoandev.co
par votre domaine hyper simplement,3600
est le temps de validité de l’enregistrement DNS etxxx.xxx.xxx.xxx
par l’adresse IP de votre manager Docker Swarm.
Pour checker la propagation de l’enregistrement DNS, j’aime bien utiliser https://dnschecker.org/
Création du service Docker
Créons un fichier compose.yml
pour déclarer notre service Docker :
mkdir -p /srv/docker/whoami
touch /srv/docker/whoami/compose.yml
Ajoutons les lignes suivantes :
services:
whoami:
image: traefik/whoami
deploy:
replicas: 3 # Utilisation de 3 répliques pour tester le load balancing
labels:
- caddy=whoami.yoandev.co # Utiliser ton domaine personnalisé
- caddy.reverse_proxy="{{upstreams 80}}" # Redirection des requêtes vers l'application whoami sur le port 80
networks:
- caddy_network # Connexion au réseau partagé
networks:
caddy_network:
external: true # Assure-toi que ce réseau est déjà créé
Et déployez le service Docker :
docker stack deploy -c /srv/docker/whoami/compose.yml whoami
Attendez quelques secondes et vérifiez dans votre navigateur que vous pouvez accéder à votre service Docker via le domaine whoami.yoandev.co
💫
Bravo 🎉 Vous avez déployé votre premier service Docker dans votre cluster Docker Swarm !
Conclusion
J’espère que cette démo vous a permis de comprendre comment déployer un service Docker dans un cluster Docker Swarm et comment utiliser un Load Balancer pour le faire fonctionner. Ce n’est finalement pas si compliqué que cela pourrait paraître, mais il y a des étapes à suivre pour que tout fonctionne correctement et que le cluster fonctionne bien ✅
Pour rendre votre cluster plus résilient, il est possible de configurer Caddy pour qu’il expose vos services sur chaque nœud du cluster Docker Swarm, ce qui vous permettrez d’utiliser en parralèle un service externe de Load Balancer (comme Cloudflare) qui permettrait de rendre vos services disponibles même en cas de perte de votre manager Docker Swarm.