\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. ## Spécifications 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, `docker` utilise `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 à proprement parler, il fait seulement en sorte d'atteindre l'état voulu par cette spécification, avant de passer la main à `runc`. ::::: {.question} ##### Si `docker` fait appel à un programme externe pour lancer effectivement nos conteneurs, c'est que l'on peut changer cette implémentation ? {-} Oui ! Et il n'y a même pas besoin de faire beaucoup d'efforts, car c'est une possibilité qui est offerte au travers d'une option du daemon Docker. Le binaire doit simplement avoir la même interface de ligne de commande que `runc` (les arguments `create` et `start`, nous les verrons plus tard). Pour l'ajouter, il convient de passer l'option suivante au daemon Docker lors de son lancement (dans le fichier de service `systemd`, ou d'`init`) :