· 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.

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/UDP
  • 2377 : Port Docker Swarm
  • 4789 : Port Docker Swarw Overlay Network UDP
  • 7946 : Port Docker Swarm Discovery TCP
  • 7946 : 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 et xxx.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.

Back to Blog