Note exercices, little rework for the book
This commit is contained in:
parent
0794ecaa2b
commit
bbd704d413
29 changed files with 210 additions and 120 deletions
|
@ -68,17 +68,17 @@ depuis un conteneur, par exemple :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
42sh$ docker run -it --rm alpine
|
42sh$ docker run -it --rm alpine
|
||||||
|
|
||||||
(ctnr)# apk add --no-cache acl iputils
|
(ctnr)# apk add --no-cache acl iputils
|
||||||
(1/4) Installing libacl (2.2.53-r0)
|
(1/4) Installing libacl (2.2.53-r0)
|
||||||
(2/4) Installing acl (2.2.53-r0)
|
(2/4) Installing acl (2.2.53-r0)
|
||||||
(3/4) Installing libcap (2.50-r0)
|
(3/4) Installing libcap (2.50-r0)
|
||||||
(4/4) Installing iputils (20210202-r0)
|
(4/4) Installing iputils (20210202-r0)
|
||||||
|
|
||||||
(ctnr)# su -s/bin/ash daemon
|
(ctnr)# su -s/bin/ash daemon
|
||||||
|
|
||||||
(ctnr)$ _
|
(ctnr)$ _
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -87,10 +87,10 @@ tests en retirant le *setuid* :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
(ctnr)# chmod u-s /bin/ping
|
(ctnr)# chmod u-s /bin/ping
|
||||||
|
|
||||||
(ctnr)$ ping epita.fr
|
(ctnr)$ ping epita.fr
|
||||||
ping: socket: Operation not permitted
|
ping: socket: Operation not permitted
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -98,10 +98,10 @@ Puis en ajoutant la *capability* :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```
|
```
|
||||||
(ctnr)# setcap cap_net_raw+p /bin/ping
|
(ctnr)# setcap cap_net_raw+p /bin/ping
|
||||||
|
|
||||||
(ctnr)$ ping epita.fr
|
(ctnr)$ ping epita.fr
|
||||||
PING epita.fr (172.67.156.141) 56(84) bytes of data.
|
PING epita.fr (172.67.156.141) 56(84) bytes of data.
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -200,8 +200,9 @@ du fichier ; et on peut l'afficher dans sa version plus lisible :
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
::::: {.exercice}
|
||||||
|
|
||||||
### Exercice : visualisateur de capabilities d'un processus {-}
|
### Visualisateur de capabilities d'un processus {-}
|
||||||
|
|
||||||
Écrivons maintenant un programme permettant de voir les *capabilities*
|
Écrivons maintenant un programme permettant de voir les *capabilities*
|
||||||
d'un processus :
|
d'un processus :
|
||||||
|
@ -241,6 +242,7 @@ courant.
|
||||||
|
|
||||||
Astuces : `capget(2)`, X-macros, ...
|
Astuces : `capget(2)`, X-macros, ...
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
### Pour aller plus loin {-}
|
### Pour aller plus loin {-}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
::::: {.exercice}
|
||||||
|
|
||||||
### Exercice (obligatoire pour les SRS -- optionnel pour les GISTRE)
|
### Exercice (obligatoire pour les SRS -- optionnel pour les GISTRE)
|
||||||
|
|
||||||
Poursuivons [notre script de monitoring](#script-monitoring) afin d'envoyer nos
|
Poursuivons [notre script de monitoring](#script-monitoring) afin d'envoyer nos
|
||||||
|
@ -85,3 +87,5 @@ particuliers.
|
||||||
42sh$ ./telegraf.sh my_cgroup_name memhog 500
|
42sh$ ./telegraf.sh my_cgroup_name memhog 500
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -79,10 +79,10 @@ l'une de ces trois situations :
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
::::: {.question}
|
|
||||||
Avant d'aller plus loin, notez que les exemples seront donnés pour les deux
|
Avant d'aller plus loin, notez que les exemples seront donnés pour les deux
|
||||||
versions des `cgroup`s à chaque fois.
|
versions des `cgroup`s à chaque fois.
|
||||||
|
|
||||||
|
::::: {.question}
|
||||||
La principale différence entre les deux est la fusion des différents
|
La principale différence entre les deux est la fusion des différents
|
||||||
sous-systèmes au sein d'une même arborescence. Dans la première version, chaque
|
sous-systèmes au sein d'une même arborescence. Dans la première version, chaque
|
||||||
sous-système disposait de sa propre arborescence et il fallait créer les
|
sous-système disposait de sa propre arborescence et il fallait créer les
|
||||||
|
@ -179,11 +179,15 @@ En validant cette commande, nous avons déplacé le processus dans ce groupe, il
|
||||||
n'est alors plus dans aucun autre groupe (pour ce *cgroup*, il ne bouge pas
|
n'est alors plus dans aucun autre groupe (pour ce *cgroup*, il ne bouge pas
|
||||||
dans les autres *cgroup*s).
|
dans les autres *cgroup*s).
|
||||||
|
|
||||||
|
::::: {.question}
|
||||||
|
|
||||||
Malgré l'utilisation de la redirection `>` (et non `>>`), il s'agit bel et
|
Malgré l'utilisation de la redirection `>` (et non `>>`), il s'agit bel et
|
||||||
bien d'un ajout au fichier et non d'un écrasement. Il faut garder en tête que
|
bien d'un ajout au fichier et non d'un écrasement. Il faut garder en tête que
|
||||||
le système de fichier est entièrement simulé et que certains comportements sont
|
le système de fichier est entièrement simulé et que certains comportements sont
|
||||||
adaptés.
|
adaptés.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
|
|
||||||
### Consultation de l'état
|
### Consultation de l'état
|
||||||
|
|
||||||
|
@ -233,7 +237,9 @@ echo 0 > /sys/fs/cgroup/virli/cgroup.freeze # v2
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### Exercice : script de monitoring {- #script-monitoring}
|
::::: {.exercice}
|
||||||
|
|
||||||
|
### Script de monitoring {- #script-monitoring}
|
||||||
|
|
||||||
À nous maintenant de concevoir un script qui va enregistrer vers une base de
|
À nous maintenant de concevoir un script qui va enregistrer vers une base de
|
||||||
données des statistiques issues des *cgroup*s, tel `telegraf`.
|
données des statistiques issues des *cgroup*s, tel `telegraf`.
|
||||||
|
@ -266,7 +272,6 @@ mémoire.
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
::::: {.question}
|
|
||||||
Le modèle de sortie standard de votre script `monitor` n'a pas d'importance, il
|
Le modèle de sortie standard de votre script `monitor` n'a pas d'importance, il
|
||||||
doit cependant être possible d'y trouver des statistiques intéressantes, dont
|
doit cependant être possible d'y trouver des statistiques intéressantes, dont
|
||||||
la quantité de mémoire utilisée. Ici nous affichons au début le PID du
|
la quantité de mémoire utilisée. Ici nous affichons au début le PID du
|
||||||
|
@ -285,7 +290,6 @@ Où :
|
||||||
- `group_name` correspond au nom du/des *cgroup*(s) à créer/rejoindre.
|
- `group_name` correspond au nom du/des *cgroup*(s) à créer/rejoindre.
|
||||||
- `prog [args [...]]` est la commande que l'on souhaite monitorer, à exécuter
|
- `prog [args [...]]` est la commande que l'on souhaite monitorer, à exécuter
|
||||||
dans le *cgroup*.
|
dans le *cgroup*.
|
||||||
:::::
|
|
||||||
|
|
||||||
::::: {.warning}
|
::::: {.warning}
|
||||||
Si vous n'avez pas le *cgroup* *memory*, il est possible qu'il ne soit pas
|
Si vous n'avez pas le *cgroup* *memory*, il est possible qu'il ne soit pas
|
||||||
|
@ -293,6 +297,7 @@ activé par défaut par votre système. Si vous êtes dans ce cas, essayez
|
||||||
d'ajouter `cgroup_enable=memory` à la ligne de commande de votre noyau.
|
d'ajouter `cgroup_enable=memory` à la ligne de commande de votre noyau.
|
||||||
:::::
|
:::::
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
### Fixer des limites {#Fixer-des-limites}
|
### Fixer des limites {#Fixer-des-limites}
|
||||||
|
|
||||||
|
@ -357,5 +362,8 @@ limites que vous avez définies :
|
||||||
### Pour aller plus loin {-}
|
### Pour aller plus loin {-}
|
||||||
|
|
||||||
Pour tout connaître en détails, [la série d'articles de Neil Brown sur les
|
Pour tout connaître en détails, [la série d'articles de Neil Brown sur les
|
||||||
Control groups](https://lwn.net/Articles/604609/) est excellente ! Plus [cet
|
Control groups](https://lwn.net/Articles/604609/)[^lwncgroups] est excellente !
|
||||||
article sur la version 2](https://lwn.net/Articles/679786/).
|
Plus [cet article sur la version 2](https://lwn.net/Articles/679786/)[^lwncgroupsv2].
|
||||||
|
|
||||||
|
[^lwncgroups]: <https://lwn.net/Articles/604609/>
|
||||||
|
[^lwncgroupsv2]: <https://lwn.net/Articles/679786/>
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
::::: {.exercice}
|
||||||
|
|
||||||
## Exercice (SRS seulement) {-}
|
## Exercice (SRS seulement) {-}
|
||||||
|
|
||||||
Écrivons maintenant un programme dont le seul but est de s'échapper du `chroot` :
|
Écrivons maintenant un programme dont le seul but est de s'échapper du `chroot` :
|
||||||
|
@ -26,3 +28,5 @@ Mais une fois votre programme `escape` exécuté, vous devriez pouvoir !
|
||||||
bash# cat /path/to/foo
|
bash# cat /path/to/foo
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
Prérequis
|
Prérequis
|
||||||
---------
|
---------
|
||||||
|
|
||||||
### Noyau Linux
|
|
||||||
|
|
||||||
Pour pouvoir suivre les exemples et faire les exercices qui suivent, vous aurez
|
Pour pouvoir suivre les exemples et faire les exercices qui suivent, vous aurez
|
||||||
besoin d'un noyau Linux récent (une version 5.x sera très bien). Il doit de
|
besoin d'un noyau Linux récent (une version 5.x sera très bien). Il doit de
|
||||||
plus être compilé avec les options suivantes (lorsqu'elles sont disponibles
|
plus être compilé avec les options suivantes (lorsqu'elles sont disponibles
|
||||||
|
@ -29,10 +27,18 @@ General setup --->
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Si vous utilisez un noyau standard fourni par votre distribution, les options
|
||||||
|
requises seront a priori déjà sélectionnées et vous n'aurez donc pas à compiler
|
||||||
|
votre propre noyau. Néanmoins, nous allons nous interfacer avec le noyau, il
|
||||||
|
est donc nécessaire d'avoir les en-têtes de votre noyau.
|
||||||
|
|
||||||
#### Vérification via `menuconfig`\
|
Sous Debian, vous pouvez les installer via le paquet au nom semblable à
|
||||||
|
`linux-headers`. Le paquet porte le même nom sous Arch Linux et ses dérivés.
|
||||||
|
|
||||||
L'arbre ci-dessous correspond aux options qui seront *built-in* (signalées par
|
|
||||||
|
### Vérification via `menuconfig`
|
||||||
|
|
||||||
|
L'arbre ci-dessus correspond aux options qui seront *built-in* (signalées par
|
||||||
une `*`) ou installées en tant que module (signalées par un `M`). En effet,
|
une `*`) ou installées en tant que module (signalées par un `M`). En effet,
|
||||||
chaque noyau Linux peut être entièrement personnalisé en fonction des options
|
chaque noyau Linux peut être entièrement personnalisé en fonction des options
|
||||||
et des pilotes que l'on voudra utiliser.
|
et des pilotes que l'on voudra utiliser.
|
||||||
|
@ -50,7 +56,7 @@ make menuconfig
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
#### Vérification via `/boot/config-xxx`\
|
### Vérification via `/boot/config-xxx`
|
||||||
|
|
||||||
Les distributions basées sur Debian ont pour habitude de placer le fichier de
|
Les distributions basées sur Debian ont pour habitude de placer le fichier de
|
||||||
configuration ayant servi à compiler le noyau et ses modules dans le dossier
|
configuration ayant servi à compiler le noyau et ses modules dans le dossier
|
||||||
|
@ -80,22 +86,10 @@ CONFIG_CGROUP_NET_CLASSID=y
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
#### Vérification via `/proc/config.gz`\
|
### Vérification via `/proc/config.gz`
|
||||||
|
|
||||||
Dans la plupart des autres distributions, la configuration est accessible à
|
Dans la plupart des autres distributions, la configuration est accessible à
|
||||||
travers le fichier `/proc/config.gz`. Comme vous ne pouvez pas écrire dans
|
travers le fichier `/proc/config.gz`. Comme vous ne pouvez pas écrire dans
|
||||||
`/proc` pour décompresser le fichier, utilisez les outils `zcat`, `zgrep`, ...
|
`/proc` pour décompresser le fichier, utilisez les outils `zcat`, `zgrep`, ...
|
||||||
|
|
||||||
Vous devez retrouver les mêmes options que celles de la section précédente.
|
Vous devez retrouver les mêmes options que celles de la section précédente.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Présence des en-têtes
|
|
||||||
|
|
||||||
Si vous utilisez un noyau standard fourni par votre distribution, les options
|
|
||||||
requises seront a priori déjà sélectionnées et vous n'aurez donc pas à compiler
|
|
||||||
votre propre noyau. Néanmoins, nous allons nous interfacer avec le noyau, il
|
|
||||||
est donc nécessaire d'avoir les en-têtes de votre noyau.
|
|
||||||
|
|
||||||
Sous Debian, vous pouvez les installer via le paquet au nom semblable à
|
|
||||||
`linux-headers`. Le paquet porte le même nom sous Arch Linux et ses dérivés.
|
|
||||||
|
|
|
@ -42,20 +42,24 @@ jusqu'à ce que le système retrouve sa sérénité.
|
||||||
## Esquiver l'OOM killer ?
|
## Esquiver l'OOM killer ?
|
||||||
|
|
||||||
Au sein d'un *cgroup* *memory*, les fichiers `memory.oom_control` (v1) ou
|
Au sein d'un *cgroup* *memory*, les fichiers `memory.oom_control` (v1) ou
|
||||||
`memory.events` (v2) peuvent être utilisé afin de recevoir une notification du
|
`memory.events` (v2) peuvent être utilisés afin de recevoir une notification du
|
||||||
noyau avant que l'OOM-killer ne s'attaque à un processus de ce groupe.
|
noyau avant que l'OOM-killer ne s'attaque à un processus de ce groupe.
|
||||||
|
|
||||||
Grâce à cette notification, il est possible de figer le processus pour
|
Grâce à cette notification, il est possible de figer le processus pour
|
||||||
l'envoyer sur une autre machine. Et ainsi libérer la mémoire avant que l'OOM
|
l'envoyer sur une autre machine. Et ainsi libérer la mémoire avant que l'OOM
|
||||||
killer ne passe.
|
killer ne passe.
|
||||||
|
|
||||||
Jetez un œil à [cet article parru sur LWN](https://lwn.net/Articles/590960/) à
|
Jetez un œil à [cet article paru sur LWN](https://lwn.net/Articles/590960/) à
|
||||||
ce sujet.
|
ce sujet :\
|
||||||
|
<https://lwn.net/Articles/590960/>
|
||||||
|
|
||||||
|
::::: {.exercice}
|
||||||
|
|
||||||
## À vous de jouer {-}
|
#### À vous de jouer {-}\
|
||||||
|
|
||||||
Continuons l'exercice précédent où nous avions [fixé les
|
Continuons l'exercice précédent où nous avions [fixé les
|
||||||
limites](#Fixer-des-limites) de mémoire que pouvez réserver les processus de
|
limites](#Fixer-des-limites) de mémoire que pouvez réserver les processus de
|
||||||
notre groupe. Que se passe-t-il alors si `memhog` dépasse la quantité de
|
notre groupe. Que se passe-t-il alors si `memhog` dépasse la quantité de
|
||||||
mémoire autorisée dans le `cgroup` ?
|
mémoire autorisée dans le `cgroup` ?
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -57,7 +57,7 @@ exemple, pour modifier les paramètres du noyau, on passe par le fichier
|
||||||
`/etc/sysctl.conf` et du programme `sysctl`.
|
`/etc/sysctl.conf` et du programme `sysctl`.
|
||||||
|
|
||||||
|
|
||||||
#### Consultation et modification\
|
### Consultation et modification
|
||||||
|
|
||||||
La consultation d'un élément se fait généralement à l'aide d'un simple `cat` :
|
La consultation d'un élément se fait généralement à l'aide d'un simple `cat` :
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ La modification d'un élément se fait avec `echo`, comme ceci :
|
||||||
Vous devriez constater l'effet de cette commande sans plus attendre !
|
Vous devriez constater l'effet de cette commande sans plus attendre !
|
||||||
|
|
||||||
|
|
||||||
### Exercices
|
::::: {.exercice}
|
||||||
|
|
||||||
#### `procinfo`\
|
#### `procinfo`\
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ Remaining time: N/A
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Pour les détails sur l'organisation de ce dossier, regardez :
|
Pour les détails sur l'organisation de ce dossier, regardez :\
|
||||||
<https://www.kernel.org/doc/Documentation/power/power_supply_class.txt>.
|
<https://www.kernel.org/doc/Documentation/power/power_supply_class.txt>.
|
||||||
|
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ Voici un exemple d'utilisation :
|
||||||
|
|
||||||
Vous aurez besoin de définir une alarme au niveau de votre RTC, via le
|
Vous aurez besoin de définir une alarme au niveau de votre RTC, via le
|
||||||
fichier :\
|
fichier :\
|
||||||
`/sys/class/rtc/rtcX/wakealarm`
|
`/sys/class/rtc/rtcX/wakealarm`\
|
||||||
|
|
||||||
::::: {.warning}
|
::::: {.warning}
|
||||||
Attention au fuseau horaire utilisé par votre RTC, si votre système principal
|
Attention au fuseau horaire utilisé par votre RTC, si votre système principal
|
||||||
|
@ -251,7 +251,7 @@ est Windows, elle utilisera sans doute le fuseau horaire courant. Sinon, ce
|
||||||
sera UTC.
|
sera UTC.
|
||||||
:::::
|
:::::
|
||||||
|
|
||||||
::::: {.more}
|
Un article très complet sur le sujet est disponible ici :\
|
||||||
Un article très complet sur le sujet est disponible ici :
|
|
||||||
<https://www.linux.com/tutorials/wake-linux-rtc-alarm-clock/>
|
<https://www.linux.com/tutorials/wake-linux-rtc-alarm-clock/>
|
||||||
|
|
||||||
:::::
|
:::::
|
||||||
|
|
|
@ -77,7 +77,7 @@ seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### Exercice {-}
|
::::: {.exercice}
|
||||||
|
|
||||||
Écrivez un programme filtrant un appel système, à l'aide de `seccomp` :
|
Écrivez un programme filtrant un appel système, à l'aide de `seccomp` :
|
||||||
|
|
||||||
|
@ -90,3 +90,5 @@ sleep: cannot read realtime clock: Operation not permitted
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Dans cet exemple, l'appel système filtré est `nanosleep(2)`.
|
Dans cet exemple, l'appel système filtré est `nanosleep(2)`.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
\newpage
|
\newpage
|
||||||
|
|
||||||
### Exercice : comparaison de *namespace* -- `cmpns.sh`
|
::::: {.exercice}
|
||||||
|
|
||||||
|
### Comparaison de *namespace* -- `cmpns.sh`
|
||||||
|
|
||||||
Les *namespaces* d'un programme sont exposés sous forme de liens symboliques
|
Les *namespaces* d'un programme sont exposés sous forme de liens symboliques
|
||||||
dans le répertoire `/proc/<PID>/ns/`.
|
dans le répertoire `/proc/<PID>/ns/`.
|
||||||
|
@ -63,3 +65,5 @@ Et pourquoi pas :
|
||||||
- uts: same
|
- uts: same
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
\newpage
|
\newpage
|
||||||
|
|
||||||
Exercice : `docker exec`
|
::::: {.exercice}
|
||||||
------------------------
|
|
||||||
|
`docker exec`
|
||||||
|
-------------
|
||||||
|
|
||||||
Après voir lu la partie concernant les *namespaces*, vous avez dû comprendre
|
Après voir lu la partie concernant les *namespaces*, vous avez dû comprendre
|
||||||
qu'un `docker exec`, n'était donc rien de plus qu'un `nsenter(1)`.
|
qu'un `docker exec`, n'était donc rien de plus qu'un `nsenter(1)`.
|
||||||
|
@ -46,3 +48,5 @@ d63ceae86395
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -13,8 +13,7 @@ systèmes de fichiers.
|
||||||
Au premier abord, les points de montage dans l'arborescence d'un système de
|
Au premier abord, les points de montage dans l'arborescence d'un système de
|
||||||
fichiers n'ont pas l'air d'être remplis de notions complexes : un répertoire
|
fichiers n'ont pas l'air d'être remplis de notions complexes : un répertoire
|
||||||
peut être le point d'entrée d'un montage vers la partition d'un disque
|
peut être le point d'entrée d'un montage vers la partition d'un disque
|
||||||
physique... ou d'une partition virtuelle, comme nous l'avons vu dans le TP
|
physique... ou d'une partition virtuelle, comme nous l'avons vu précédemment.
|
||||||
précédent.
|
|
||||||
|
|
||||||
Mais avez-vous déjà essayé de monter la même partition d'un disque physique à
|
Mais avez-vous déjà essayé de monter la même partition d'un disque physique à
|
||||||
deux endroits différents de votre arborescence ?
|
deux endroits différents de votre arborescence ?
|
||||||
|
@ -35,30 +34,30 @@ d'avoir une vision arborescente des points de montage en cours d'utilisation.
|
||||||
```
|
```
|
||||||
TARGET SOURCE FSTYPE OPTIONS
|
TARGET SOURCE FSTYPE OPTIONS
|
||||||
/ /dev/sda1 ext4 rw,relatime,data=ordered
|
/ /dev/sda1 ext4 rw,relatime,data=ordered
|
||||||
├─/proc proc proc rw,nosuid,nodev,noexec,relatime
|
/proc proc proc rw,nosuid,nodev,noexec,relatime
|
||||||
├─/sys sysfs sysfs rw,nosuid,nodev,noexec,relatime
|
/sys sysfs sysfs rw,nosuid,nodev,noexec,relatime
|
||||||
│ ├─/sys/kernel/security securityfs securityfs rw,nosuid,nodev,noexec,relatime
|
├─/sys/kernel/security securityfs securityfs rw,nosuid,nodev,noexec,relatime
|
||||||
│ ├─/sys/firmware/efi/efivars efivarfs efivarfs ro,relatime
|
├─/sys/firmware/efi/efivars efivarfs efivarfs ro,relatime
|
||||||
│ └─/sys/fs/cgroup cgroup_root tmpfs rw,nosuid,nodev,noexec,relatime,size=10240k,mode=755
|
└─/sys/fs/cgroup cgroup_root tmpfs rw,nosuid,nodev,noexec,relatime
|
||||||
│ ├─/sys/fs/cgroup/unified none cgroup2 rw,nosuid,nodev,noexec,relatime
|
├─/sys/fs/cgroup/unified none cgroup2 rw,nosuid,nodev,noexec,relatime
|
||||||
│ ├─/sys/fs/cgroup/cpuset cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset
|
├─/sys/fs/cgroup/cpuset cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset
|
||||||
│ ├─/sys/fs/cgroup/cpu cpu cgroup rw,nosuid,nodev,noexec,relatime,cpu
|
├─/sys/fs/cgroup/cpu cpu cgroup rw,nosuid,nodev,noexec,relatime,cpu
|
||||||
│ ├─/sys/fs/cgroup/cpuacct cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct
|
├─/sys/fs/cgroup/cpuacct cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct
|
||||||
│ ├─/sys/fs/cgroup/blkio blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio
|
├─/sys/fs/cgroup/blkio blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio
|
||||||
│ ├─/sys/fs/cgroup/memory memory cgroup rw,nosuid,nodev,noexec,relatime,memory
|
├─/sys/fs/cgroup/memory memory cgroup rw,nosuid,nodev,noexec,relatime,memory
|
||||||
│ ├─/sys/fs/cgroup/devices devices cgroup rw,nosuid,nodev,noexec,relatime,devices
|
├─/sys/fs/cgroup/devices devices cgroup rw,nosuid,nodev,noexec,relatime,devices
|
||||||
│ ├─/sys/fs/cgroup/freezer freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer
|
├─/sys/fs/cgroup/freezer freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer
|
||||||
│ ├─/sys/fs/cgroup/net_cls net_cls cgroup rw,nosuid,nodev,noexec,relatime,net_cls
|
├─/sys/fs/cgroup/net_cls net_cls cgroup rw,nosuid,nodev,noexec,relatime,net_cls
|
||||||
│ ├─/sys/fs/cgroup/perf_event perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event
|
├─/sys/fs/cgroup/perf_event perf_event cgroup rw,nosuid,nodev,noexec,relatime,p_event
|
||||||
│ ├─/sys/fs/cgroup/net_prio net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_prio
|
├─/sys/fs/cgroup/net_prio net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_pri
|
||||||
│ └─/sys/fs/cgroup/pids pids cgroup rw,nosuid,nodev,noexec,relatime,pids
|
└─/sys/fs/cgroup/pids pids cgroup rw,nosuid,nodev,noexec,relatime,pids
|
||||||
├─/dev devtmpfs devtmpfs rw,nosuid,size=10240k,nr_inodes=486250,mode=755
|
/dev devtmpfs devtmpfs rw,nosuid,size=10240k,nr_inodes=486250
|
||||||
│ ├─/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000
|
├─/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,ptmxmod
|
||||||
│ ├─/dev/shm tmpfs tmpfs rw
|
├─/dev/shm tmpfs tmpfs rw
|
||||||
│ └─/dev/mqueue mqueue mqueue rw,nosuid,nodev,noexec,relatime
|
└─/dev/mqueue mqueue mqueue rw,nosuid,nodev,noexec,relatime
|
||||||
├─/home /dev/sda3 ext4 rw,nosuid,nodev,relatime,data=ordered
|
/home /dev/sda3 ext4 rw,nosuid,nodev,relatime,data=ordered
|
||||||
├─/run tmpfs tmpfs rw,nosuid,nodev,noexec,mode=755
|
/run tmpfs tmpfs rw,nosuid,nodev,noexec,mode=755
|
||||||
└─/tmp tmpfs tmpfs rw,nosuid,nodev,noexec,relatime
|
/tmp tmpfs tmpfs rw,nosuid,nodev,noexec,relatime
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -63,8 +63,9 @@ Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs`
|
||||||
|
|
||||||
Placez ensuite dans cette nouvelle racine le système de votre choix.
|
Placez ensuite dans cette nouvelle racine le système de votre choix.
|
||||||
|
|
||||||
|
::::: {.exercice}
|
||||||
|
|
||||||
### Exercice : Changer de racine -- `myswitch_root.sh`
|
### Changer de racine -- `myswitch_root.sh`
|
||||||
|
|
||||||
Voici les grandes étapes du changement de racine :
|
Voici les grandes étapes du changement de racine :
|
||||||
|
|
||||||
|
@ -150,3 +151,5 @@ par :
|
||||||
42sh# exec chroot / command
|
42sh# exec chroot / command
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -4,11 +4,11 @@ Je vous recommande la lecture du *man* `namespaces(7)` introduisant et
|
||||||
énumérant les *namespaces*.
|
énumérant les *namespaces*.
|
||||||
|
|
||||||
Pour tout connaître en détails, [la série d'articles de Michael Kerrisk sur les
|
Pour tout connaître en détails, [la série d'articles de Michael Kerrisk sur les
|
||||||
*namespaces*](https://lwn.net/Articles/531114/) est excellente ! Auquel il faut
|
*namespaces*](https://lwn.net/Articles/531114/)[^lwnns1] est excellente ! Auquel il faut
|
||||||
ajouter [l'article sur le plus récent `cgroup`
|
ajouter [l'article sur le plus récent `cgroup`
|
||||||
*namespace*](https://lwn.net/Articles/621006/) et [le petit dernier sur le
|
*namespace*](https://lwn.net/Articles/621006/)[^lwnns2] et [le petit dernier sur le
|
||||||
*namespace* `time`](https://lwn.net/Articles/766089/).
|
*namespace* `time`](https://lwn.net/Articles/766089/)[^lwnns3].
|
||||||
|
|
||||||
[Cet article de Michael Crosby montrant l'utilisation de clone(2)](https://web.archive.org/web/20190206073558/http://crosbymichael.com/creating-containers-part-1.html)
|
[^lwnns1]: <https://lwn.net/Articles/531114/>
|
||||||
est également des plus intéressants, pour ce qui concerne la programmation
|
[^lwnns2]: <https://lwn.net/Articles/621006/>
|
||||||
plus bas-niveau.
|
[^lwnns3]: <https://lwn.net/Articles/766089/>
|
||||||
|
|
|
@ -234,8 +234,11 @@ Pour construire une nouvelle interface de ce type :
|
||||||
|
|
||||||
Pour approfondir les différentes techniques de routage, je vous
|
Pour approfondir les différentes techniques de routage, je vous
|
||||||
recommande cet article :
|
recommande cet article :
|
||||||
[Linux Containers and Networking](https://blog.flameeyes.eu/2010/09/linux-containers-and-networking).
|
[Linux Containers and Networking](https://blog.flameeyes.eu/2010/09/linux-containers-and-networking)[^netnsmore1].
|
||||||
|
|
||||||
Appliqué à Docker, vous apprécierez cet article : [Understanding Docker
|
Appliqué à Docker, vous apprécierez cet article : [Understanding Docker
|
||||||
Networking Drivers and their use
|
Networking Drivers and their use
|
||||||
cases](https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/).
|
cases](https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/)[^netnsmore2].
|
||||||
|
|
||||||
|
[^netnsmore1]: <https://blog.flameeyes.eu/2010/09/linux-containers-and-networking>
|
||||||
|
[^netnsmore2]: <https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/>
|
||||||
|
|
|
@ -81,8 +81,10 @@ La sécurité du *namespace* `user` a souvent été remise en cause par le pass
|
||||||
on lui attribue de nombreuses vulnérabilités. Vous devriez notamment consulter
|
on lui attribue de nombreuses vulnérabilités. Vous devriez notamment consulter
|
||||||
à ce sujet :
|
à ce sujet :
|
||||||
|
|
||||||
* [Security Implications of User Namespaces](https://blog.araj.me/security-implications-of-user-namespaces/) ;
|
* [Security Implications of User Namespaces](https://blog.araj.me/security-implications-of-user-namespaces/) :\
|
||||||
* [Anatomy of a user namespaces vulnerability](https://lwn.net/Articles/543273/) ;
|
<https://blog.araj.me/security-implications-of-user-namespaces/> ;
|
||||||
|
* [Anatomy of a user namespaces vulnerability](https://lwn.net/Articles/543273/) :\
|
||||||
|
<https://lwn.net/Articles/543273/> ;
|
||||||
* <http://marc.info/?l=linux-kernel&m=135543612731939&w=2> ;
|
* <http://marc.info/?l=linux-kernel&m=135543612731939&w=2> ;
|
||||||
* <http://marc.info/?l=linux-kernel&m=135545831607095&w=2>.
|
* <http://marc.info/?l=linux-kernel&m=135545831607095&w=2>.
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,17 @@ function Div(el)
|
||||||
el.content,
|
el.content,
|
||||||
pandoc.RawBlock("latex", "\\end{codebox}"))
|
pandoc.RawBlock("latex", "\\end{codebox}"))
|
||||||
|
|
||||||
|
elseif el.classes[1] == "exercice"
|
||||||
|
then
|
||||||
|
-- insert element in front
|
||||||
|
table.insert(
|
||||||
|
el.content, 1,
|
||||||
|
pandoc.RawBlock("latex", "\\noindent\\begin{exercicebox}"))
|
||||||
|
-- insert element at the back
|
||||||
|
table.insert(
|
||||||
|
el.content,
|
||||||
|
pandoc.RawBlock("latex", "\\end{exercicebox}"))
|
||||||
|
|
||||||
elseif el.classes[1] == "question"
|
elseif el.classes[1] == "question"
|
||||||
then
|
then
|
||||||
-- insert element in front
|
-- insert element in front
|
||||||
|
|
|
@ -69,7 +69,7 @@ docker run --rm -p 8080:8080 localhost:5000/youp0m
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
::::: {.more}
|
::::: {.question}
|
||||||
On notera que ceci est possible exclusivement parce que le registre
|
On notera que ceci est possible exclusivement parce que le registre
|
||||||
`localhost:5000` est considéré non-sûr par défaut. C'est à dire qu'il n'a pas
|
`localhost:5000` est considéré non-sûr par défaut. C'est à dire qu'il n'a pas
|
||||||
besoin de certificat TLS sur sa connexion HTTP pour être utilisé.\
|
besoin de certificat TLS sur sa connexion HTTP pour être utilisé.\
|
||||||
|
|
|
@ -33,7 +33,7 @@ Dans un premier temps, nous allons nous contenter de publier un binaire associé
|
||||||
|
|
||||||
### Installation et configuration
|
### Installation et configuration
|
||||||
|
|
||||||
Allez c'est parti ! première chose à faire : installer et configurer
|
Aller c'est parti ! première chose à faire : installer et configurer
|
||||||
[Gitea](https://gitea.io/) (ceux qui le souhaitent peuvent choisir
|
[Gitea](https://gitea.io/) (ceux qui le souhaitent peuvent choisir
|
||||||
[gitlab](https://gitlab.org/) ou une autre plate-forme, mais la suite sera
|
[gitlab](https://gitlab.org/) ou une autre plate-forme, mais la suite sera
|
||||||
moins guidée).
|
moins guidée).
|
||||||
|
|
|
@ -116,14 +116,14 @@ Dans ce dernier exemple, nous n'avons pas besoin de préciser l'hôte, car
|
||||||
dans notre conteneur `mytsdb`, il s'agit bien du conteneur où s'exécute
|
dans notre conteneur `mytsdb`, il s'agit bien du conteneur où s'exécute
|
||||||
localement `influxdb`.
|
localement `influxdb`.
|
||||||
|
|
||||||
|
::::: {.exercice}
|
||||||
#### Exercice {-}
|
|
||||||
|
|
||||||
Ajoutez à la ligne de commande de lancement du conteneur les bon(s) volume(s)
|
Ajoutez à la ligne de commande de lancement du conteneur les bon(s) volume(s)
|
||||||
qui permettront de ne pas perdre les données d'influxDB si nous devions
|
qui permettront de ne pas perdre les données d'influxDB si nous devions
|
||||||
redémarrer le conteneur. Aidez-vous pour cela de la [documentation du
|
redémarrer le conteneur. Aidez-vous pour cela de la [documentation du
|
||||||
conteneur](https://hub.docker.com/_/influxdb).
|
conteneur](https://hub.docker.com/_/influxdb).
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
### Collecter les données locales
|
### Collecter les données locales
|
||||||
|
|
||||||
|
@ -192,11 +192,10 @@ system
|
||||||
La nouvelle base a donc bien été créée et tant que nous laissons *Telegraf*
|
La nouvelle base a donc bien été créée et tant que nous laissons *Telegraf*
|
||||||
lancé, celui-ci va régulièrement envoyer des métriques de cette machine.
|
lancé, celui-ci va régulièrement envoyer des métriques de cette machine.
|
||||||
|
|
||||||
|
::::: {.exercice}
|
||||||
|
|
||||||
### Afficher les données collectées
|
### Afficher les données collectées
|
||||||
|
|
||||||
#### Exercice {-}
|
|
||||||
|
|
||||||
À vous de jouer pour lancer le conteneur
|
À vous de jouer pour lancer le conteneur
|
||||||
[*Chronograf*](https://store.docker.com/images/chronograf).
|
[*Chronograf*](https://store.docker.com/images/chronograf).
|
||||||
|
|
||||||
|
@ -214,4 +213,6 @@ ceux ci-après :
|
||||||
|
|
||||||
:::::
|
:::::
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||

|

|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
Exercice {-}
|
::::: {.exercice}
|
||||||
--------
|
|
||||||
|
|
||||||
Pour mettre en pratiques toutes les notions que l'on a vu jusque là, écrivez un
|
Pour mettre en pratiques toutes les notions que l'on a vu jusque là, écrivez un
|
||||||
script `mycloud-run.sh` pour automatiser le lancement de votre instance
|
script `mycloud-run.sh` pour automatiser le lancement de votre instance
|
||||||
|
@ -45,3 +44,5 @@ http://localhost:12345/
|
||||||
http://localhost:12345/
|
http://localhost:12345/
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
## Exercice {-}
|
::::: {.exercice}
|
||||||
|
|
||||||
À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base
|
À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base
|
||||||
de données.
|
de données.
|
||||||
|
@ -42,3 +42,5 @@ http://localhost:12345/
|
||||||
http://localhost:12345/
|
http://localhost:12345/
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -217,7 +217,7 @@ une interface `virtual ethernet` :
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
## Exercice {-}
|
::::: {.exercice}
|
||||||
|
|
||||||
Réalisez une recette `vault.yml` démarrant une instance du gestionnaire de
|
Réalisez une recette `vault.yml` démarrant une instance du gestionnaire de
|
||||||
secrets [Hashicorp Vault](https://www.vaultproject.io/), utilisant une [base de
|
secrets [Hashicorp Vault](https://www.vaultproject.io/), utilisant une [base de
|
||||||
|
@ -241,3 +241,5 @@ conteneurs, sans quoi vos conteneurs risquent d'être tués prématurément.
|
||||||
En bonus, vous pouvez gérer la [persistance des
|
En bonus, vous pouvez gérer la [persistance des
|
||||||
données](https://github.com/linuxkit/linuxkit/blob/master/examples/swap.yml)
|
données](https://github.com/linuxkit/linuxkit/blob/master/examples/swap.yml)
|
||||||
stockées dans Vault.
|
stockées dans Vault.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -160,7 +160,7 @@ Hello from Docker!
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
## Exercice {-}
|
::::: {.exercice}
|
||||||
|
|
||||||
Réalisez un script pour automatiser l'ensemble de ces étapes :
|
Réalisez un script pour automatiser l'ensemble de ces étapes :
|
||||||
|
|
||||||
|
@ -189,3 +189,5 @@ similaire au driver `vfs` : en extrayant chaque tarball l'une au dessus de
|
||||||
l'autre, en essayant de gérer les *whiteout files*. Ou bien en suivant le
|
l'autre, en essayant de gérer les *whiteout files*. Ou bien en suivant le
|
||||||
driver `overlayfs`, en montant un système de fichier à chaque couche (dans ce
|
driver `overlayfs`, en montant un système de fichier à chaque couche (dans ce
|
||||||
cas, votre script devra être lancé en `root`).
|
cas, votre script devra être lancé en `root`).
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -124,8 +124,7 @@ ajouter un élément à cette liste, demandant de *bind* :
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
::::: {.exercice}
|
||||||
## Exercice {-}
|
|
||||||
|
|
||||||
À vous maintenant d'éditer votre `config.json`, pour lancer le service youp0m.
|
À vous maintenant d'éditer votre `config.json`, pour lancer le service youp0m.
|
||||||
|
|
||||||
|
@ -146,3 +145,5 @@ Pour cette étape, Considérez que vous avez réussi si vous voyez s'afficher :
|
||||||
> `Ready, listening on :8080`
|
> `Ready, listening on :8080`
|
||||||
|
|
||||||
On ne pourra pas tester davantage sans avoir du réseau dans notre conteneur.
|
On ne pourra pas tester davantage sans avoir du réseau dans notre conteneur.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
## Exercice {-}
|
::::: {.exercice}
|
||||||
|
|
||||||
Déterminez le nombre de vulnérabilités dans les principales images officielles
|
Déterminez le nombre de vulnérabilités dans les principales images officielles
|
||||||
du [Docker Hub](https://hub.docker.com/explore).
|
du [Docker Hub](https://hub.docker.com/explore).
|
||||||
|
@ -9,3 +9,5 @@ contenant les vulnérabilités les plus inquiétantes. Vous placerez ce rapport
|
||||||
dans un fichier `${IMAGE}:${TAG}.html` ou `${IMAGE}:${TAG}.txt`.
|
dans un fichier `${IMAGE}:${TAG}.html` ou `${IMAGE}:${TAG}.txt`.
|
||||||
|
|
||||||
Veillez à utiliser une image __différente__ de `mysql`, utilisée en exemple.
|
Veillez à utiliser une image __différente__ de `mysql`, utilisée en exemple.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -133,6 +133,8 @@ Dans un autre terminal, lançons un `docker container ls`, pour consulter la col
|
||||||
|
|
||||||
Rendez-vous ensuite dans votre navigateur sur <http://localhost:49153/>.
|
Rendez-vous ensuite dans votre navigateur sur <http://localhost:49153/>.
|
||||||
|
|
||||||
|
:::::: {.exercice}
|
||||||
|
|
||||||
#### À vous de jouer {-}
|
#### À vous de jouer {-}
|
||||||
|
|
||||||
Utilisez l'instruction `COPY`{.dockerfile} pour afficher votre propre
|
Utilisez l'instruction `COPY`{.dockerfile} pour afficher votre propre
|
||||||
|
@ -140,6 +142,7 @@ Utilisez l'instruction `COPY`{.dockerfile} pour afficher votre propre
|
||||||
d'inspiration, utilisez [cette page de compte à
|
d'inspiration, utilisez [cette page de compte à
|
||||||
rebours](https://virli.nemunai.re/countdown.html).-->
|
rebours](https://virli.nemunai.re/countdown.html).-->
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
### Les caches
|
### Les caches
|
||||||
|
|
||||||
|
@ -307,7 +310,7 @@ Consultez <https://docs.docker.com/engine/reference/builder/> pour la liste
|
||||||
complète des instructions reconnues.
|
complète des instructions reconnues.
|
||||||
|
|
||||||
|
|
||||||
### Exercice {-}
|
::::: {.exercice}
|
||||||
|
|
||||||
Pour mettre en application tout ce que nous venons de voir, réalisons le
|
Pour mettre en application tout ce que nous venons de voir, réalisons le
|
||||||
`Dockerfile` du service web [`youp0m`](https://you.p0m.fr/) que nous avons
|
`Dockerfile` du service web [`youp0m`](https://you.p0m.fr/) que nous avons
|
||||||
|
@ -329,3 +332,5 @@ WORKDIR /go/src/git.nemunai.re/youp0m
|
||||||
RUN go build -tags dev -v
|
RUN go build -tags dev -v
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -70,6 +70,7 @@ possibilité de le surcharger au moyen d'un argument :
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
::::: {.exerice}
|
||||||
|
|
||||||
## Personnalisation basique
|
## Personnalisation basique
|
||||||
|
|
||||||
|
@ -100,6 +101,7 @@ Pour améliorer la situation, définissez
|
||||||
l'[`ENTRYPOINT`{.dockerfile}](https://docs.docker.com/engine/reference/builder/#entrypoint)
|
l'[`ENTRYPOINT`{.dockerfile}](https://docs.docker.com/engine/reference/builder/#entrypoint)
|
||||||
de votre image sur le binaire `/srv/youp0m`.
|
de votre image sur le binaire `/srv/youp0m`.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
## Point d'entrée avancé
|
## Point d'entrée avancé
|
||||||
|
|
||||||
|
@ -162,8 +164,7 @@ pouvons obtenir un fichier valide avec :
|
||||||
Il faut ensuite passer le chemin du fichier créé sur la ligne de commande grâce
|
Il faut ensuite passer le chemin du fichier créé sur la ligne de commande grâce
|
||||||
à l'option `-htpasswd`.
|
à l'option `-htpasswd`.
|
||||||
|
|
||||||
|
::::: {.exercice}
|
||||||
### Exercice {-}
|
|
||||||
|
|
||||||
Écrivez un script d'`ENTRYPOINT`{.dockerfile}, analysant les variables
|
Écrivez un script d'`ENTRYPOINT`{.dockerfile}, analysant les variables
|
||||||
d'environnement, à la recherche de `YOUP0M_USERNAME` et `YOUP0M_PASSWORD` pour
|
d'environnement, à la recherche de `YOUP0M_USERNAME` et `YOUP0M_PASSWORD` pour
|
||||||
|
@ -184,3 +185,5 @@ You are not allowed to perform this request.
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
|
@ -51,11 +51,14 @@ docker buildx build .
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
::::: {.more}
|
||||||
|
|
||||||
Nous ne rentrerons pas plus dans les détails de cette nouvelle commande, mais
|
Nous ne rentrerons pas plus dans les détails de cette nouvelle commande, mais
|
||||||
sachez qu'on la retrouve particulièrement fréquemment dans les *GitHub
|
sachez qu'on la retrouve particulièrement fréquemment dans les *GitHub
|
||||||
Actions* :\
|
Actions* :\
|
||||||
<https://github.com/marketplace/actions/docker-setup-buildx>
|
<https://github.com/marketplace/actions/docker-setup-buildx>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
#### Changer la syntaxe de nos `Dockerfile`\
|
#### Changer la syntaxe de nos `Dockerfile`\
|
||||||
|
|
||||||
|
@ -113,13 +116,13 @@ ou 1.3 (expérimentale).
|
||||||
Les ajouts par rapport à la syntaxe usuelle sont répertoriés sur cette page :\
|
Les ajouts par rapport à la syntaxe usuelle sont répertoriés sur cette page :\
|
||||||
<https://hub.docker.com/r/docker/dockerfile>.
|
<https://hub.docker.com/r/docker/dockerfile>.
|
||||||
|
|
||||||
|
::::: {.exercice}
|
||||||
### Exercice {-}
|
|
||||||
|
|
||||||
Faites en sorte que le `Dockerfile` que vous avez créé pour `youp0m` indique un
|
Faites en sorte que le `Dockerfile` que vous avez créé pour `youp0m` indique un
|
||||||
*frontend* BuildKit à utiliser, tout en restant compatible avec la syntaxe du
|
*frontend* BuildKit à utiliser, tout en restant compatible avec la syntaxe du
|
||||||
`docker build` classique.
|
`docker build` classique.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
### Des images sans Docker
|
### Des images sans Docker
|
||||||
|
|
||||||
|
@ -127,7 +130,7 @@ Il est aussi possible de se passer complètement de Docker. La plupart des
|
||||||
outils qui sont capables de générer des images de machines virtuelles, sont
|
outils qui sont capables de générer des images de machines virtuelles, sont
|
||||||
aussi capable de générer des images Docker. Citons notamment :
|
aussi capable de générer des images Docker. Citons notamment :
|
||||||
|
|
||||||
- [Hashicorp Packer](https://www.packer.io/docs/builders/docker)
|
- [Hashicorp Packer](https://www.packer.io/docs/builders/docker),
|
||||||
- [Nix et Guix](https://nix.dev/tutorials/building-and-running-docker-images)
|
- [Nix et Guix](https://nix.dev/tutorials/building-and-running-docker-images),
|
||||||
- [Kubler](https://github.com/edannenberg/kubler)
|
- [Kubler](https://github.com/edannenberg/kubler),
|
||||||
- et bien d'autres.
|
- et bien d'autres.
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
spread sidewards,fuzzy halo=1mm with ForestGreen!50!black}
|
spread sidewards,fuzzy halo=1mm with ForestGreen!50!black}
|
||||||
|
|
||||||
\newtcolorbox{alertbox}[1][]{breakable,enhanced,
|
\newtcolorbox{alertbox}[1][]{breakable,enhanced,
|
||||||
before skip balanced=2mm,after skip balanced=3mm,
|
before=\hspace{.7em},after=\hspace{.5em},
|
||||||
tile,left=11mm,right=2mm,top=1mm,bottom=1mm,
|
tile,left=11mm,right=2mm,top=.5em,bottom=.5em,
|
||||||
colback=white!0,
|
colback=white!0,
|
||||||
sharp corners,
|
sharp corners,
|
||||||
colback=lightgray!20!white,
|
colback=lightgray!20!white,
|
||||||
|
@ -15,8 +15,8 @@
|
||||||
},#1}
|
},#1}
|
||||||
|
|
||||||
\newtcolorbox{codebox}[1][]{breakable,enhanced,
|
\newtcolorbox{codebox}[1][]{breakable,enhanced,
|
||||||
before skip balanced=2mm,after skip balanced=3mm,
|
before=\hspace{.7em},after=\hspace{.5em},
|
||||||
tile,left=11mm,right=2mm,top=1mm,bottom=1mm,
|
tile,left=11mm,right=2mm,top=.5em,bottom=.5em,
|
||||||
colback=white!0,
|
colback=white!0,
|
||||||
sharp corners,
|
sharp corners,
|
||||||
colback=lightgray!20!white,
|
colback=lightgray!20!white,
|
||||||
|
@ -24,9 +24,33 @@
|
||||||
\path[fill=black,draw=none] (interior.south west) rectangle node[white]{\huge\bfseries\texttt >\_} ([xshift=10mm]interior.north west);
|
\path[fill=black,draw=none] (interior.south west) rectangle node[white]{\huge\bfseries\texttt >\_} ([xshift=10mm]interior.north west);
|
||||||
},#1}
|
},#1}
|
||||||
|
|
||||||
|
\usetikzlibrary{calc}
|
||||||
|
\newtcolorbox{exercicebox}[1][parbox=false]{breakable,enhanced,
|
||||||
|
before=\hspace{.7em},after=\hspace{.5em},
|
||||||
|
tile,left=2mm,right=12mm,top=.5em,bottom=.5em,
|
||||||
|
frame code={\path[draw=Gold!85!gray,sharp corners,line width=2.5pt] (frame.north west) -- (frame.north) -- (frame.north east);}
|
||||||
|
sharp corners,
|
||||||
|
colback=white,
|
||||||
|
underlay={%
|
||||||
|
\path[fill=Gold!85!gray,draw=none] (interior.south east) rectangle node[white]{\begin{tikzpicture}
|
||||||
|
\draw[fill=white,even odd rule]
|
||||||
|
let
|
||||||
|
\n{dpt} = {360/7}
|
||||||
|
in
|
||||||
|
(0,0) circle (1.2mm) %
|
||||||
|
({\n{dpt}*(0.5)}:2.5mm) \foreach \x in {1,...,7}{ %
|
||||||
|
arc ({\n{dpt}*(\x-0.5)}:{\n{dpt}*(\x-0.25)}:2.5mm) %
|
||||||
|
--++(\x*\n{dpt}:1.5mm) %
|
||||||
|
arc ({\n{dpt}*(\x-0.25)}:{\n{dpt}*(\x+0.25)}:2.5mm) %
|
||||||
|
--++(\x*\n{dpt}:-1.5mm) %
|
||||||
|
arc ({\n{dpt}*(\x+0.25)}:{\n{dpt}*(\x+0.5)}:2.5mm)--%
|
||||||
|
({\n{dpt}*(\x+0.5)}:2.5mm)
|
||||||
|
};\end{tikzpicture}} ([xshift=-10mm]interior.north east);
|
||||||
|
},#1}
|
||||||
|
|
||||||
\newtcolorbox{questionbox}[1][]{breakable,enhanced,
|
\newtcolorbox{questionbox}[1][]{breakable,enhanced,
|
||||||
before skip balanced=2mm,after skip balanced=3mm,
|
before=\hspace{.7em},after=\hspace{.5em},
|
||||||
tile,left=11mm,right=2mm,top=1mm,bottom=1mm,
|
tile,left=11mm,right=2mm,top=.5em,bottom=.5em,
|
||||||
colback=white!0,
|
colback=white!0,
|
||||||
sharp corners,
|
sharp corners,
|
||||||
colback=lightgray!20!white,
|
colback=lightgray!20!white,
|
||||||
|
@ -35,8 +59,8 @@
|
||||||
},#1}
|
},#1}
|
||||||
|
|
||||||
\newtcolorbox{morebox}[1][]{breakable,enhanced,
|
\newtcolorbox{morebox}[1][]{breakable,enhanced,
|
||||||
before skip balanced=2mm,after skip balanced=3mm,
|
before=\hspace{.2em},after=\hspace{.15em},
|
||||||
tile,left=7mm,right=7mm,top=1mm,bottom=1mm,
|
tile,left=7mm,right=7mm,top=.5em,bottom=.5em,
|
||||||
colback=white!0,
|
colback=white!0,
|
||||||
sharp corners,
|
sharp corners,
|
||||||
colback=lightgray!20!white,
|
colback=lightgray!20!white,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue