87 lines
4.0 KiB
Markdown
87 lines
4.0 KiB
Markdown
\newpage
|
||
|
||
Open Container Initiative
|
||
=========================
|
||
|
||
Formée en juin 2015, l'Open Container Initiative (OCI) a pour but d'établir le
|
||
standard commun aux programmes de contenerisation, afin d'éviter une
|
||
fragmentation de l'écosystème.
|
||
|
||
Trois spécifications ont été écrites :
|
||
|
||
- [`runtime-spec`](https://github.com/opencontainers/runtime-spec/blob/master/spec.md#platforms): définis les paramètres du démarrage d'un conteneur ;
|
||
- [`image-spec`](https://github.com/opencontainers/image-spec/blob/master/spec.md): définis la construction, le transport et la préparation des images ;
|
||
- [`distribution-spec`](https://github.com/opencontainers/distribution-spec/blob/master/spec.md): définis la manière dont sont partagées et récupérées les images.
|
||
|
||
|
||
## `runtime-spec`
|
||
|
||
`runc` est l'implémentation de cette spécification ; elle a été extraite de
|
||
`docker`, puis donnée par Docker Inc. à l'OCI.
|
||
|
||
Pour démarrer un conteneur, la spécification indique qu'il est nécessaire
|
||
d'avoir un fichier de configuration `config.json` ainsi qu'un dossier où l'on
|
||
peut trouver la racine de notre conteneur.
|
||
|
||
Le plus gros de la spécification concerne le format de ce fichier de
|
||
configuration : il contient en effet l'ensemble des paramètres avec lesquels il
|
||
faudra créer le conteneur : tant d'un point de vue isolement (on peut par
|
||
exemple choisir de quel *namespace* on souhaite se dissocier, ou le(s)quel(s)
|
||
rejoindre), quelles *capabilities* resteront disponibles, quels nouveaux points
|
||
de montages, ... Voir [la
|
||
suite](https://github.com/opencontainers/runtime-spec/blob/master/config.md).
|
||
|
||
Aujourd'hui, les dernières versions de `docker` utilisent `runc` pour l'étape
|
||
de lancement du conteneur, après avoir téléchargé l'image puis mis en place
|
||
l'empilement de couches dans un répertoire prédéterminé. `docker` ne lance donc
|
||
plus de conteneur a proprement parlé, il fait seulement en sorte d'atteindre
|
||
l'état voulu par cette spécification, avant de passer la main à `runc`.
|
||
|
||
|
||
## `image-spec`
|
||
|
||
Une image OCI est composée d'un manifest, d'une suite de couches de systèmes de
|
||
fichiers, d'une configuration ainsi qu'un index d'image optionnel.
|
||
|
||
Le
|
||
[manifest](https://github.com/opencontainers/image-spec/blob/master/manifest.md)
|
||
est toujours le point d'entrée d'une image : il référence l'emplacement où
|
||
trouver les différents éléments : configuration et couches. Lorsqu'une même
|
||
image a des variations en fonction de l'architecture du processeur, du système
|
||
d'exploitation, ... dans ce cas [l'index
|
||
d'image](https://github.com/opencontainers/image-spec/blob/master/image-index.md)
|
||
est utilisé pour sélectionner le bon manifest.
|
||
|
||
Le format des [couches de système de
|
||
fichiers](https://github.com/opencontainers/image-spec/blob/master/layer.md)
|
||
sont spécifiées : il est nécessaire de passer par des formats standards (comme
|
||
les tarballs), contenant éventuellement des fichiers et dossiers spéciaux
|
||
contenant les modifications, suppressions, ... éventuelles de la couche
|
||
représentée.
|
||
|
||
La
|
||
[configuration](https://github.com/opencontainers/image-spec/blob/master/config.md)
|
||
contient l'ensemble des métadonnées qui serviront par exemple à construire le
|
||
`config.json` attendu par `runc` lorsqu'il faudra lancer l'image (c'est
|
||
là-dedans que finissent toutes les métadonnées que l'on inscrit dans nos
|
||
`Dockerfile` : `CMD`, `VOLUME`, `PORT`, ...). On y retrouve également l'ordre
|
||
des couches du système de fichiers, ainsi que l'historique de l'image.
|
||
|
||
|
||
## `distribution-spec`
|
||
|
||
Dernière née de l'organisme, cette spécification fédère la notion de
|
||
*registre* : une API REST sur HTTP où l'on peut récupérer des images, mais
|
||
aussi en envoyer.
|
||
|
||
|
||
## Pour aller plus loin {-}
|
||
|
||
Si maintenant `docker` fait appel à un programme externe pour lancer
|
||
effectivement nos conteneurs, c'est que l'on peut changer cette
|
||
implémentation ? la réponse dans l'article :\
|
||
<https://ops.tips/blog/run-docker-with-forked-runc/>
|
||
|
||
Et `containerd` dans l'histoire ?\
|
||
<https://hackernoon.com/docker-containerd-standalone-runtimes-heres-what-you-should-know-b834ef155426>
|