<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Registry on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/registry/</link><description>Recent content in Registry on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 26 Jun 2018 11:45:04 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/registry/index.xml" rel="self" type="application/rss+xml"/><item><title>Harbor : la registry Docker open source de VMware – part 2</title><link>https://blog.zwindler.fr/2018/06/26/decouverte-de-harbor-la-registry-docker-open-source-de-vmware/</link><pubDate>Tue, 26 Jun 2018 11:45:04 +0000</pubDate><guid>https://blog.zwindler.fr/2018/06/26/decouverte-de-harbor-la-registry-docker-open-source-de-vmware/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/10/harbor.webp" alt="Featured image of post Harbor : la registry Docker open source de VMware – part 2" /&gt;&lt;h2 id="harbor-la-registry-docker-de-vmware"&gt;Harbor, la registry Docker de VMware
&lt;/h2&gt;&lt;p&gt;Il y a quelques mois, j’avais écris un article à propos d’une bonne surprise de la part de VMware : Harbor. Pour ceux qui n’ont pas lu mon article sur le sujet, j’ai développé dans la première partie ce qu’était Harbor et ce que cette solution apporte par rapport aux autres outils du marché, puis j’ai expliqué pas à pas comment l’installer et la configurer (&lt;a class="link" href="https://blog.zwindler.fr/2018/02/27/harbor-la-docker-registry-dentreprise-open-source-de-vmware-part-1/" &gt;vous pouvez vous rattraper ici&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Rapidement, Harbor est un des produits open sourcé par VMware. C’est un serveur permettant de stocker « on premise » ou dans le cloud des images Docker, au même titre que le produit historiquement appelé Docker Registry (maintenant &lt;em&gt;Docker Distribution&lt;/em&gt;), mais avec des fonctionnalités supplémentaires, notamment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestion de la sécurités, des comptes, rôles, habilitation (RBAC)&lt;/li&gt;
&lt;li&gt;Réplication des images entre plusieurs instances de Harbor&lt;/li&gt;
&lt;li&gt;Portail web&lt;/li&gt;
&lt;li&gt;Logging de toutes les opérations à des fins d’audit&lt;/li&gt;
&lt;li&gt;API RESTful&lt;/li&gt;
&lt;li&gt;Scan de vulnérabilité intégré&lt;/li&gt;
&lt;li&gt;Nettoyage automatique des images inutiles (garbage collection)&lt;/li&gt;
&lt;li&gt;Intégration native avec Notary pour la signature des images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans cette deuxième partie, j’ai voulu explorer un peu plus l’utilisation et l’administration de la plateforme que nous venons d’installer.&lt;/p&gt;
&lt;h2 id="administration-de-base"&gt;Administration de base
&lt;/h2&gt;&lt;p&gt;Dans l’article précédent, on a installé Harbor à l’aide &lt;a class="link" href="https://github.com/zwindler/ansible-deploy-harbor" target="_blank" rel="noopener"
&gt;d’un Docker Compose et d’Ansible&lt;/a&gt; pour faciliter la récupération de certains prérequis et la configuration des différents composants.&lt;/p&gt;
&lt;h3 id="démarrerarrêter-harbor"&gt;Démarrer/arrêter Harbor
&lt;/h3&gt;&lt;p&gt;Du coup, comme tout est configuré avec docker compose, l’arrêt et le redémarrage de la plateforme se limite à un simple docker-compose up ou down.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker-compose up
[...]
docker-compose down
Stopping nginx ... done
Stopping harbor-jobservice ... done
Stopping harbor-ui ... done
Stopping harbor-db ... done
Stopping registry ... done
Stopping harbor-adminserver ... done
Stopping harbor-log ... done
WARNING: Found orphan containers (notary-server, notary-signer, notary-db) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing nginx ... done
Removing harbor-jobservice ... done
Removing harbor-ui ... done
Removing harbor-db ... done
Removing registry ... done
Removing harbor-adminserver ... done
Removing harbor-log ... done
Removing network harbor_harbor
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="supprimer--réinstaller-harbor"&gt;Supprimer / Réinstaller Harbor
&lt;/h3&gt;&lt;p&gt;Contrairement à ce qu’on pourrait penser naïvement, un simple &lt;strong&gt;docker-compose down&lt;/strong&gt; ne suffit pas. Si les containers sont bien supprimé (cf. le « Removing&amp;hellip; » pour chaque composants plus haut), il reste encore les fichiers de configurations et les données des différents containers, toujours présents sur disques et persistés à l’aide de &lt;strong&gt;volumes Docker&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il est nécessaire de supprimer ces fichiers créés par l’installation précédente, notamment le contenu de &lt;strong&gt;common/config&lt;/strong&gt; et le fichier &lt;strong&gt;secretkey&lt;/strong&gt;. Par défaut, l&amp;rsquo;emplacement de ces fichiers est configuré par le playbook Ansible que je vous ai proposé. &lt;strong&gt;common/config&lt;/strong&gt; est par défaut dans &lt;strong&gt;/usr/local/harbor&lt;/strong&gt;, et la &lt;strong&gt;secretkey&lt;/strong&gt; dans dans &lt;strong&gt;/data&lt;/strong&gt; (configurable dans le fichier &lt;em&gt;/usr/local/harhor/harbor.cfg&lt;/em&gt;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /usr/local/harbor
ll common/config/
total 0
drwxr-xr-x 2 root root 16 20 oct. 11:38 adminserver
drwxr-xr-x 2 root root 16 20 oct. 11:38 db
drwxr-xr-x 2 root root 31 20 oct. 11:38 jobservice
drwxr-xr-x 9 root root 139 20 oct. 11:38 nginx
drwxr-xr-x 3 root root 27 20 oct. 11:38 notary
drwxr-xr-x 2 root root 38 20 oct. 11:38 registry
drwxr-xr-x 2 root root 53 20 oct. 11:38 ui
cat harbor.cfg
[...]
secretkey_path /data
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Voilà donc la bonne méthode pour tout supprimer (maintenant qu’on a vérifié que les chemins configurés correspondent).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker-compose down
rm -rf /usr/local/harbor/common/config/
rm -rf /data/secretkey
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="pousser-push-une-image-depuis-un-client-configuré-vers-la-registry"&gt;Pousser (push) une image depuis un client configuré vers la Registry
&lt;/h2&gt;&lt;p&gt;Pour vous permettre d’organiser un peu vos images et donner des droits plus fins aux utilisateurs, les accès aux images sont découpés via des « projet » dans Harbor.&lt;/p&gt;
&lt;p&gt;Du coup, avant de pousser un image sur la registry, il est nécessaire de « taguer » l’image avec le nom du serveur registry ET son projet associé, au lieu de simplement taguer un nom d’image comme on l’aurait fait normalement avec la Docker Registry.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;REGISTRY=[hostname_de_la_registry]
DOCKER_IMAGE=[your-docker-image]
HARBOR_PROJET=library
docker login https://$REGISTRY
Username: admin
Password:
Login Succeeded
docker tag $DOCKER_IMAGE $REGISTRY/$HARBOR_PROJECT/$DOCKER_IMAGE
docker push $REGISTRY/$HARBOR_PROJECT/$DOCKER_IMAGE
The push refers to a repository [xxx/library/xwiki-tomcat8]
ac33aaa78bac: Pushed
[...]
fe40aaa9465f: Pushed
cf4aaa492384: Pushed
latest: digest: sha256:81b3a60d6936a07e9zzzzzzccb29ead8a1d1035fa5042297ac54f71a6c1e95bb size: 4504
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L’image apparaît sur la console :&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2017/10/harbor_push01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="tirer-pull-une-image-depuis-un-client-configuré"&gt;Tirer (pull) une image depuis un client configuré
&lt;/h2&gt;&lt;p&gt;Même principe que pour le push, il faut être authentifié et sélectionner le projet dans lequel est située l’image&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;REGISTRY=[hostname_de_la_registry]
DOCKER_IMAGE=[your-docker-image]
HARBOR_PROJET=library
docker login https://$REGISTRY
Username: admin
Password:
Login Succeeded
docker pull $REGISTRY/$HARBOR_PROJECT/$DOCKER_IMAGE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tout simplement !&lt;/p&gt;
&lt;h2 id="interface-web--projects"&gt;Interface web : Projects
&lt;/h2&gt;&lt;p&gt;La vue &lt;strong&gt;Projects&lt;/strong&gt; a vocation a permettre la segmentation de la plateforme en plusieurs projets distincts.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_projects01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Chaque projet peut être &lt;em&gt;privé&lt;/em&gt; ou &lt;em&gt;public&lt;/em&gt;, disposer d’habilitations et règles de réplications qui lui sont propres.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_projects02.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="interface-web--logs"&gt;Interface web : Logs
&lt;/h2&gt;&lt;p&gt;La vue &lt;strong&gt;Logs&lt;/strong&gt; permet aux &lt;strong&gt;administrateurs&lt;/strong&gt; d’avoir une vue d’ensemble des logs (pull, push, etc) de TOUS les projets de manière centralisée.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_logs01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_logs02.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Chaque projet peut également voir ses propres logs dans la vue du projet.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_logs03.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Clairement, ce n’est pas transcendant en terme de logging (à des fins d’audit par exemple) mais c’est mieux que rien (Docker Registry&amp;hellip;) et relativement intuitif.&lt;/p&gt;
&lt;h2 id="interface-web-partie-administration"&gt;Interface web, partie Administration
&lt;/h2&gt;&lt;p&gt;Le sous-menu &lt;strong&gt;Users&lt;/strong&gt; permet d’avoir une liste des utilisateurs et de les administrer.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_admin_users01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le sous-menu &lt;strong&gt;Replication&lt;/strong&gt; permet de gérer les endpoints de réplication et la réplication des projets (&lt;em&gt;Replication Rule&lt;/em&gt;) de manière globale.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_admin_replication01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le sous-menu &lt;strong&gt;Configuration&lt;/strong&gt; permet de visualiser et modifier une partie des paramètres généraux de la plateforme. Une partie des ces paramètres proviennent de la configuration &lt;strong&gt;harbor.cfg&lt;/strong&gt; renseignée lors de l’instanciation (via Ansible dans notre cas). Certains ne peuvent pas être changés depuis l’interface (comme la méthode d’authentification par exemple, mais je ne le testerai pas si j’étais vous&amp;hellip;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_admin_configuration01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Par défaut, la création de projets est permis pour tout le monte et l’enregistrement d’utilisateurs est possible. Pour des raisons de sécurité, il est préférable de le désactiver si ce n’est pas nécessaire.&lt;/p&gt;
&lt;h2 id="erreurs-rencontrées"&gt;Erreurs rencontrées
&lt;/h2&gt;&lt;p&gt;Dans l’ensemble, Harbor est un produit sympa et plutôt bien fini, qui étend avec des fonctionnalités vitales en entreprise la bête Docker Registry.&lt;/p&gt;
&lt;p&gt;Pour autant, le produit étant récent, il n’était pas exempt de quelques bugs à sa sortie (en grande partie corrigés depuis). Voilà ceux que j’ai rencontré au moment où j’ai rédigé le premier article (il y a quelques mois maintenant)&lt;/p&gt;
&lt;h3 id="modification-du-secretkey_path"&gt;Modification du secretkey_path
&lt;/h3&gt;&lt;p&gt;Si on modifie le paramètre &lt;strong&gt;secretkey_path&lt;/strong&gt;, le container &lt;strong&gt;harbor-adminserver&lt;/strong&gt; part en crash loop. Le problème est référencé sur ce ticket&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vmware/harbor/issues/2208" target="_blank" rel="noopener"
&gt;github.com/vmware/harbor/issues/2208&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker ps
[...]
7dcd18a310bc vmware/harbor-adminserver:v1.2.0 &amp;#34;/harbor/harbor_ad...&amp;#34; 19 seconds ago Restarting (1) 3 seconds ago harbor-adminserver
docker-compose up
[...]
harbor-adminserver | 2017-10-20T09:56:16Z [INFO] initializing system configurations...
harbor-adminserver | 2017-10-20T09:56:16Z [INFO] the path of json configuration storage: /etc/adminserver/config/config.json
harbor-adminserver | 2017-10-20T09:56:16Z [DEBUG] [driver_json.go:46: path of configuration file: /etc/adminserver/config/config.json]
harbor-adminserver | 2017-10-20T09:56:16Z [INFO] the path of key used by key provider: /etc/adminserver/key
harbor-adminserver | 2017-10-20T09:56:16Z [INFO] configurations read from storage driver are null, will load them from environment variables
harbor-adminserver | 2017-10-20T09:56:16Z [FATAL] [main.go:46: failed to initialize the system: read /etc/adminserver/key: is a directory]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A priori il n’y a pas encore de correctif, la seule solution est de remttre le paramètre &lt;strong&gt;secretkey_path&lt;/strong&gt; à la valeur par défaut&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;secretkey_path /data
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="crash-loop-sur-nginx-lorsquon-utilise-notary"&gt;Crash loop sur nginx lorsqu’on utilise Notary
&lt;/h3&gt;&lt;p&gt;En cas d’installation avec Notary, le container frontend nginx (reverse proxy) part en crashloop&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;nginx | 2017/10/20 10:05:40 [emerg] 1#0: host not found in upstream &amp;#34;notary-server:4443&amp;#34; in /etc/nginx/conf.d/notary.upstream.conf:3
nginx | nginx: [emerg] host not found in upstream &amp;#34;notary-server:4443&amp;#34; in /etc/nginx/conf.d/notary.upstream.conf:3
nginx exited with code 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A priori, il s’agit d’un problème d’ordonnancement du démarrage des containers dans le Docker Compose (notary n’est pas accessible au moment du démarrage du nginx). Un redémarrage du container nginx (uniquement )après le « docker compose up » règle la plupart du temps le problème.&lt;/p&gt;</description></item><item><title>Harbor : la docker registry d’entreprise open source de VMware – part 1</title><link>https://blog.zwindler.fr/2018/02/27/harbor-la-docker-registry-dentreprise-open-source-de-vmware-part-1/</link><pubDate>Tue, 27 Feb 2018 12:45:35 +0000</pubDate><guid>https://blog.zwindler.fr/2018/02/27/harbor-la-docker-registry-dentreprise-open-source-de-vmware-part-1/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/02/harbor.webp" alt="Featured image of post Harbor : la docker registry d’entreprise open source de VMware – part 1" /&gt;&lt;h2 id="harbor-"&gt;Harbor ?
&lt;/h2&gt;&lt;p&gt;Rien à voir avec l’île dans le Pacifique ou l’accord entre les Etats Unis et l’Union Européenne dans les années 90. Le Harbor dont je vais vous parler, c’est la registry Docker d’entreprise et Open Source de VMware !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Harbor est un des produits open sourcé par VMware. C’est un serveur permettant de stocker « on premise » ou dans le cloud des images Docker, au même titre que le produit historiquement appelé Docker Registry (maintenant &lt;em&gt;Docker Distribution&lt;/em&gt;), mais avec des fonctionnalités supplémentaires, notamment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestion de la sécurités, des comptes, rôles, habilitation (RBAC)&lt;/li&gt;
&lt;li&gt;Réplication des images entre plusieurs instances de Harbor&lt;/li&gt;
&lt;li&gt;Portail web&lt;/li&gt;
&lt;li&gt;Logging de toutes les opérations à des fins d’audit&lt;/li&gt;
&lt;li&gt;API RESTful&lt;/li&gt;
&lt;li&gt;Scan de vulnérabilité intégré&lt;/li&gt;
&lt;li&gt;Nettoyage automatique des images inutiles (garbage collection)&lt;/li&gt;
&lt;li&gt;Intégration native avec Notary pour la signature des images&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Rien que ça ;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour ceux que ça intéressent et qui ne savaient pas (comme moi) que VMware met à disposition des logiciels open source, les autres sont disponibles &lt;a class="link" href="https://vmware.github.io/" target="_blank" rel="noopener"
&gt;sur la page Github de VMware&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="petite-étude-du-marché"&gt;Petite étude du marché
&lt;/h2&gt;&lt;p&gt;Je ne vais pas vous faire une analyse poussée du marché de la registry privée, mais si jamais vous cherchez des produits similaires, vous pouvez aller jeter un œil aux produits suivants qui ont attirés mon attention :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/datacenter/dtr/2.3/guides/" target="_blank" rel="noopener"
&gt;Docker Trusted Registry (version entreprise de Docker Distribution)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/user/packages/container_registry/" target="_blank" rel="noopener"
&gt;Gitlab Container Registry, fortement intégré à Gitlab CI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jfrog.com/artifactory/" target="_blank" rel="noopener"
&gt;Artifactory supporte maintenant les containers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://quay.io/plans/?tab=enterprise" target="_blank" rel="noopener"
&gt;Quay de CoreOS, Inc.&lt;/a&gt; (maintenant racheté par Redhat)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et je vous met aussi quelques articles sympas qui parlent de ces différentes solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20180320225423/http://blog.wercker.com/ultimate-guide-to-container-registries" target="_blank" rel="noopener"
&gt;blog.wercker.com/ultimate-guide-to-container-registries (lien mort, racheté et tué par Oracle, retrouvé sur Internet Archive)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://rancher.com/container-registries-might-missed/" target="_blank" rel="noopener"
&gt;rancher.com/container-registries-might-missed/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.codeship.com/overview-of-docker-registries/" target="_blank" rel="noopener"
&gt;blog.codeship.com/overview-of-docker-registries/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="méthode-choisie"&gt;Méthode choisie
&lt;/h2&gt;&lt;p&gt;Ok ! Maintenant qu’on connaît un peu l’écosystème, on peut s’attaquer à la bête. Il existe plusieurs méthodes pour installer Harbor sur une infrastructure « on premise » :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installer Harbor sur un serveur Docker via
&lt;ul&gt;
&lt;li&gt;l’installeur « online » (qui télécharge les images nécessaires sur Dockerhub)&lt;/li&gt;
&lt;li&gt;l’installeur « offline » (qui dispose déjà des images nécessaires)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Déployer une VM VMware via un OVA VIC (VMware vSphere Integated Containers) qui contient &lt;em&gt;entre autre&lt;/em&gt; un serveur Harbor préinstallé et préconfiguré&lt;/li&gt;
&lt;li&gt;Déployer Harbor directement sur un cluster Kubernetes via YAML (option communautaire)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les releases &lt;a class="link" href="https://github.com/vmware/harbor/releases" target="_blank" rel="noopener"
&gt;sont disponibles depuis la page « release » sur le dépôt Github&lt;/a&gt;. &lt;a class="link" href="https://web.archive.org/web/20240410013515/https://customerconnect.vmware.com/en/downloads/#all_products" target="_blank" rel="noopener"
&gt;L’OVA est lui disponible sur myvmware (lien mort, comme tout chez VMware, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;, le site de téléchargement habituel de VMware.&lt;/p&gt;
&lt;p&gt;Dans le cadre de cette article, la méthode d’installation que j’ai choisie est l’installation via les sources en mode « offline » car il m’arrive souvent dans les datacenters de ne pas avoir accès à Internet facilement (pour des raisons de sécurité).&lt;/p&gt;
&lt;h2 id="récupération-des-sources"&gt;Récupération des sources
&lt;/h2&gt;&lt;p&gt;Depuis un poste qui a accès à Internet, on va donc télécharger l’ensemble des fichiers dont nous aurons besoins : le fichier d’installation ainsi que sa signature md5.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -L https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.md5.txt -o harbor-offline-installer-v1.2.0.md5.txt
curl -L https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.tgz -o harbor-offline-installer-v1.2.0.tgz
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;C’est super d’avoir mis un fichier MD5&amp;hellip; mais la comparaison avec la signature ne peut pas être faite telle quelle car un fichier de signature MD5 « valide » doit avoir le nom du fichier indiqué APRÈS la signature en elle même. Ce n’est pas le cas dans le fichier mis à disposition par VMware.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat harbor-offline-installer-v1.2.0.md5.txt
235fcfb9fe00ad61f6cbc2de4920b477
#Un fichier MD5 valide doit contenir &amp;#34;235fcfb9fe00ad61f6cbc2de4920b477 harbor-offline-installer-v1.2.0.tgz&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour pouvoir le comparer sous Linux avec md5sum, on doit recréer un fichier correct avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;file=&amp;#34;harbor-offline-installer-v1.2.0&amp;#34;
md5sum -c &amp;lt;(echo $(&amp;lt;${file}.md5.txt) ${file}.tgz)
harbor-offline-installer-v1.2.0.tgz: Réussi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Source : &lt;a class="link" href="https://unix.stackexchange.com/questions/322286/most-practical-way-to-compare-md5-checksums" target="_blank" rel="noopener"
&gt;Most practical way to compare MD5 checksums sur StackExchange&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="installation-des-prérequis"&gt;Installation des prérequis
&lt;/h2&gt;&lt;p&gt;La documentation d’installation officielle nous indique les dépendances suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;python 2.7+&lt;/li&gt;
&lt;li&gt;docker 1.10+&lt;/li&gt;
&lt;li&gt;docker-compose 1.6+&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depuis un serveur qui a accès à Internet, on va donc récupérer les sources de Docker compose&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous ne trouvez pas que ça commence à être un peu relou toutes ces étapes ?&lt;/p&gt;
&lt;p&gt;Vous le voyez venir ? Quoi donc ?&lt;/p&gt;
&lt;p&gt;Et bien le playbook Ansible pardi !! Pour faciliter cette installation, j’ai écris des rôles Ansible pour automatiser ça ;-)&lt;/p&gt;
&lt;p&gt;Pourquoi ? &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ansible" &gt;Parce que je kiffe Ansible&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ansible-à-la-rescousse"&gt;Ansible à la rescousse
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/zwindler/ansible-deploy-harbor" target="_blank" rel="noopener"
&gt;Tout est sur mon Github&lt;/a&gt;, sauf docker compose et l’installeur d’Harbor évidemment (que vous aurez récupéré lors des étapes précédentes)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /etc/ansible
git clone https://github.com/zwindler/ansible-deploy-harbor
cp /usr/local/bin/docker-compose /etc/ansible/roles/prereqs_harbor/files
cp harbor-offline-installer-v1.2.0.tgz /etc/ansible/roles/install_harbor/files
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et si vous voulez un coup d’œil rapide au fichier principal qui appelle les rôles, voici ce qu’il contient (et les variables qu’il convient de renseigner) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat deploy_harbor.yml
---
# Playbook pour installer Harbor
- name: &amp;#34;Install harbor prerequisites&amp;#34;
hosts: zwindler_linux
vars_prompt:
- name: &amp;#34;db_password&amp;#34;
prompt: &amp;#34;Harbor Database Password&amp;#34;
default: &amp;#34;HarborPassword&amp;#34;
- name: &amp;#34;clair_db_password&amp;#34;
promt: &amp;#34;ClairDB password&amp;#34;
default: &amp;#34;HarborPassword&amp;#34;
- name: &amp;#34;harbor_admin_password&amp;#34;
promt: &amp;#34;Harbor Admin password&amp;#34;
default: &amp;#34;HarborPassword&amp;#34;
vars:
- add_notary: false
- use_https : true
- generate_ssl: true
- harbor_install_path : &amp;#34;/usr/local/&amp;#34;
roles:
- prereqs_harbor
- install_harbor
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas où l’on ne souhaite pas utiliser Notary, la configuration d’Harbor est plus simple et la configuration se fait en HTTP simple. Il est nécessaire de modifier la variable &lt;strong&gt;add_notary&lt;/strong&gt; à &lt;strong&gt;False&lt;/strong&gt; dans le playbook dans ce cas particulier.&lt;/p&gt;
&lt;p&gt;Dans le cas où l’on souhaite utiliser Notary, il est obligatoire de passer en HTTPS et d’avoir un certificat. Si tel est le cas, vous l’avez compris, il faut laisser le paramètre &lt;strong&gt;add_notary&lt;/strong&gt; à &lt;strong&gt;True&lt;/strong&gt; ce qui permettra de gérer ce cas particulier. Pour être honnête, je n’ai pas testé la partie Notary, je ne peux donc pas certifier à 100% que cette partie fonctionne convenablement.&lt;/p&gt;
&lt;p&gt;Enfin, le script Ansible peut générer un certificat autosigné en laissant la variable &lt;strong&gt;generate_ssl&lt;/strong&gt; à &lt;strong&gt;True&lt;/strong&gt;. Il est aussi possible &lt;a class="link" href="https://github.com/goharbor/harbor" target="_blank" rel="noopener"
&gt;d’en générer un à la main en suivant la documentation sur le site de Harbor&lt;/a&gt;. Auquel cas il ne faudra pas oublier de passer le paramètre &lt;strong&gt;generate_ssl&lt;/strong&gt; à &lt;strong&gt;False&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Le playbook déploie Harbor avec une authentification login/mdp stockés dans une base de données interne. Pour tester, c’est pas mal mais évidemment, dans un second temps, il sera opportun de déporter cette authentification à une source de type LDAP ou Active Directory par exemple.&lt;/p&gt;
&lt;p&gt;La première connexion se fait donc avec le login admin et le mot de passe tel que défini lors du déploiement du playbook.&lt;/p&gt;
&lt;p&gt;Une fois connecté, le portail permet d’explorer les projets et de réaliser les configurations complémentaires, telle que la création d’utilisateurs (si on est en mode de stockage « base de données »), la gestion des habilitations, ou la réplication des registries entre elles.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="configurer-un-client"&gt;Configurer un client
&lt;/h2&gt;&lt;p&gt;Comme le playbook est très bien fait (enfin normalement, hahaha), tout s’est bien passé et on peut maintenant configurer son poste client pour qu’il s’authentifie sur la Registry et commence à pousser/tirer des images Docker.&lt;/p&gt;
&lt;p&gt;Si vous êtes en HTTPS, vous aurez besoin sur le poste client du CA autosigné généré lors du déploiement d’Harbor, car la registry est du coup sécurisée. Il devrait être disponible dans &lt;strong&gt;/etc/ssl/ca/&lt;/strong&gt; et dans &lt;strong&gt;/etc/docker/certs.d/[hostname_de_la_registry]/&lt;/strong&gt; et doit être déposé dans &lt;strong&gt;/etc/docker/certs.d/&lt;/strong&gt; du &lt;em&gt;client&lt;/em&gt; depuis lequel on souhaite se connecter :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;scp /etc/docker/certs.d/ca.crt [machine_cliente]:/etc/docker/certs.d/[hostname_de_la_registry]/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois fait, on peut tenter de se connecter sur la registry avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;REGISTRY=[hostname_de_la_registry]
docker login https://$REGISTRY
Username: admin
Password:
Login Succeeded
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;Tadam !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="et-la-suite-"&gt;Et la suite ?
&lt;/h2&gt;&lt;p&gt;Et ben c’est déjà pas mal pour un premier article sur Harbor, non ? Vous venez, sans effort, de déployer une registry privée d’entreprise pour vos images Docker ;-)&lt;/p&gt;
&lt;p&gt;Mais comme vous l’avez sûrement vu dans le titre, ce n’est que la partie 1. J’ai encore plein de choses à vous raconter sur Harbor. La suite au prochain épisode !&lt;/p&gt;</description></item><item><title>[Tutoriel] Premiers pas avec Swarm (FR)</title><link>https://blog.zwindler.fr/2017/01/31/premiers-pas-avec-swarm-fr/</link><pubDate>Tue, 31 Jan 2017 13:00:42 +0000</pubDate><guid>https://blog.zwindler.fr/2017/01/31/premiers-pas-avec-swarm-fr/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/01/docker-swarm.webp" alt="Featured image of post [Tutoriel] Premiers pas avec Swarm (FR)" /&gt;&lt;h2 id="pourquoi-docker-swarm-"&gt;Pourquoi Docker Swarm ?
&lt;/h2&gt;&lt;p&gt;Docker Swarm est une fonctionnalité d’orchestration de clusters Docker initialement développée à part et finalement intégrée à la version 1.12 du moteur Docker. Il est donc nécessaire d’avoir a minima cette version pour pouvoir utiliser Swarm tel que je le présente dans cet article. En effet, dans les versions précédentes, l’installation était beaucoup plus complexe.&lt;/p&gt;
&lt;p&gt;Swarm un orchestrateur de containers Docker relativement « simple ». On va donc pouvoir disposer d’un cluster de machines sur lesquelles seront répartis automatiquement les containers.&lt;br&gt;
A noter cependant, la gestion de la persistance entre nœuds n’est pas inclus dans la fonctionnalité Swarm elle même, qui doit être implémenté à part (via des volumes distribués).&lt;/p&gt;
&lt;p&gt;Swarm convient parfaitement aux contextes &lt;em&gt;stateless&lt;/em&gt;, c’est à dire sans données stockées par le container, mais est moins adapté dans les contextes où la personnalisation des services et la gestion de la persistance (base de données) est importante. Si vous voulez un retour un peu plus argumenté que le mien sur la question, voilà notamment &lt;a class="link" href="https://web.archive.org/web/20171221105814/http://mysqlrelease.com/2016/08/trying-out-mysql-in-docker-swarm-mode/" target="_blank" rel="noopener"
&gt;l’avis de l’équipe MySQL sur la question (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cet article a été rédigé en suivant le tutoriel officiel disponible &lt;a class="link" href="https://docs.docker.com/engine/swarm/swarm-tutorial/" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt; et adapté pour aller un peu plus loin (notamment en ajoutant un registry local pour permettre aux machines coupées d’Internet de fonctionner).&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;h3 id="serveurs"&gt;Serveurs
&lt;/h3&gt;&lt;p&gt;Dans ce tutoriel, je pars du principe que vous disposez de deux nœuds Docker sur lesquels vous avec installé l’OS RHEL 7.2 (ou CentOS). Je me référerai à ces deux nœuds sous les noms suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pocdocker01&lt;/li&gt;
&lt;li&gt;pocdocker02&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J’ai également ajouté un serveur de configuration management (Ansible dans mon cas) avec un repository RPM local et sur lequel nous ajouterons le &lt;em&gt;registry Docker&lt;/em&gt;. Ce serveur n’est pas obligatoire à proprement parler mais je l’avais sous la main et c’est la seule machine qui a accès à Internet. Cette machine aura pour nom « infra01 ».&lt;/p&gt;
&lt;h3 id="préparation-des-machines"&gt;Préparation des machines
&lt;/h3&gt;&lt;p&gt;Depuis infra01, je récupère le dépôt RPM du projet Docker car par défaut RHEL 7.2 embarque une version antérieure de Docker (la 1.10 je crois).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /etc/yum.repos.d/
tee /etc/yum.repos.d/docker.repo &amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
&amp;gt; [dockerrepo]
&amp;gt; name=Docker Repository
&amp;gt; baseurl=https://yum.dockerproject.org/repo/main/centos/7/
&amp;gt; enabled=1
&amp;gt; gpgcheck=1
&amp;gt; gpgkey=https://yum.dockerproject.org/gpg
&amp;gt; EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je met ensuite à jour mon dépôt local de RPM (zwindlerrepo)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /share/zwindlerrepo
yumdownloader docker-engine
createrepo --update .
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous ne savez pas utiliser createrepo et yumdownloader, je vous invite à aller sur le &lt;a class="link" href="https://wiki.centos.org/HowTos/CreateLocalRepos" target="_blank" rel="noopener"
&gt;site des Howtos de CentOS&lt;/a&gt; qui résume plutôt bien le concept.&lt;/p&gt;
&lt;p&gt;Depuis infra01, je me connecte sur les deux serveurs pocdocker01 et 02 pour déposer la clé de mon serveur de configuration management, puis j’éxecute 2 playbooks (un pour configurer les dépôts locaux, l’autre pour installer Docker).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ssh-copy-id root@pocdocker01 #idem pour le 02
#Configuration par défaut repositories, ntp, supervision, firewall, SELinux
ansible-playbook -l pocdocker* /etc/ansible/zwindler_rhel.yml
ansible-playbook -l pocdocker* /etc/ansible/zwindler_docker_linux.yml
cat zwindler_docker_linux.yml
---
# Playbook pour noeud Docker sous RHEL
- name: &amp;#34;Docker RHEL node&amp;#34;
hosts: docker_rhel_nodes
roles:
- docker_linux
cat roles/docker_linux/tasks/main.yml
---
- name: insecure registry - temporary mesure until registry is TLS secured
lineinfile:
state: present
create: yes
dest: /etc/docker/daemon.json
line: &amp;#39;{ &amp;#34;insecure-registries&amp;#34;:[&amp;#34;infra01.zwindler.fr:5000&amp;#34;] }&amp;#39;
- name: install docker engine
yum: name={{ item }} state=latest
with_items:
- docker-engine
- name: start and enable docker engine
systemd: name=docker state=started enabled=yes
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="création-dun-registry-docker-sur-infra01"&gt;Création d’un registry Docker sur infra01
&lt;/h3&gt;&lt;p&gt;Les nœuds pocdocker01 et 02 n’ayant pas accès à Internet, on utilisera le registry sur infra01. Pour cela, le plus simple est de récupérer l’image officielle sur le Dockerhub.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -d -p 5000:5000 --restart=always --name registry registry:2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour les besoins du tutoriel, je récupère l’image alpine par défaut, puis la « push » sur mon registry interne.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker pull alpine
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2 182810e6ba8c 15 hours ago 37.6 MB
alpine latest 0766572b4bac 18 hours ago 4.799 MB
zwindler/xwiki-tomcat 8.4.1 d4a1b1df7349 4 weeks ago 661.2 MB
tomcat 8-jre8 b3e4bba2bff8 5 weeks ago 334.9 MB
docker tag 0766572b4bac infra01.zwindler.fr:5000/alpine
docker push infra01.zwindler.fr:5000/alpine
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, nous avons donc tous nos prérequis pour créer et utiliser notre cluster Docker Swarm (coupé d’Internet).&lt;/p&gt;
&lt;h2 id="mise-en-place-du-cluster"&gt;Mise en place du cluster
&lt;/h2&gt;&lt;h3 id="création-du-cluster"&gt;Création du cluster
&lt;/h3&gt;&lt;p&gt;Dans la topology Swarm, il existe des nœuds &lt;strong&gt;managers&lt;/strong&gt; et des &lt;strong&gt;workers&lt;/strong&gt;. A noter, les commandes liées à Swarm ne peuvent être effectuées que sur les nœuds &lt;strong&gt;managers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Depuis pocdocker01 (manager), on créé le cluster en une simple commande :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker swarm init --advertise-addr 10.0.0.10
Swarm initialized: current node (6zzehbr4ulsld8ofxe09h3djz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-aaaaaaaaaeaxirr7ldxr3ucv4z0q1soddszao7b46ywz9q90-8ofnnub6kl7r39zmophu6qqq7 \
10.0.0.10:2377
To add a manager to this swarm, run &amp;#39;docker swarm join-token manager&amp;#39; and follow the instructions.
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="intégration-du-2ème-noeud"&gt;Intégration du 2ème noeud
&lt;/h3&gt;&lt;p&gt;Depuis pocdocker02 (worker), on rejoint le cluster en copiant collant le résultat de la commande précédente réalisée sur le manager.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker swarm join --token SWMTKN-1-5nufexjdjh6eaxirr7ldxr3ucv4z0q1soddszao7b46ywz9q90-8ofnnub6kl7r39zmophu6qqq7 10.0.0.10:2377
This node joined a swarm as a worker.
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="vérification-de-létat-du-cluster"&gt;Vérification de l’état du cluster
&lt;/h3&gt;&lt;p&gt;Depuis pocdocker01 (manager), on peut vérifier l’état du cluster avec les commandes suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker info
[…]
Swarm: active
NodeID: 6zzehbr4ulslaaaaae09h3djz
Is Manager: true
ClusterID: 7a4lauts8xaaaaaa190tu4jf
Managers: 1
Nodes: 2
[…]
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
6zzehbr4ulsld8ofxe09h3djz * pocdocker01.zwindler.fr Ready Active Leader
a7demo2k14obqp66gbxfsm7er pocdocker02.zwindler.fr Ready Active
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="création-dun-service-orchestré-par-docker"&gt;Création d’un service orchestré par Docker
&lt;/h2&gt;&lt;p&gt;Dans un cluster Swarm, la notion de « service » a été ajoutée. Ce nom englobe un peu plus que le simple container, puisque nous avons également des notions de scaling, &amp;hellip;&lt;/p&gt;
&lt;p&gt;Toutes les commandes relative à la création de services sont donc débutée par l’instruction « docker service &amp;hellip; », et je le rappelle, lancées depuis le manager, qui est le seul à pouvoir avoir les gérer.&lt;/p&gt;
&lt;h3 id="création-dun-service"&gt;Création d’un service
&lt;/h3&gt;&lt;p&gt;Dans cet exemple simple, on va créer un « service » qui ne contente de récupérer notre container alpine disponible sur le registry interne et pinguer indéfiniment docker.com. Puis ensuite, on vérifiera que tout s’est bien passé avec la commande « docker service ls », l’équivalent du « docker ps » pour les services.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker service create --replicas 1 --name helloworld infra01.zwindler.fr:5000/alpine ping docker.com
docker service ls
ID NAME REPLICAS IMAGE COMMAND
26krds5pwpqs helloworld 1/1 infra01.zwindler.fr:5000/alpine ping docker.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut également avoir un peu plus de précision sur le service en cours avec la commande « docker service inspect ».&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker service inspect --pretty helloworld
ID: 21e1ync4fjafudd4e7kzrurag
Name: helloworld
Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: alpine
Args: ping docker.com
Resources:
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="scaling-de-lapplication"&gt;Scaling de l’application
&lt;/h3&gt;&lt;p&gt;Admettons que vous souhaitiez faire plus de pings simultanés sur le site de docker pour une raison ou pour une autre (ce qui je le concède volontiers n’est que modérément utile), vous pouvez très simplement faire un « up-scaling » de vos containers avec la commande « docker service scale ».&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker service scale helloworld=5
helloworld scaled to 5
docker service ps helloworld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
dn46s9z7zcet9iol79ej7e3h3 helloworld.1 alpine pocdocker01.zwindler.fr Running Running 2 minutes ago
1gme311su7osbz7m92hsv5vc3 helloworld.2 alpine pocdocker02.zwindler.fr Running Preparing 21 seconds ago
ew7o5gsszm6585moxf672inlb helloworld.3 alpine pocdocker02.zwindler.fr Running Preparing 21 seconds ago
cwifuygmvlw44pit740n7z50q helloworld.4 alpine pocdocker01.zwindler.fr Running Running 19 seconds ago
bidm8wth2tuxo25z261h87yy4 helloworld.5 alpine pocdocker01.zwindler.fr Running Running 19 seconds ago
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simplissime !&lt;/p&gt;
&lt;h3 id="désactivation-des-capacités-du-noeud-2"&gt;Désactivation des capacités du noeud 2
&lt;/h3&gt;&lt;p&gt;Pour vérifier que notre cluster fonctionne bien ou tout simplement réaliser une maintenance sur un des noeuds en fonctionnement nominal, il est possible de peut passer un noeud hors ligne.&lt;/p&gt;
&lt;p&gt;Les répliquas du services sont alors démarrés sur les nœuds encore disponibles.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker node update --availability drain pocdocker02.zwindler.fr
docker service ps helloworld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
92c4tbremj6iq7h65brs8u42l helloworld.1 infra01.zwindler.fr:5000/alpine pocdocker01.zwindler.fr Running Running about a minute ago
18lwc3j7r1t3uqeij0g0qm701 helloworld.2 infra01.zwindler.fr:5000/alpine pocdocker01.zwindler.fr Running Running 17 seconds ago
9iozodo4q7be4klmib5znh9e0 \_ helloworld.2 infra01.zwindler.fr:5000/alpine pocdocker02.zwindler.fr Shutdown Shutdown 18 seconds ago
6dad19g5m6zd9b7wd9sczs10c helloworld.3 infra01.zwindler.fr:5000/alpine pocdocker01.zwindler.fr Running Running 17 seconds ago
3autcjlnqfe4v6x2gsoov5853 \_ helloworld.3 infra01.zwindler.fr:5000/alpine pocdocker02.zwindler.fr Shutdown Shutdown 18 seconds ago
033idvu5mbo89q05p32nytpg9 helloworld.4 infra01.zwindler.fr:5000/alpine pocdocker01.zwindler.fr Running Running about a minute ago
53x5kbx0su09w2b639hnpcj8v helloworld.5 infra01.zwindler.fr:5000/alpine pocdocker01.zwindler.fr Running Running about a minute ago
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="réactivation-des-capacités-du-nœud-2"&gt;Réactivation des capacités du nœud 2
&lt;/h3&gt;&lt;p&gt;Et on peut bien entendu revenir en arrière :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker node update --availability active pocdocker02.zwindler.fr
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="suppression-du-service"&gt;Suppression du service
&lt;/h3&gt;&lt;p&gt;Et comme je suis sympa, je vous donne la commande pour nettoyer tout ça car je ne pense pas que Docker.com ait besoin que vous le pinguier &lt;em&gt;ad vitam æternam&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker service rm helloworld
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Dans cet article, j’ai essayer de vous montrer à quel point il est simple d’utiliser la fonctionnalité d’orchestration de containers Swarm. Et ça n’a pas toujours été au si simple comme le reconnaissent eux même les gens de Docker :&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2017/01/docker_swarm_before1.12.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut ainsi gérer sur plusieurs machines un ensemble de containers sans se demander où les déposer. Les communications inter-hôtes sont également simplifiée avec l’ajout d’overlay-network qui monte des tunnels VPN entre réseaux virtuels de vos containers. Et enfin, vous pouvez simplement ajouter de nouvelles instances à votre service à la hausse ou à la baisse d’une simple commande.&lt;/p&gt;
&lt;p&gt;Et c’est là un des avantages majeurs de l’orchestration de containers. Au delà de la simple création d’un cluster, on peut adapter en fonction du besoin le nombre de processus en frontend/backend d’une application, pour peut que ce processus soit :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;capable de traiter de manière distribuée les requêtes&lt;/li&gt;
&lt;li&gt;n’ait pas besoin d’être différencié car tous les containers d’un même service sont strictement identiques&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C’est probablement &lt;strong&gt;la&lt;/strong&gt; difficulté pour les applications « classiques ».&lt;br&gt;
A date, il existe encore beaucoup de workloads qui ne sont pas parallélisables et/ou qui nécessitent d’être différenciés. Je pense notamment aux bases de données ou aux applications web qui stockent des fichiers ou des informations de session en interne, qui auront besoin de composants externes supplémentaires pour fonctionner correctement sur ce type d’architectures pour pourvoir être « up-scalés ».&lt;/p&gt;</description></item></channel></rss>