L'idée est de lancer le registry en dehors du Swarm, pour simplifier un peu l'exercice
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 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
Construit et démarre les services définis dans le docker-compose.yml
docker compose up --build -d
On attaque swarm !
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.
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".
Connecte-toi au registre Docker en utilisant HTTP.
docker login -u admin -p admin http://51.38.178.163:5023
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
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.)
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
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é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
Supprime la stack du Swarm.
docker stack rm tp8stack