\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éfinit les paramètres du démarrage d'un conteneur ; - [`image-spec`](https://github.com/opencontainers/image-spec/blob/master/spec.md): définit la construction, le transport et la préparation des images ; - [`distribution-spec`](https://github.com/opencontainers/distribution-spec/blob/master/spec.md): définit 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 variation 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 : Et `containerd` dans l'histoire ?