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
|
2018-11-16 01:38:41 +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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 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">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```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">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```
|
|
|
|
|
42sh$ ls
|
|
|
|
|
rootfs/ config.json
|
2018-11-15 22:38:25 +00:00
|
|
|
|
|
2018-11-16 01:38:41 +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">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```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
|
|
|
|
|
2018-11-16 01:38:41 +00:00
|
|
|
|
42sh# runc state virli1
|
|
|
|
|
...
|
2018-11-15 22:38:25 +00:00
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
2018-11-16 01:38:41 +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
|
|
|
|
|
qui sont montés. Nous pouvons les filtrer avec :
|
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
|
|
|
|
42sh$ jq .mounts config.json
|
2018-11-15 22:38:25 +00:00
|
|
|
|
```
|
|
|
|
|
```json
|
2018-11-16 01:38:41 +00:00
|
|
|
|
[
|
|
|
|
|
{
|
|
|
|
|
"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
|
2018-11-16 01:38:41 +00:00
|
|
|
|
{
|
|
|
|
|
"destination": "/home",
|
|
|
|
|
"type": "none",
|
|
|
|
|
"source": "/home",
|
|
|
|
|
"options": [
|
2018-11-15 22:38:25 +00:00
|
|
|
|
"bind",
|
|
|
|
|
"ro"
|
|
|
|
|
]
|
2018-11-16 01:38:41 +00:00
|
|
|
|
}
|
2018-11-15 22:38:25 +00:00
|
|
|
|
```
|
|
|
|
|
</div>
|
2018-11-13 04:39:04 +00:00
|
|
|
|
|
|
|
|
|
|
2018-11-16 01:38:41 +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
|
|
|
|
|
2018-11-16 01:38:41 +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` ;
|
|
|
|
|
* ...
|