virli/tutorial/docker-internals/runc.md

149 lines
3.9 KiB
Markdown
Raw Normal View History

2018-11-13 04:39:04 +00:00
`runc`
2022-11-15 21:34:03 +00:00
------
2018-11-13 04:39:04 +00:00
2018-11-15 22:38:25 +00:00
`runc` est le programme qui est responsable de la création effective du
2021-09-23 00:55:18 +00:00
conteneur : c'est lui qui va mettre en place toute la machinerie, les points de
2020-09-14 13:46:13 +00:00
montages ou volumes, ... Attention, son rôle reste limité à la mise en place de
l'environnement conteneurisé, ce n'est pas lui qui télécharge l'image, ni fait
l'assemblage des couches de système de fichiers, entre autres.
2018-11-13 04:39:04 +00:00
Aujourd'hui, le lancement de conteneur est fait avec `runc`, mais il est
2018-11-15 22:38:25 +00:00
parfaitement possible d'utiliser n'importe quel autre programme à sa place, à
partir du moment où il expose la même interface à Docker et qu'il accepte les
*bundle* OCI.
2018-11-13 04:39:04 +00:00
2018-11-15 22:38:25 +00:00
Pour appréhender l'utilisation de `runc` sans l'aide de Docker, nous allons
essayer de lancer un shell `alpine` avec un volume dans notre home.
2018-11-13 04:39:04 +00:00
2022-11-15 21:34:03 +00:00
### Prérequis
2018-11-13 04:39:04 +00:00
2018-11-15 22:38:25 +00:00
Vous devriez avoir le binaire `runc` ou `docker-runc`. Si ce n'est pas le cas,
2021-09-23 00:55:18 +00:00
vous pouvez télécharger la dernière version :
2022-02-24 19:43:43 +00:00
<https://github.com/opencontainers/runc/releases>.
2018-11-13 04:39:04 +00:00
2022-11-15 21:34:03 +00:00
### Extraction du rootfs
2018-11-13 04:39:04 +00:00
2022-02-24 19:43:43 +00:00
À l'aide du script d'extraction de registre déjà réalisé, extrayons le
*rootfs* d'alpine : `library/alpine` dans le registre Docker.
2018-11-15 22:38:25 +00:00
2020-10-28 22:16:34 +00:00
Si vous n'avez pas eu le temps de terminer le script d'extraction, vous pouvez
2021-09-23 00:55:18 +00:00
utiliser :
<div lang="en-US">
```bash
docker image save alpine | tar xv -C rootfs
```
</div>
2018-11-15 22:38:25 +00:00
2022-11-15 21:34:03 +00:00
### Modèle de configuration
2018-11-15 22:38:25 +00:00
L'écriture complète d'un fichier `config.json` pour `runc` est plutôt
fastidieux et répétitif, nous allons donc gagner du temps et utiliser la
2021-09-23 00:55:18 +00:00
commande suivante, qui nous créera un modèle que nous adapterons un peu :
2018-11-15 22:38:25 +00:00
<div lang="en-US">
```bash
runc spec
2018-11-15 22:38:25 +00:00
```
</div>
2022-05-04 09:18:16 +00:00
Pour savoir à quoi correspondent tous ces éléments, vous pouvez consulter :\
2018-11-15 22:38:25 +00:00
<https://github.com/opencontainers/runtime-spec/blob/master/config.md>
2022-02-24 19:43:43 +00:00
Rassurez-vous, il n'y a que très peu de champs à modifier.
2018-11-15 22:38:25 +00:00
2022-11-15 21:34:03 +00:00
### Test brut
2018-11-15 22:38:25 +00:00
2021-09-23 00:55:18 +00:00
Voici comment nous pouvons tester le fonctionnement de notre *bundle* :
2018-11-15 22:38:25 +00:00
<div lang="en-US">
```
42sh$ ls
rootfs/ config.json
2018-11-15 22:38:25 +00:00
42sh# runc run --bundle . virli1
/ # _
2018-11-15 22:38:25 +00:00
```
</div>
Quelques informations sont disponibles, mais il ne faut pas s'attendre à
retrouver tout l'écosystème de `docker` ; ici il n'y a pas de gestion des
2021-09-23 00:55:18 +00:00
journaux, etc. :
2018-11-15 22:38:25 +00:00
<div lang="en-US">
```bash
42sh# runc list
ID PID STATUS BUNDLE CREATED OWNER
virli1 12345 running /tmp/work/runctest 2012-12-12T12:12:12.123456789Z root
2018-11-15 22:38:25 +00:00
42sh# runc state virli1
...
2018-11-15 22:38:25 +00:00
```
</div>
2022-11-15 21:34:03 +00:00
### Attacher notre `home`
2018-11-15 22:38:25 +00:00
Dans le modèle de `config.json`, il y a déjà de nombreux systèmes de fichiers
2021-09-23 00:55:18 +00:00
qui sont montés. Nous pouvons les filtrer avec :
2018-11-15 22:38:25 +00:00
<div lang="en-US">
```bash
42sh$ jq .mounts config.json
2018-11-15 22:38:25 +00:00
```
```json
[
{
"destination": "/proc",
"type": "proc",
"source": "proc"
},
[...]
2018-11-15 22:38:25 +00:00
```
</div>
Pour avoir notre équivalent du `-v /home:/home` de `docker`, il va donc falloir
2021-09-23 00:55:18 +00:00
ajouter un élément à cette liste, demandant de *bind* :
2018-11-13 04:39:04 +00:00
2018-11-15 22:38:25 +00:00
<div lang="en-US">
```json
{
"destination": "/home",
"type": "none",
"source": "/home",
"options": [
2018-11-15 22:38:25 +00:00
"bind",
"ro"
]
}
2018-11-15 22:38:25 +00:00
```
</div>
2018-11-13 04:39:04 +00:00
::::: {.exercice}
2018-11-13 04:39:04 +00:00
2022-11-27 09:56:56 +00:00
À vous maintenant d'éditer votre `config.json`, pour lancer le service `youp0m`.
2018-11-13 04:39:04 +00:00
2022-11-16 19:22:54 +00:00
Dans un premier temps, assurez-vous de pouvoir télécharger et assembler
2022-11-27 09:56:56 +00:00
rapidement les couches du conteneur (elles seront placées dans le dossier
`rootfs`).
2020-09-14 13:46:13 +00:00
À partir du fichier `config.json` fourni, adaptez la ligne de commande à lancer
et le dossier courant par défaut (`cwd`). Pensez également à faire un volume
entre un dossier de votre home (ou temporaire, peu importe), afin de pouvoir
stocker les photos (dossier `/srv/images`)[^chmod].
[^chmod]: faites attention aux droits du dossier que vous partagez. Le plus
simple pour l'instant serait d'attribuer les permissions `0777` à la
source, temporairement.
2022-11-16 19:22:54 +00:00
Pour cette étape, considérez que vous avez réussi si vous voyez s'afficher :
2020-09-14 13:46:13 +00:00
2021-09-23 00:55:18 +00:00
> `Ready, listening on :8080`
2020-09-14 13:46:13 +00:00
2022-02-24 19:43:43 +00:00
On ne pourra pas tester davantage sans avoir du réseau dans notre conteneur.
:::::