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
|
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
|
|
|
|
|
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,
|
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
|
|
|
|
|
|
|
|
|
|
2018-11-15 22:38:25 +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 :
|
2018-11-16 01:38:41 +00:00
|
|
|
|
|
|
|
|
|
<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
|
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">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
|
|
|
|
runc spec
|
2018-11-15 22:38:25 +00:00
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
2021-09-23 00:55:18 +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
|
|
|
|
|
|
|
|
|
## Test brut
|
|
|
|
|
|
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">
|
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
|
2021-09-23 00:55:18 +00:00
|
|
|
|
journaux, etc. :
|
2018-11-15 22:38:25 +00:00
|
|
|
|
|
|
|
|
|
<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
|
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">
|
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
|
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
|
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
|
|
|
|
|
2020-09-14 13:46:13 +00:00
|
|
|
|
À vous maintenant d'éditer votre `config.json`, pour lancer le service youp0m.
|
2018-11-13 04:39:04 +00:00
|
|
|
|
|
2020-09-14 13:46:13 +00:00
|
|
|
|
Dans un premier temps, assurez-vous de pouvoir télécharger et d'assembler
|
|
|
|
|
rapidement les couches du conteneur.
|
|
|
|
|
|
|
|
|
|
À 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-02-24 19:43:43 +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.
|