Skip to content

Instantly share code, notes, and snippets.

@DamienDabernat
Last active February 19, 2025 15:31
Show Gist options
  • Save DamienDabernat/1fe02993bcbac0005191d69644f42a56 to your computer and use it in GitHub Desktop.
Save DamienDabernat/1fe02993bcbac0005191d69644f42a56 to your computer and use it in GitHub Desktop.

TP8 - Correction

Mettre en place le registry

L'idée est de lancer le registry en dehors du Swarm, pour simplifier un peu l'exercice

Création de la stack

Génère un fichier de mot de passe pour le registre Docker avec l'utilisateur "admin" et le mot de passe "admin"

htpasswd -Bbn admin admin > auth/registry.password

Fichier docker-compose.yml pour déployer un registre privé et son interface utilisateur

services:
  registry:
    image: registry:2  # Utilise l'image officielle du registre Docker (version 2)
    ports:
      - "5023:5000"  # Expose le port 5000 du container sur le port 5023 de l'hôte
    environment:
      - REGISTRY_AUTH=htpasswd  # Active l'authentification par htpasswd
      - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm  # Définit le realm pour l'authentification
      - REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password  # Chemin vers le fichier de mot de passe
    volumes:
      - ./auth:/auth  # Monte le dossier local "auth" pour accéder au fichier de mot de passe
    networks:
      - registry_net  # Connecte ce service au réseau nommé "registry_net"

  registry-ui:
    image: joxit/docker-registry-ui:latest  # Utilise une interface web pour visualiser le registre
    ports:
      - "8080:80"  # Expose le port 80 du container sur le port 8080 de l'hôte
    environment:
      - NGINX_PROXY_PASS_URL=http://registry:5000  # Configure l'URL de base du registre pour l'UI
    depends_on:
      - registry  # Attend que le service "registry" soit opérationnel avant de démarrer
    networks:
      - registry_net  # Connecte ce service au même réseau que le registre

networks:
  registry_net:  # Déclare un réseau personnalisé pour la communication entre les services

Configuration

Configuration du registre non HTTPS : Comme nous ne mettons pas en place de certificat SSL nous devons dire à docker d'autoriser les connexion vers les registres non sécurisé.

Modifie le fichier /etc/docker/daemon.json pour autoriser le registre en HTTP :

{
  "insecure-registries": ["51.38.178.163:5023"] 
}

NB : Remplacez l'IP et le PORT de votre machine / VPS !

Redémarre Docker pour appliquer la nouvelle configuration.

sudo systemctl restart docker

Lancement du registre

Construit et démarre les services définis dans le docker-compose.yml

docker compose up --build -d

Swarm

On attaque swarm !

Initialisation

Initialise le Swarm sur ce nœud manager. Docker recommande d'utiliser le port 2377.

docker swarm init

# Affiche les instructions pour ajouter des workers ou managers au Swarm.

Vérifie l'état des nœuds du Swarm

docker node ls

# Liste les nœuds participants avec leur rôle et statut.

Création d'un Dockerfile d'exemple

Dockerfile : On va créer un petit Dockerfile

# Utilise l'image Nginx basée sur Alpine Linux.
FROM nginx:alpine

# Copie le contenu du dossier 'html' dans le dossier web de Nginx.
COPY html /usr/share/nginx/html

# Déclare le dossier comme un volume pour persister les données.
VOLUME /usr/share/nginx/html

Crée le dossier pour les fichiers HTML.

mkdir html

# Édite ou crée le fichier index.html dans le dossier 'html'.
nano html/index.html

Fichier HTML (html/index.html)

<html>
  <body>
    ping
  </body>
</html>

Contenu de base affichant "ping".

Connexion au registre

Connecte-toi au registre Docker en utilisant HTTP.

docker login -u admin -p admin http://51.38.178.163:5023

Build, tag et push de l'image

Construit l'image Docker en utilisant le Dockerfile.

docker build -t 51.38.178.163:5023/my-nginx:v1.0 .

# Pousse l'image sur le registre.
docker push 51.38.178.163:5023/my-nginx:v1.0

Déploiement du service !

Fichier docker-compose.yml pour déployer le service

services:
  web:
    image: localhost:5023/my-nginx:v1.0    # Spécifie l'image à utiliser
    deploy:
      replicas: 3                         # Déploie 3 instances du service
    ports:
      - "8080:80"                         # Mappe le port 8080 du host sur le port 80 du container
    volumes:
      - ./html-ping:/usr/share/nginx/html  # Monte le dossier local 'html-ping' dans le container

Déploie la stack sur le Swarm en utilisant le fichier de configuration.

docker stack deploy -c docker-compose.yml tp8stack
# Accède au service via le navigateur à l'adresse http://51.38.178.163:8081
# (Assure-toi que le mapping de ports est correct dans le compose ou utilise le port défini.)

Mise à l'échelle

Met à l'échelle le service en définissant 4 réplicas.

docker service scale tp8stack_web=4

Affiche l'état des tâches du service pour vérifier le scaling.

docker service ps tp8stack_web

Mise à jour du Dockerfile et mise à jour de la stack swarm

On veut que le service affiche "pong"

Construit une nouvelle version de l'image (v1.1) avec le nouveau contenu "pong".

docker build -t 51.38.178.163:5023/my-nginx:v1.1 .

Pousse la nouvelle image sur le registre.

docker push 51.38.178.163:5023/my-nginx:v1.1

Met à jour le service du Swarm pour utiliser la nouvelle image (v1.1).

docker service update --image 51.38.178.163:5023/my-nginx:v1.1 tp8stack_web

Attention !! Il faut pensez à mettre le docker-compose.yml à jour lui aussi !

services:
  web:
    image: 51.38.178.163:5023/my-nginx:v1.1
    deploy:
      replicas: 1
    ports:
      - "8086:80"
    volumes:
      - ./html:/usr/share/nginx/html

Vérification

Vérifie l'état des tâches du service pour s'assurer que la mise à jour s'est faite sans interruption.

docker service ps tp8stack_web

Fin :)

Supprime la stack du Swarm.

docker stack rm tp8stack
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment