TP1 ready

This commit is contained in:
nemunaire 2019-10-16 03:54:56 +02:00
parent 9281f01857
commit f909d463ca
16 changed files with 265 additions and 122 deletions

View file

@ -3,12 +3,11 @@
Composition de conteneurs
=========================
## Automatiser la construction et le lancement
## Automatiser le lancement de conteneurs
Au lieu de faire un script pour construire et lancer tous vos conteneurs, nous
allons définir à la racine de notre projet un fichier `docker-compose.yml` qui
contiendra les paramètres d'exécution (et éventuellement les méthodes de
construction).
contiendra les paramètres d'exécution.
<div lang="en-US">
```yaml
@ -137,12 +136,8 @@ Consultez
[la documentation](https://docs.docker.com/compose/compose-file/) pour
une liste exhaustive des options que nous pouvons utiliser.
Une fois que votre `docker-compose.yml` est prêt, lancez tout d'abord
`docker-compose build` pour commencer la phase de build de tous les conteneurs
listés dans le fichier.
Une fois le build terminé, nous pouvons lancer la commande suivante et admirer
le résultat :
Une fois que notre `docker-compose.yml` est prêt, nous pouvons lancer
la commande suivante et admirer le résultat :
<div lang="en-US">
```bash

View file

@ -6,7 +6,7 @@ Lier des conteneurs
Avant de voir des méthodes plus automatiques pour déployer toute notre pile
logicielle TICK, nous allons commencer par mettre en place et lier les
conteneurs manuellement, de la même manière que nous avons pu le faire avec
Owncloud et MySQL.
l'interface d'administration du FIC et MySQL.
## Conteneur central : la base de données
@ -14,7 +14,7 @@ Owncloud et MySQL.
Le premier conteneur qui doit être lancé est la base de données orientée séries
temporelles :
[InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/).
En effet, tous les autres conteneurs on besoin de cette base de données pour
En effet, tous les autres conteneurs ont besoin de cette base de données pour
fonctionner correctement : il serait impossible à *Chronograf* d'afficher les
données sans base de données, tout comme *Telegraf* ne pourrait écrire les
métriques dans une base de données à l'arrêt.
@ -46,8 +46,8 @@ le client fourni :
<div lang="en-US">
```
42sh$ docker container run --rm -it --link mytsdb:influxdb \
> --entrypoint "/usr/bin/influx" influxdb -host influxdb
42sh$ docker container run --rm -it --link mytsdb:influxdb --entrypoint "/usr/bin/influx" \
influxdb -host influxdb
Connected to http://influxdb:8086 version 1.6.3
InfluxDB shell version: 1.6.3
> show databases
@ -74,8 +74,8 @@ docker container logs mytsdb
\hspace{2em}**Exercice :** Ajoutez à la ligne de commande de lancement du
conteneur les bon(s) volume(s) qui permettront de ne pas perdre les données
d'influxDB si nous devions redémarrer le conteneur.
d'influxDB si nous devions redémarrer le conteneur. Aidez-vous pour cela de la
[documentation du conteneur](https://hub.docker.com/_/influxdb).
## Collecter les données locales
@ -108,8 +108,8 @@ Et observons ensuite :
<div lang="en-US">
```bash
42sh$ docker container run --rm -it --link mytsdb:influxdb \
> --entrypoint "/usr/bin/influx" influxdb -host influxdb
42sh$ docker container run --rm -it --link mytsdb:influxdb --entrypoint "/usr/bin/influx" \
influxdb -host influxdb
InfluxDB shell version: 1.6.3
> show databases
name: databases

View file

@ -20,7 +20,10 @@ mettrez en place les *volumes* et *networks* nécessaire au bon fonctionnement
de la stack.
Le résultat final attendu doit permettre d'afficher dans `chronograf` l'hôte
auto-monitoré par la stack, sans plus de configuration.
auto-monitoré par la stack, sans plus de configuration. Vous aurez pour cela
éventuellement besoin de placer des fichiers de configuration à côté de votre
`docker-compose.yml`, afin de pouvoir inclure ces configurations dans les
conteneurs, sans avoir besoin de reconstruire ces conteneurs.
Modalités de rendu
@ -38,6 +41,9 @@ et exclusivement à celle-ci que vous devez envoyer vos rendus. Tout rendu
envoyé à une autre adresse et/ou non signé et/ou reçu après la correction ne
sera pas pris en compte.
Par ailleurs, n'oubliez pas de répondre à
[l'évaluation du cours](https://www.epitaf.fr/moodle/mod/quiz/view.php?id=213).
Tarball
-------
@ -50,11 +56,89 @@ cela dépendra de votre avancée dans le projet) :
<div lang="en-US">
```
login_x-TP2/
login_x-TP2/tick/
login_x-TP2/tick/docker-compose.yml
login_x-TP2/tick/...
login_x-TP1/
login_x-TP1/ficadmin-run.sh
login_x-TP1/docker-compose.yml
login_x-TP1/...
```
</div>
Utilisez la même tarball pour le rendu que pour la partie précédente.
## Signature du rendu
Deux méthodes sont utilisables pour signer votre rendu :
* signature du courriel ;
* signature de la tarball.
Dans les deux cas, si vous n'en avez pas déjà une, vous devrez créer une clef
PGP à **votre nom et prénom**.
Pour valider la signature, il est nécessaire d'avoir reçu la clef publique
**séparément**. Vous avez le choix de l'uploader sur un serveur de clefs, soit
de me fournir votre clef en main propre, soit l'envoyer dans un courriel
distinct.
### Signature du courriel
[Enigmail](https://enigmail.net) est une extension très bien réputée pour
signer ses mails depuis Thunderbird.
Utilisez le service automatique <signcheck@nemunai.re> pour savoir si votre
courriel est correctement signé et que je suis en mesure de vérifier la
signature.
### Astuces
#### No public key
Si vous recevez un rapport avec l'erreur suivante :
<div lang="en-US">
```
[FAIL] Bad signature. Here is the gnupg output:
gpg: Signature made Tue Jan 01 16:42:23 2014 CET
gpg: using RSA key 842807A84573CC96
gpg: requesting key E2CCD99DD37BD32E from hkp server keys.openpgp.org
gpg: Can't check signature: No public key
```
</div>
C'est que votre clef publique n'est pas dans mon trousseau et que les
méthodes de récupération automatique n'ont pas permis de la
trouver. Uploadez votre clef sur [un serveur de
clefs](https://keys.openpgp.org/) ou envoyez un courriel au service
avec votre clef publique en pièce-jointe, avant de retenter votre
rendu.
#### Not explicit username
Si vous recevez un rapport avec l'erreur suivante :
<div lang="en-US">
```
[FAIL] The username of your key is not explicit, I can't find you.
```
</div>
Votre clef ne contient sans doute pas vos noms et prénoms ou l'adresse
électronique associée à la clef n'est pas celle que j'ai dans ma base de
données.
#### I've decided to skip your e-mail
Si vous recevez un rapport concluant ainsi :
<div lang="en-US">
```
After analyzing your e-mail, I've decided to SKIP it.
```
</div>
Cela signifie que la lecture de votre courriel qui a été préférée n'est pas
celle d'un rendu. Vérifiez que vous n'envoyez pas votre clef publique avec
votre rendu.

View file

@ -3,15 +3,15 @@
Mise en place
=============
Durant le premier TP, nous avons installé l'environnement Docker principal, qui
inclut le client, le daemon et toute sa machinerie. Mais le projet Docker
propose de nombreuses autres ressources, souvent directement trouvée dans les
usages de la communauté, et parfois même approprié par Docker.
Dans la première partie du TP, nous avons installé l'environnement Docker
principal, qui inclut le client, le daemon et toute sa machinerie. Mais le
projet Docker propose de nombreuses autres ressources, souvent directement
trouvée dans les usages de la communauté, et parfois même approprié par Docker.
## `docker-compose`
Pour ce TP, nous allons également avoir besoin de `docker-compose`.
Dans cette partie, nous allons avoir besoin de `docker-compose`.
Ce projet ne bénéficie pas d'une intégration au sein du projet Docker et doit
être téléchargé séparément, car originellement, le projet était développé par
@ -33,7 +33,7 @@ tous les scripts. Nous pouvons l'installer en suivant la procédure suivante :
<div lang="en-US">
```bash
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-Linux-x86_64 \
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64 \
> /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
```
@ -54,7 +54,7 @@ Comme avec Docker, nous pouvons vérifier le bon fonctionnement de
<div lang="en-US">
```
42sh$ docker-compose --version
docker-compose version: 1.16.1
docker-compose version: 1.24.1
```
</div>
@ -64,7 +64,7 @@ TP ! Alors n'attendons pas, partons à l'aventure !
## Play With Docker
Tout comme pour le TP précédent, si vous avez des difficultés pour réaliser les
exercices sur vos machines, vous pouvez utiliser le projet
[Play With Docker](https://play-with-docker.com/) qui vous donnera accès à un
bac à sable avec lequel vous pourrez réaliser tous les exercices de ce TP.
Tout comme pour la partie précédente, si vous avez des difficultés pour
réaliser les exercices sur vos machines, vous pouvez utiliser le projet [Play
With Docker](https://play-with-docker.com/) qui vous donnera accès à un bac à
sable avec lequel vous pourrez réaliser tous les exercices de ce TP.

View file

@ -1,23 +1,24 @@
---
title: Virtualisation légère -- TP n^o^ 2.2
subtitle: Aller plus loin avec Docker
title: Virtualisation légère -- TP n^o^ 1.2
subtitle: Les bases de Docker -- compose
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA
date: Jeudi 18 octobre 2017
date: Mercredi 2 octobre 2019
abstract: |
Dans cette deuxième partie du TP, nous allons approfondir l'utilisation de
Docker !
Dans cette deuxième partie du TP, nous allons apprendre à déployer
un groupe de conteneurs !
\vspace{1em}
Tous les éléments de ce TP (exercices et projet) sont à rendre à
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2017 à 0
h 42. Consultez la dernière section de chaque partie pour plus d'information
sur les éléments à rendre.
Le TP se termine par un petit projet à rendre à <virli@nemunai.re>
au plus tard le mercredi 16 octobre 2019 à 13 h 42, des questions de
cours sont également à compléter avant cette date sur
Epitaf. Consultez la dernière partie de ce TP pour les modalités.
En tant que personnes sensibilisées à la sécurité des échanges électroniques,
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
faire signer votre clef et n'hésitez pas à [faire signer votre
clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
En tant que personnes sensibilisées à la sécurité des échanges
électroniques, vous devrez m'envoyer vos rendus signés avec votre
clef PGP. Pensez à
[me](https://keys.openpgp.org/search?q=nemunaire%40nemunai.re)
faire signer votre clef et n'hésitez pas à [faire signer la
votre](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
...

View file

@ -1,6 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md installation.md what.md first.md cleaning.md ex-flask.md volumes.md linking.md secrets.md rendu.md
SOURCES = tutorial.md installation.md what.md first.md cleaning.md ex-flask.md volumes.md linking.md
all: tutorial.pdf

View file

@ -65,9 +65,10 @@ docker container prune
```
</div>
On aura tendance à vouloir supprimer tous les objets inutiles d'un seul coup, via :
## `docker-gc`
Vous pouvez également utiliser l'image
[https://github.com/spotify/docker-gc](`docker-gc`) pour effectuer le ménage de
manière automatique, plus fréquemment. Mais attention à vos données !
<div lang="en-US">
```bash
docker system prune
```
</div>

View file

@ -100,7 +100,7 @@ il s'agit des mêmes options\ :
<div lang="en-US">
```bash
docker container run -d -p 8080:8081 nemunaire/youp0m
docker container run -d -p 8081:8080 nemunaire/youp0m
```
</div>
@ -111,6 +111,41 @@ voit bien que ceux-ci ne partagent pas leur système de fichiers : notre
nouvelle instance est encore immaculée.
## Paramètres de lancement
`youp0m` dispose d'une interface d'administration minimaliste, pour modérer les
images soumises. Celle-ci est accessible par mot de passe (ou est désactivée si
aucun identifiant n'est trouvé). L'aide du programme indique que cela est géré
par l'argument `-htpasswd`, mais encore faut-il pouvoir recopier un fichier
créé à l'extérieur du conteneur...
Outre les arguments que l'on peut passer au premier processus du conteneur, la
plupart des images peuvent adapter leur comportement en fonction de variables
d'environnement que l'on passe en paramètre.
Cette bonne pratique est recommandée par <https://12factor.net/>, qui détaille
les raisons qui devraient pousser les développeurs à privilégier les variables
d'environnements aux arguments sur la ligne de commande.
Il se trouve que les conteneurs `youp0m` peuvent créer le fichier `htpasswd`,
s'ils sont démarrés avec les variables d'environnement :
- `YOUP0M_USERNAME` : nom d'utilisateur pour l'administrateur (par défaut admin) ;
- `YOUP0M_PASSWORD` : mot de passe de l'utilisateur.
Pour ajouter une variable d'environnement, cela se passe dans la commande
`run`, en ajoutant une ou plusieurs options `-e` :
<div lang="en-US">
```bash
docker container run -e YOUP0M_PASSWORD=foobar -p 8080:8080 nemunaire/youp0m
```
</div>
Une fois lancé, ce conteneur exposera une interface d'administration à cette
adresse : <http://localhost:8080/admin/>.
## Arrêt des conteneurs et persistance des données
Lorsque l'on souhaite stopper un conteneur lancé en tâche de fond, on utilise

View file

@ -105,7 +105,7 @@ transféré dans le conteneur.
Pour nous en convaincre, nous pouvons tenter d'exécuter un programme qui n'est
pas présent sur notre machine, mais bien uniquement dans le conteneur. Si vous
n'utilisez pas [Alpine Linux](https://www.alpine-linux.org), vous pourriez
n'utilisez pas [Alpine Linux](https://www.alpinelinux.org), vous pourriez
tenter d'utiliser son gestionnaire de paquet `apk`, via :
<div lang="en-US">

View file

@ -46,11 +46,8 @@ correspondant à votre distribution :
<https://docs.docker.com/install/linux/docker-ce/debian/>
### Et Kali Linux alors ?
Kali étant basée sur Debian, référez-vous à la procédure d'installation de
Debian *Jessie or newer*.
**Et Kali Linux alors ?** Kali étant basée sur Debian, référez-vous à
la procédure d'installation de cette distribution.
## Windows et macOS
@ -62,8 +59,8 @@ pourrez interagir avec lui via votre ligne de commande habituelle.
Téléchargez la version correspondante à votre système d'exploitation :
* [Docker for Mac](https://store.docker.com/editions/community/docker-ce-desktop-mac)
* [Docker for Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows)
* [Docker for Mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)
* [Docker for Windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows)
Une fois l'installation terminée, lancez l'application : elle ajoutera une
icône dans la zone de notification, vous permettant de contrôler l'exécution de
@ -76,6 +73,10 @@ Si vous rencontrez des difficultés pour vous lancer, le projet
[Play With Docker](https://labs.play-with-docker.com/) vous donne accès à
un bac à sable dans lequel vous pourrez commencer à faire ce TP.
Il vous faudra disposer [d'un compte
Docker](https://hub.docker.com/signup). Une fois identifié, vous pourrez créer
une nouvelle instance, et vous connecter dessus via SSH.
## Vérifier la bonne marche de l'installation

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View file

@ -20,7 +20,7 @@ partie comment lier deux conteneurs.
## Mise en place du webservice
Nous allons utiliser l'interface d'administration des serveurs du FIC :
[`nemunaire/fic-admin`](https://hub.docker.com/r/nemunaire/fic-admin/).
[`nemunaire/fic-admin`](https://hub.docker.com/r/nemunaire/fic-admin).
En lançant le conteneur avec les mêmes options que `youp0m`, les journaux
indiquent que le service cherche à se connecter à une base de données. Il va
@ -98,29 +98,6 @@ mutuellement se découvrir grâce à un système de résolution de nom basé sur
nom de conteneur.
## Entrer dans un conteneur en cours d'exécution
Dans certaines circonstances, les journaux ne sont pas suffisant pour
déboguer correctement l'exécution d'un conteneur.
<div lang="en-US">
```bash
docker container run mysql
```
</div>
...
<div lang="en-US">
```bash
docker container exec -it /bin/bash
ip ...
```
</div>
Notez qu'il n'est pas possible d'`exec` dans un conteneur éteint, et que si la commande initiale du conteneur se termine, tous les `exec` seront également tués.
## Exercice {-}
À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base
@ -128,31 +105,63 @@ de données.
Ne vous embêtez pas avec les mots de passes des services, initialisez la base
de données avec le nom d'utilisateur et le mot de passe par défaut. Vous les
obtiendrez en lisant l'aide :
obtiendrez en lisant l'aide (et la [documentation de l'image
MySQL](https://hub.docker.com/_/mysql/)) :
<div lang="en-US">
```bash
docker container run --rm -e MYSQL_HOST="tcp(mysql_cntr_name:3306)" nemunaire/fic-admin -help
docker container run --rm -e MYSQL_HOST=mysql_cntr_name nemunaire/fic-admin -help
```
</div>
Notez la définition de la variable d'environnement `MYSQL_HOST`[^12factors],
celle-ci indique le nom du serveur vers lequel le service doit se connecter.
[^12factors]: Lecture intéressante : <https://12factor.net/>
Notez la définition de la variable d'environnement `MYSQL_HOST`, celle-ci
indique le nom du serveur vers lequel le service doit se connecter.
Vous aurez besoin de créer un volume pour stocker la base de données, un réseau
dans lequel vous connecterez la base de données et le conteneur applicatif.
Vous devriez pouvoir déboguer le réseau, au sein d'un conteneur, par exemple en
utilisant :
Une fois le service `fic-admin` lancé, vous pouvez exposer le port 8081, sur
lequel vous devriez voir l'interface d'admin : <http://localhost:8081/>.
Placez les différentes commandes (volumes, réseau, `run`, ...) dans un
script `ficadmin-run.sh`, que vous rendrez à la fin du TP. Vous
devriez pouvoir appeler ce script plusieurs fois, sans que les données
ne soient perdues, entre deux arrêts.
### Exemple d'exécution
<div lang="en-US">
```
42sh$ docker container exec -it ficadmin_cntr_name /bin/bash
(incntnr)# ping mysql_cntr_name
```bash
42sh$ ./ficadmin-run.sh
http://localhost:12345/
42sh$ #docker kill db ficadmin
42sh$ ./ficadmin-run.sh # le script relancera une base de données,
# sans avoir perdu les données
http://localhost:12345/
```
</div>
Une fois le service `fic-admin` lancé, vous pouvez exposer le port 8081, sur
lequel vous devriez voir l'interface d'admin : <http://localhost:8081/>.
### Entrer dans un conteneur en cours d'exécution
Dans certaines circonstances, les journaux ne sont pas suffisant pour déboguer
correctement l'exécution d'un conteneur.
En réalisant l'exercice, vous serez sans doute confronté à des comportements
étranges, que vous ne pourriez comprendre qu'en ayant la main sur le conteneur,
via un shell.
Lorsqu'un conteneur est actif, vous pouvez y lancer un nouveau processus,
notamment un shell par exemple.
<div lang="en-US">
```bash
docker container exec -it ficadmin /bin/bash
(inctnr)$ ping mysql_cntr_name
```
</div>
Notez qu'il n'est pas possible d'`exec` dans un conteneur éteint, et que si la
commande initiale du conteneur se termine, tous les `exec` seront également
tués.

View file

@ -114,16 +114,17 @@ Si vous recevez un rapport avec l'erreur suivante :
gpg: Signature made Tue Jan 01 16:42:23 2014 CET
gpg: using RSA key 842807A84573CC96
gpg: requesting key E2CCD99DD37BD32E from hkp server pool.sks-keyservers.net
gpg: requesting key E2CCD99DD37BD32E from hkp server keys.openpgp.org
gpg: Can't check signature: No public key
```
</div>
C'est que votre clef publique n'est pas dans mon trousseau et que les méthodes
de récupération automatique n'ont pas permis de la trouver. Uploadez votre
clef sur un serveur de clefs (et attendez quelques minutes sa propagation) ou
envoyez un courriel au service avec votre clef publique en pièce-jointe, avant
de retenter votre rendu.
C'est que votre clef publique n'est pas dans mon trousseau et que les
méthodes de récupération automatique n'ont pas permis de la
trouver. Uploadez votre clef sur [un serveur de
clefs](https://keys.openpgp.org/) ou envoyez un courriel au service
avec votre clef publique en pièce-jointe, avant de retenter votre
rendu.
#### Not explicit username

View file

@ -10,14 +10,14 @@ abstract: |
\vspace{1em}
Le TP se termine par un petit projet à rendre à <virli@nemunai.re>
au plus tard le mercredi 16 octobre 2018 à 13 h 42, des questions de
au plus tard le mercredi 16 octobre 2019 à 13 h 42, des questions de
cours sont également à compléter avant cette date sur
Epitaf. Consultez la dernière partie de ce TP pour les modalités.
En tant que personnes sensibilisées à la sécurité des échanges
électroniques, vous devrez m'envoyer vos rendus signés avec votre
clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
[me](https://keys.openpgp.org/search?q=nemunaire%40nemunai.re)
faire signer votre clef et n'hésitez pas à [faire signer la
votre](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
...

View file

@ -74,15 +74,6 @@ docker container run --name mydb --mount source=prod_db,target=/var/lib/mysql \
Lorsque le volume est vide, si des données sont présentes à l'endroit du point
de montage, celles-ci sont recopiées dans le volume.
Si plus tard, vous souhaitez créer un conteneur chargé de faire des
sauvegardes, vous pourriez le lancer comme ceci :
<div lang="en-US">
```bash
docker container run -it --volume-from mydb busybox /bin/bash
```
</div>
## Volumes temporaires
@ -101,3 +92,29 @@ docker container run --mount type=tmpfs,target=/srv/images nemunaire/youp0m
En cas de crash de la machine, le contenu sera perdu, mais il reste
possible d'utiliser `--volume-from` afin de partager le volume avec un
autre conteneur.
## Partage de volumes entre conteneurs
Les volumes sont des espaces détachés des conteneurs, particulièrement utiles
pour mettre à jour ou relancer un conteneur, sans perdre les données. Un autre
intérêt, est de pouvoir partager des fichiers entre plusieurs conteneurs.
Il est ainsi parfaitement possible de lancer deux conteneurs qui partagent le
même volume :
<div lang="en-US">
```bash
docker container run -d --mount source=prod_youp0m,target=/srv/images -p 8080:8080 nemunaire/youp0m
docker container run -d --mount source=prod_youp0m,target=/srv/images -p 8081:8080 nemunaire/youp0m
```
</div>
Dans cet exemple, l'ajout d'une image dans un conteneur, l'ajoutera également
dans le second.
Un exemple plus intéressant serait sur une architecture de micro-services
traitant des fichiers de grande taille : plutôt que de faire passer les
fichiers par un système de message/socket, on peut partager un volume pour
épargner les coûts de transferts inutiles, lorsqu'ils ne changent pas de
machine.

View file

@ -63,8 +63,7 @@ Les registres sont des plates-formes de stockage, publiques ou privées,
contenant des images. Ils permettent de récupérer des images, mais également
d'en envoyer.
Le registre utilisé de base est le [Docker Store](https://store.docker.com/) :
il contient à la fois des images officielles (ubuntu, debian, nginx, ...), des
images créées par des utilisateurs ([Docker Hub](https://hub.docker.com/)),
mais aussi des images de grands éditeurs, payantes, à destination des
entreprises.
Le registre utilisé de base est le [Docker Hub](https://hub.docker.com/) : il
contient à la fois des images officielles (ubuntu, debian, nginx, ...), des
images créées par des utilisateurs, mais aussi des images de grands éditeurs,
payantes, à destination des entreprises.