virli/tutorial/docker-internals/runc.md

138 lines
3.2 KiB
Markdown
Raw Normal View History

2018-11-13 04:39:04 +00:00
\newpage
`runc`
======
2018-11-15 22:38:25 +00:00
`runc` est le programme qui est responsable de la création effective du
conteneur : c'est lui qui va mettre en place les *namespaces*, les
*capabilities*, les points de 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
2018-11-15 22:38:25 +00:00
Aujourd'hui, le lancement de conteneur est faite avec `runc`, mais il est
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
2018-11-15 22:38:25 +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,
vous pouvez télécharger la dernière version :
<https://github.com/opencontainers/runc/releases>. La 1.0.0-rc5 est Ok.
2018-11-13 04:39:04 +00:00
2018-11-15 22:38:25 +00:00
## Extraction du rootfs
2018-11-13 04:39:04 +00:00
2018-11-15 22:38:25 +00:00
À l'aide du script réalisé dans la partie précédentes, extrayons le rootfs
d'alpine : `library/alpine` dans le registre Docker.
Si vous n'avez pas eu le temps de terminer l'exercice précédent, vous pouvez
utiliser :
<div lang="en-US">
```bash
docker image save alpine | tar xv -C rootfs
```
</div>
2018-11-15 22:38:25 +00:00
## Modèle de configuration
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
commande suivante, qui nous créera un modèle que nous adapterons un peu :
<div lang="en-US">
```bash
runc spec
2018-11-15 22:38:25 +00:00
```
</div>
Pour savoir à quoi correspondent tous ces éléments, vous pouvez consulter :
<https://github.com/opencontainers/runtime-spec/blob/master/config.md>
## Test brut
Voici comment nous pouvons tester le fonctionnement de notre *bundle* :
<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
journaux, etc. :
<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>
## 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
qui sont montés. Nous pouvons les filtrer avec :
<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
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
2018-11-15 22:38:25 +00:00
Serez-vous capable de continuer l'édition de votre `config.json` afin d'obtenir
les mêmes restrictions que votre projet de moulette ?
2018-11-13 04:39:04 +00:00
* CGroups : 1\ GB RAM, 100\ PIDs, ...
2018-11-13 04:39:04 +00:00
* strict minimum de capabilities ;
2018-11-15 22:38:25 +00:00
* filtres `seccomp` ;
2018-11-13 04:39:04 +00:00
* carte réseau `veth` ;
* ...