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"
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 :
NB : Remplacez l'IP et le PORT de votre machine / VPS !
Redémarre Docker pour appliquer la nouvelle configuration.
Lancement du registre
Construit et démarre les services définis dans le docker-compose.yml
Swarm
On attaque swarm !
Initialisation
Initialise le Swarm sur ce nœud manager. Docker recommande d'utiliser le port 2377.
Vérifie l'état des nœuds du Swarm
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.
Fichier HTML (html/index.html)
Contenu de base affichant "ping".Connexion au registre
Connecte-toi au registre Docker en utilisant HTTP.
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.
# 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.
Affiche l'état des tâches du service pour vérifier le scaling.
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".
Pousse la nouvelle image sur le registre.
Met à jour le service du Swarm pour utiliser la nouvelle image (v1.1).
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.
Fin :)
Supprime la stack du Swarm.