tutorials: improve theme + use pandoc 2

This commit is contained in:
nemunaire 2018-11-16 02:38:41 +01:00
parent de21be218a
commit d25af4fdb2
65 changed files with 1281 additions and 1292 deletions

View file

@ -1,18 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md installation.md chroot.md pseudofs.md capabilities.md cgroups.md oom.md seccomp.md project-intro.md project-body.md project-rendu.md SOURCES = tutorial.md installation.md chroot.md pseudofs.md capabilities.md cgroups.md oom.md seccomp.md project-intro.md project-body.md project-rendu.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \
--number-sections \
--smart \
-M lang=fr-FR \
-M fontsize=12pt \
-M papersize=a4paper \
-M mainfont="Linux Libertine O" \
-M monofont="FantasqueSansMono-Regular" \
-M sansfont="Linux Biolinum O" \
-M colorlinks=true \
-M linkcolor="black" \
--include-in-header=../header.tex
all: tutorial.pdf all: tutorial.pdf

View file

@ -78,7 +78,7 @@ Sous Linux, les attributs sont regroupés dans des espaces de noms :
Par exemple, on peut définir un attribut sur un fichier comme cela : Par exemple, on peut définir un attribut sur un fichier comme cela :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ echo 'Hello World!' > toto 42sh$ echo 'Hello World!' > toto
42sh$ setfattr -n user.foo -v bar toto 42sh$ setfattr -n user.foo -v bar toto
42sh$ getfattr -d toto 42sh$ getfattr -d toto
@ -90,7 +90,7 @@ Par exemple, on peut définir un attribut sur un fichier comme cela :
Encore plus fort, vous pouvez utiliser les ACL POSIX : Encore plus fort, vous pouvez utiliser les ACL POSIX :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ sudo chown root:root toto && sudo chmod o-r toto 42sh$ sudo chown root:root toto && sudo chmod o-r toto
42sh$ cat toto 42sh$ cat toto
cat: toto: Permission denied cat: toto: Permission denied
@ -106,7 +106,7 @@ les ACL POSIX vous autorisent à le lire.
Vous pouvez voir ces attributs avec la commande : Vous pouvez voir ces attributs avec la commande :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ getfattr -d -m "^system" toto 42sh$ getfattr -d -m "^system" toto
# file: toto # file: toto
system.posix_acl_access=0sgAAEAD/////AgAEOgDAEAA/////xAABAD////8= system.posix_acl_access=0sgAAEAD/////AgAEOgDAEAA/////xAABAD////8=
@ -126,7 +126,7 @@ l'utilisation de cet attribut auquel on accroîtrait l'ensemble des
Si votre distribution profite de ces attributs étendus, vous devriez obtenir : Si votre distribution profite de ces attributs étendus, vous devriez obtenir :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ getfattr -d -m "^security" $(which ping) 42sh$ getfattr -d -m "^security" $(which ping)
# file: bin/ping # file: bin/ping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA= security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
@ -136,7 +136,7 @@ Si votre distribution profite de ces attributs étendus, vous devriez obtenir :
Ou, dans sa version plus lisible : Ou, dans sa version plus lisible :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ getcap $(which ping) 42sh$ getcap $(which ping)
/bin/ping = cap_net_raw+ep /bin/ping = cap_net_raw+ep
``` ```
@ -149,7 +149,7 @@ Ou, dans sa version plus lisible :
d'un processus : d'un processus :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh$ ./view_caps 1 42sh$ ./view_caps 1
cap_user_header_t cap_user_header_t
----------------- -----------------
@ -181,7 +181,7 @@ d'un processus :
Astuces : `capget(2)`, X-macros, ... Astuces : `capget(2)`, X-macros, ...
## Pour aller plus loin ## Pour aller plus loin {-}
Je vous recommande la lecture des *man* suivants : Je vous recommande la lecture des *man* suivants :

View file

@ -23,7 +23,7 @@ pas de dossier `freezer` ou si celui-ci est vide, montez-le en suivant la
procédure suivante : procédure suivante :
<div lang="en-US"> <div lang="en-US">
``` ```bash
mkdir /sys/fs/cgroup/freezer/ mkdir /sys/fs/cgroup/freezer/
mount -t cgroup -o freezer none /sys/fs/cgroup/freezer/ mount -t cgroup -o freezer none /sys/fs/cgroup/freezer/
``` ```
@ -42,7 +42,7 @@ Pour ce faire, il suffit de créer un nouveau dossier dans un groupe existant,
par exemple la racine : par exemple la racine :
<div lang="en-US"> <div lang="en-US">
``` ```bash
mkdir /sys/fs/cgroup/freezer/virli/ mkdir /sys/fs/cgroup/freezer/virli/
ls /sys/fs/cgroup/freezer/virli/ ls /sys/fs/cgroup/freezer/virli/
``` ```
@ -64,7 +64,7 @@ La liste des processus rattachés à un *cgroup* se trouve dans le fichier `task
du groupe. Pour ajouter une tâche à ce groupe, cela se passe de cette manière : du groupe. Pour ajouter une tâche à ce groupe, cela se passe de cette manière :
<div lang="en-US"> <div lang="en-US">
``` ```bash
echo $PID > /sys/fs/cgroup/freezer/virli/tasks echo $PID > /sys/fs/cgroup/freezer/virli/tasks
``` ```
</div> </div>
@ -102,7 +102,7 @@ Faisons exécuter à notre interpréteur une commande pour voir effectivement
l'exécution s'arrêter. Si vous manquez d'inspiration, utilisez : l'exécution s'arrêter. Si vous manquez d'inspiration, utilisez :
<div lang="en-US"> <div lang="en-US">
``` ```bash
for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done
``` ```
</div> </div>
@ -111,7 +111,7 @@ Maintenant, nous avons donné l'ordre au noyau de ne plus allouer de temps de
calcul à notre shell et ses fils : calcul à notre shell et ses fils :
<div lang="en-US"> <div lang="en-US">
``` ```bash
echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state
``` ```
</div> </div>
@ -120,7 +120,7 @@ calcul à notre shell et ses fils :
l'exécution : l'exécution :
<div lang="en-US"> <div lang="en-US">
``` ```bash
echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state
``` ```
</div> </div>
@ -138,7 +138,7 @@ Commençons par lancer le conteneur Docker d'InfluxDB (pour éviter de
l'installer sur notre machine) : l'installer sur notre machine) :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker container run --name mytsdb -d -p 8086:8086 influxdb docker container run --name mytsdb -d -p 8086:8086 influxdb
``` ```
</div> </div>
@ -148,7 +148,7 @@ métriques. Voici comment on s'était débrouillé dans un précédent TP pour
interagir avec InfluxDB : interagir avec InfluxDB :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker container exec -i mytsdb influxdb <<EOF docker container exec -i mytsdb influxdb <<EOF
CREATE DATABASE metrics; CREATE DATABASE metrics;
SHOW DATABASES; SHOW DATABASES;
@ -167,6 +167,7 @@ mémoire utilisée par le groupe monitoré.
Vous pouvez utiliser un programme comme `memhog` pour remplir rapidement votre Vous pouvez utiliser un programme comme `memhog` pour remplir rapidement votre
mémoire. mémoire.
<div lang="en-US">
``` ```
42sh# mkdir /sys/fs/cgroup... 42sh# mkdir /sys/fs/cgroup...
42sh$ echo $$ | sudo tee /sys/fs/cgroup.../tasks 42sh$ echo $$ | sudo tee /sys/fs/cgroup.../tasks
@ -180,6 +181,7 @@ mémoire.
~~~ 13595 ~~~ Current memory usage: 480329728/550502400 (87%) ~~~ 13595 ~~~ Current memory usage: 480329728/550502400 (87%)
~~~ 13595 ~~~ Current memory usage: 155648/550502400 (0%) ~~~ 13595 ~~~ Current memory usage: 155648/550502400 (0%)
``` ```
</div>
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
activé par défaut par votre système. Si vous êtes dans ce cas, essayez activé par défaut par votre système. Si vous êtes dans ce cas, essayez
@ -192,7 +194,7 @@ Maintenant, envoyons nos données vers la base
<https://docs.influxdata.com/influxdb/v1.6/guides/writing_data/> : <https://docs.influxdata.com/influxdb/v1.6/guides/writing_data/> :
<div lang="en-US"> <div lang="en-US">
``` ```bash
curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \ curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \
"$my_cgroup_name memory.usage_in_bytes=$(cat .../my_cgroup_name/memory.usage_in_bytes)" "$my_cgroup_name memory.usage_in_bytes=$(cat .../my_cgroup_name/memory.usage_in_bytes)"
``` ```
@ -251,7 +253,8 @@ correspondant à une valeur limite, comme par exemple
`memory.max_usage_in_bytes`, qui limite le nombre d'octets que notre groupe de `memory.max_usage_in_bytes`, qui limite le nombre d'octets que notre groupe de
processus va pouvoir allouer au maximum : processus va pouvoir allouer au maximum :
```shell <div lang="en-US">
```
42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes 42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
0 0
# 0 = Aucune limite # 0 = Aucune limite
@ -260,13 +263,14 @@ processus va pouvoir allouer au maximum :
42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes 42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
4194304 4194304
``` ```
</div>
Chaque *cgroup*s défini de nombreux indicateurs et possède de nombreux Chaque *cgroup*s défini de nombreux indicateurs et possède de nombreux
limiteurs, n'hésitez pas à consulter la documentation associée à chaque limiteurs, n'hésitez pas à consulter la documentation associée à chaque
*cgroup*. *cgroup*.
## 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 ! Control groups](https://lwn.net/Articles/604609/) est excellente !

View file

@ -15,7 +15,7 @@ Pour se créer un environnement afin de changer notre racine, il va falloir
commencer par créer le dossier de notre nouvelle racine : commencer par créer le dossier de notre nouvelle racine :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mkdir newroot mkdir newroot
``` ```
</div> </div>
@ -26,10 +26,10 @@ Queques mots, pour commencer, à propos du projet Busybox : c'est un programme
*linké* statiquement, c'est-à-dire qu'il ne va pas chercher ni charger de *linké* statiquement, c'est-à-dire qu'il ne va pas chercher ni charger de
bibliothèque dynamique à son lancement. Il se suffit donc à lui-même dans un bibliothèque dynamique à son lancement. Il se suffit donc à lui-même dans un
*chroot*, car il n'a pas de dépendances. Nous pouvons donc tester notre *chroot*, car il n'a pas de dépendances. Nous pouvons donc tester notre
première isolation : première isolation\ :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
cp $(which busybox) newroot/ cp $(which busybox) newroot/
chroot newroot /busybox ash chroot newroot /busybox ash
``` ```
@ -39,7 +39,7 @@ Jusque là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour
`bash` : `bash` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ cp $(which bash) newroot/ 42sh$ cp $(which bash) newroot/
42sh# chroot newroot /bash 42sh# chroot newroot /bash
chroot: failed to run command bash: No such file or directory chroot: failed to run command bash: No such file or directory
@ -57,7 +57,7 @@ dossier correspond au point de montage de la nouvelle racine choisie par
l'utilisateur lors de l'installation) le système de base. l'utilisateur lors de l'installation) le système de base.
<div lang="en-US"> <div lang="en-US">
```shell ```bash
debootstrap jessie newroot/ http://httpredir.debian.org/debian/ debootstrap jessie newroot/ http://httpredir.debian.org/debian/
``` ```
</div> </div>
@ -68,10 +68,10 @@ l'utilisateur lors de l'installation) le système de base.
### *stage3* ### *stage3*
Les distributions *à l'ancienne* proposent encore de télécharger leur système Les distributions *à l'ancienne* proposent encore de télécharger leur système
de base sous forme de tarball : de base sous forme de tarball\ :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
wget http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20181021T214502Z.tar.xz wget http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20181021T214502Z.tar.xz
tar xpf stage3-amd64-*.tar.xz -C newroot/ tar xpf stage3-amd64-*.tar.xz -C newroot/
``` ```
@ -81,12 +81,12 @@ L'avantage de télécharger l'archive de Gentoo est que l'on a déjà `gcc` dans
environnement qui tient dans 300 MB. environnement qui tient dans 300 MB.
## Exercice ## Exercice {-}
É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` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
make escape make escape
echo bar > ../foo echo bar > ../foo
chroot . chroot .
@ -96,7 +96,7 @@ environnement qui tient dans 300 MB.
Dans le nouvel environnement, vous ne devriez pas pouvoir faire : Dans le nouvel environnement, vous ne devriez pas pouvoir faire :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
cat ../foo cat ../foo
``` ```
</div> </div>
@ -104,8 +104,8 @@ Dans le nouvel environnement, vous ne devriez pas pouvoir faire :
Mais une fois votre programme `escape` exécuté, vous devriez pouvoir ! Mais une fois votre programme `escape` exécuté, vous devriez pouvoir !
<div lang="en-US"> <div lang="en-US">
```shell ```
./escape (chroot) 42sh# ./escape
cat /path/to/foo bash# cat /path/to/foo
``` ```
</div> </div>

View file

@ -45,7 +45,7 @@ disponibles sur la page d'accueil de <https://kernel.org>.
Dans les sources, on affiche la liste des options avec la commande : Dans les sources, on affiche la liste des options avec la commande :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
make menuconfig make menuconfig
``` ```
</div> </div>

View file

@ -61,16 +61,20 @@ exemple, pour modifier les paramètres du noyau, on passe par le fichier
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` :
```shell <div lang="en-US">
```
42sh$ cat /sys/power/state 42sh$ cat /sys/power/state
freeze mem freeze mem
``` ```
</div>
La modification d'un élément se fait avec `echo`, comme ceci : La modification d'un élément se fait avec `echo`, comme ceci :
```shell <div lang="en-US">
```bash
42sh# echo mem > /sys/power/state 42sh# echo mem > /sys/power/state
``` ```
</div>
Vous devriez constater l'effet de cette commande sans plus attendre ! Vous devriez constater l'effet de cette commande sans plus attendre !
@ -147,7 +151,7 @@ Après avoir exécuté le script, nous devrions avoir :
Voici un exemple d'utilisation : Voici un exemple d'utilisation :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh$ ./rev_kdb_leds.sh input20 42sh$ ./rev_kdb_leds.sh input20
``` ```
</div> </div>
@ -158,7 +162,7 @@ Voici un exemple d'utilisation :
Voici un exemple d'utilisation : Voici un exemple d'utilisation :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh$ ./batinfo.sh 42sh$ ./batinfo.sh
BAT0 Discharging BAT0 Discharging
==== ====
@ -184,7 +188,7 @@ Voici un exemple d'utilisation :
Voici un exemple d'utilisation : Voici un exemple d'utilisation :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh$ ./cpuinfo.sh 42sh$ ./cpuinfo.sh
cpu0 cpu0
==== ====

View file

@ -77,7 +77,7 @@ argument de l'appel système :
</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` :

View file

@ -1,22 +1,25 @@
--- ---
title: Virtualisation légère -- TP n^o^ 3 title: Virtualisation légère -- TP n^o^ 3
subtitle: Linux Internals partie 1 subtitle: Linux Internals partie 1
author: Pierre-Olivier *Nemunaire* Mercier author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Mercredi 24 octobre 2018 date: Mercredi 24 octobre 2018
abstract: |
Ce premier TP consacré aux Linux Internals va nous permettre
d'appréhender les notions de pseudos systèmes de fichiers, de
cgroups ainsi que de capabilities.
\vspace{1em}
Certains éléments de ce TP sont à rendre à <virli@nemunai.re> au
plus tard le mercredi 7 novembre 2018 à 12 h 42. Consultez la
dernière section de chaque partie pour plus d'information sur les
éléments à rendre.
En tant que personnes sensibilisées à la sécurité des échanges
électroniques, vous devrez m'envoyer vos rendus signés avec votre
clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
faire signer votre clef et n'hésitez pas à [faire signer votre
clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
... ...
Ce premier TP consacré aux Linux Internals va nous permettre d'appréhender les
notions de pseudos systèmes de fichiers, de cgroups ainsi que de capabilities.
Certains éléments de ce TP sont à rendre à <virli@nemunai.re> au plus tard le
mercredi 7 novembre 2018 à 12 h 42. Consultez la dernière section de chaque partie
pour plus d'information sur les éléments à rendre.
En tant que personnes sensibilisées à la sécurité des échanges électroniques,
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire
signer votre clef et n'hésitez pas à
[faire signer votre clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
\tableofcontents

View file

@ -1,22 +1,8 @@
include ../pandoc-opts.mk
SOURCES_TUTO = tutorial.md setup.md cmpns.md docker-exec.md mountns.md rendu.md SOURCES_TUTO = tutorial.md setup.md cmpns.md docker-exec.md mountns.md rendu.md
SOURCES_LESSON = lesson.md mount.md namespaces.md networkns.md pidns.md userns.md SOURCES_LESSON = lesson.md mount.md namespaces.md networkns.md pidns.md userns.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \
--number-sections \
--smart \
-M lang=fr-FR \
-M fontsize=12pt \
-M papersize=a4paper \
-M mainfont="Linux Libertine O" \
-M monofont="FantasqueSansMono-Regular" \
-M sansfont="Linux Biolinum O" \
-M colorlinks=true \
-M linkcolor="black" \
-M urlcolor="[rgb]{0.2,0.6,0.4}" \
--include-in-header=../header.tex
all: lesson.pdf tutorial.pdf all: lesson.pdf tutorial.pdf

View file

@ -17,7 +17,7 @@ Exemples {.unnumbered}
-------- --------
<div lang="en-US"> <div lang="en-US">
```sh ```
42sh$ ./cmpns $(pgrep influxdb) $(pgrep init) 42sh$ ./cmpns $(pgrep influxdb) $(pgrep init)
- cgroup: differ - cgroup: differ
- ipc: differ - ipc: differ
@ -30,7 +30,7 @@ Exemples {.unnumbered}
</div> </div>
<div lang="en-US"> <div lang="en-US">
```sh ```
42sh$ ./cmpns $(pgrep init) self 42sh$ ./cmpns $(pgrep init) self
- cgroup: same - cgroup: same
- ipc: same - ipc: same
@ -47,7 +47,7 @@ Ici, `self` fait référence au processus actuellement exécuté.
Et pourquoi pas : Et pourquoi pas :
<div lang="en-US"> <div lang="en-US">
```sh ```
42sh$ unshare -m ./cmpns $$ self 42sh$ unshare -m ./cmpns $$ self
- cgroup: same - cgroup: same
- ipc: same - ipc: same

View file

@ -17,11 +17,11 @@ Pour savoir si vous avez réussi, comparez les sorties des commandes :
- ... - ...
Tests {.unnumbered} Tests {-}
----- -----
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh$ docker run --name mywebserver -d -p 80:80 nginx 42sh$ docker run --name mywebserver -d -p 80:80 nginx
d63ceae863956f8312aca60b7a57fbcc1fdf679ae4c90c5d9455405005d4980a d63ceae863956f8312aca60b7a57fbcc1fdf679ae4c90c5d9455405005d4980a
42sh$ docker container inspect --format '{{ .State.Pid }}' mywebserver 42sh$ docker container inspect --format '{{ .State.Pid }}' mywebserver

View file

@ -1,14 +1,12 @@
--- ---
title: Virtualisation légère -- Linux Internals partie 2 title: Virtualisation légère -- Linux Internals partie 2
subtitle: Support de cours subtitle: Support de cours
author: Pierre-Olivier *nemunaire* Mercier author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Mercredi 7 novembre 2018 date: Mercredi 7 novembre 2018
abstract: |
Le but de cette seconde partie sur les mécanismes internes du noyau
va nous permettre d'utiliser les commandes et les appels systèmes
relatifs aux espaces de noms du noyau Linux ainsi que d'appréhender
la complexité des sytèmes de fichiers.
... ...
Le but de cette seconde partie sur les mécanismes internes du noyau va nous
permettre d'utiliser les commandes et les appels systèmes relatifs aux espaces
de noms du noyau Linux ainsi que d'appréhender la complexité des sytèmes de
fichiers.
\tableofcontents

View file

@ -63,7 +63,7 @@ Lorsque l'on souhaite monter à un deuxième endroit (ou plus) une partition, on
utilise le *bind mount* : utilise le *bind mount* :
<div lang="en-US"> <div lang="en-US">
``` ```bash
mount --bind olddir newdir mount --bind olddir newdir
``` ```
</div> </div>
@ -81,7 +81,7 @@ Pour que tout cela fonctionne, nous aurons besoin, au préalable, d'exécuter le
commandes suivantes : commandes suivantes :
<div lang="en-US"> <div lang="en-US">
``` ```bash
cd newroot cd newroot
mount --bind /dev dev mount --bind /dev dev
mount --bind /proc proc mount --bind /proc proc
@ -104,7 +104,7 @@ d'accroche qu'il contient, il faut utiliser `--rbind`. Il serait donc plus
correct de lancer : correct de lancer :
<div lang="en-US"> <div lang="en-US">
``` ```bash
cd newroot cd newroot
mount --rbind /dev dev mount --rbind /dev dev
mount -t proc none proc mount -t proc none proc
@ -128,7 +128,7 @@ Dans un montage partagé, une nouvelle accroche sera propagée parmi tous les
systèmes de fichiers de ce partage (on parle de *peer group*). systèmes de fichiers de ce partage (on parle de *peer group*).
<div lang="en-US"> <div lang="en-US">
```shell ```bash
# Création de notre répertoire de travail # Création de notre répertoire de travail
mkdir /mnt/test-shared mkdir /mnt/test-shared
@ -144,7 +144,7 @@ Si l'on attache un nouveau point de montage dans `/tmp` ou dans
`/mnt/test-shared`, avec la politique `shared`, l'accroche sera propagée : `/mnt/test-shared`, avec la politique `shared`, l'accroche sera propagée :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mkdir /mnt/test-shared/toto mkdir /mnt/test-shared/toto
mount -t tmpfs none /mnt/test-shared/toto mount -t tmpfs none /mnt/test-shared/toto
``` ```
@ -161,7 +161,7 @@ propagera, mais seulement dans un sens. Le point de montage déclaré comme
esclave ne propagera pas ses nouveaux points de montage à son *maître*. esclave ne propagera pas ses nouveaux points de montage à son *maître*.
<div lang="en-US"> <div lang="en-US">
```shell ```bash
# Suite de l'exemple précédent # Suite de l'exemple précédent
cd /mnt/test-slave cd /mnt/test-slave
@ -176,7 +176,7 @@ esclave ne propagera pas ses nouveaux points de montage à son *maître*.
Si l'on effectue un montage dans `/mnt/test-shared` : Si l'on effectue un montage dans `/mnt/test-shared` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mkdir /mnt/test-shared/foo mkdir /mnt/test-shared/foo
mount -t tmpfs none /mnt/test-shared/foo mount -t tmpfs none /mnt/test-shared/foo
``` ```
@ -185,7 +185,7 @@ Si l'on effectue un montage dans `/mnt/test-shared` :
Le point de montage apparaît bien sous `/mnt/test-slave/foo`. Par contre : Le point de montage apparaît bien sous `/mnt/test-slave/foo`. Par contre :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mkdir /mnt/test-slave/bar mkdir /mnt/test-slave/bar
mount -t tmpfs none /mnt/test-slave/bar mount -t tmpfs none /mnt/test-slave/bar
``` ```
@ -203,7 +203,7 @@ Pour forcer un point d'accroche à ne pas propager et à ne pas recevoir de
propagation, on utilise l'option suivante : propagation, on utilise l'option suivante :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mount --make-private mountpoint mount --make-private mountpoint
``` ```
</div> </div>
@ -214,7 +214,7 @@ propagation, on utilise l'option suivante :
Ce mode interdira tout tentative d'attache à un autre endroit. Ce mode interdira tout tentative d'attache à un autre endroit.
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mount --make-unbindable /mnt/test-slave mount --make-unbindable /mnt/test-slave
``` ```
</div> </div>
@ -222,7 +222,7 @@ Ce mode interdira tout tentative d'attache à un autre endroit.
Il ne sera pas possible de faire : Il ne sera pas possible de faire :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mkdir /mnt/test-unbindable mkdir /mnt/test-unbindable
mount --bind /mnt/test-slave /mnt/test-unbindable mount --bind /mnt/test-slave /mnt/test-unbindable
``` ```
@ -236,7 +236,7 @@ existe les mêmes options pour les appliquer en cascade sur les points d'attache
contenus dans leur sous-arbre : contenus dans leur sous-arbre :
<div lang="en-US"> <div lang="en-US">
``` ```bash
mount --make-rshared mountpoint mount --make-rshared mountpoint
mount --make-rslave mountpoint mount --make-rslave mountpoint
mount --make-rprivate mountpoint mount --make-rprivate mountpoint
@ -269,7 +269,7 @@ emplacement soient prévenu du changement.
On utilise pour cela l'option `--move` de `mount(8)` : On utilise pour cela l'option `--move` de `mount(8)` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mount --move olddir newdir mount --move olddir newdir
``` ```
</div> </div>
@ -277,7 +277,7 @@ On utilise pour cela l'option `--move` de `mount(8)` :
Par exemple : Par exemple :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mount --move /dev /newroot/dev mount --move /dev /newroot/dev
``` ```
</div> </div>
@ -287,7 +287,7 @@ racine de notre système de fichiers : par exemple pour passer de l'*initramfs*
au système démarré, de notre système hôte au système d'un conteneur, ... au système démarré, de notre système hôte au système d'un conteneur, ...
## Aller plus loin ## Aller plus loin {-}
Voici quelques articles qui valent le détour, en lien avec les points de Voici quelques articles qui valent le détour, en lien avec les points de
montage : montage :

View file

@ -17,7 +17,7 @@ Nous allons essayer de changer la racine de notre système de fichier. À la
différence d'un `chroot(2)`, changer de racine est quelque chose d'un peu plus différence d'un `chroot(2)`, changer de racine est quelque chose d'un peu plus
sportif car il s'agit de ne plus avoir aucune trace de l'ancienne racine. Au sportif car il s'agit de ne plus avoir aucune trace de l'ancienne racine. Au
moins ici, il ne sera certainement pas possible de revenir en arrière dans moins ici, il ne sera certainement pas possible de revenir en arrière dans
l'arborescence ! l'arborescence\ !
Pour l'instant, votre système utilise sans doute la partition d'un disque Pour l'instant, votre système utilise sans doute la partition d'un disque
physique comme racine de son système de fichier. Le changement de racine, va physique comme racine de son système de fichier. Le changement de racine, va
@ -39,7 +39,7 @@ ne se trouvait pas à la racine d'une partition au moment du basculement.
Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs` : Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# mkdir /mnt/newroot 42sh# mkdir /mnt/newroot
42sh# mount -t tmpfs none /mnt/newroot 42sh# mount -t tmpfs none /mnt/newroot
``` ```
@ -73,7 +73,7 @@ devoir nous isoler sur :
Isolons-nous : Isolons-nous :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# unshare -p -m -f --mount-proc 42sh# unshare -p -m -f --mount-proc
``` ```
</div> </div>
@ -89,7 +89,7 @@ Commençons donc par étiqueter tous nos points de montage (de ce *namespace*),
comme esclave : comme esclave :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# mount --make-rslave / 42sh# mount --make-rslave /
``` ```
</div> </div>
@ -131,7 +131,7 @@ Pour lancer la première commande dans la nouvelle racine, on passe généraleme
par : par :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# exec chroot / command 42sh# exec chroot / command
``` ```
</div> </div>

View file

@ -44,9 +44,11 @@ notre *namespace* est d'appliquer le type esclave à l'ensemble de nos points de
montage, récursivement, dès que l'on est entré dans notre nouvel espace de montage, récursivement, dès que l'on est entré dans notre nouvel espace de
noms. noms.
```shell <div lang="en-US">
```bash
mount --make-rslave / mount --make-rslave /
``` ```
</div>
### L'espace de noms `UTS` {#uts-ns} ### L'espace de noms `UTS` {#uts-ns}
@ -148,7 +150,7 @@ Par exemple, nous pouvons modifier sans crainte le nom de notre machine, si
nous sommes passés dans un autre *namespace* `UTS` : nous sommes passés dans un autre *namespace* `UTS` :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh# hostname --fqdn 42sh# hostname --fqdn
koala.zoo.paris koala.zoo.paris
42sh# sudo unshare -u /bin/bash 42sh# sudo unshare -u /bin/bash
@ -253,7 +255,7 @@ auquel on passe le *file descriptor* d'un des liens du dossier
Dans un shell, on utilisera la commande `nsenter(1)` : Dans un shell, on utilisera la commande `nsenter(1)` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# nsenter --uts=/proc/42/ns/uts /bin/bash 42sh# nsenter --uts=/proc/42/ns/uts /bin/bash
``` ```
</div> </div>
@ -275,7 +277,7 @@ Lorsque l'on a besoin de référencer un *namespace* (par exemple pour le faire
persister après le dernier processus), on peut utiliser un `mount bind` : persister après le dernier processus), on peut utiliser un `mount bind` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# touch /tmp/ns/myrefns 42sh# touch /tmp/ns/myrefns
42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns 42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns
``` ```
@ -296,7 +298,7 @@ Même en étant attaché à un fichier du disque, il s'agit d'un pointeur vers u
structure du noyau, qui ne persistera pas au redémarrage. structure du noyau, qui ne persistera pas au redémarrage.
## Aller plus loin ## Aller plus loin {-}
Je vous recommande la lecture des *man* suivants : Je vous recommande la lecture des *man* suivants :

View file

@ -13,7 +13,7 @@ En entrant dans un nouvel espace de nom `network`, on se retrouve dans un
environnement qui n'a plus qu'une interface de *loopback* : environnement qui n'a plus qu'une interface de *loopback* :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh# unshare -n ip a 42sh# unshare -n ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
@ -38,7 +38,7 @@ La suite d'outils `iproute2` propose une interface simplifiée pour utiliser le
Nous pouvons tout d'abord créer un nouvel espace de nom : Nous pouvons tout d'abord créer un nouvel espace de nom :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# ip netns add virli 42sh# ip netns add virli
``` ```
</div> </div>
@ -53,7 +53,7 @@ Maintenant que notre *namespace* est créé, nous pouvons regarder s'il contient
des interfaces : des interfaces :
<div lang="en-US"> <div lang="en-US">
```sh ```
42sh# ip netns exec virli ip link 42sh# ip netns exec virli ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
@ -67,7 +67,7 @@ D'ailleurs, cette interface est rapportée comme étant désactivée, activons-l
via la commande : via la commande :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# ip netns exec virli ip link set dev lo up 42sh# ip netns exec virli ip link set dev lo up
``` ```
</div> </div>
@ -75,7 +75,7 @@ via la commande :
À ce stade, nous pouvons déjà commencer à lancer un `ping` sur cette interface: À ce stade, nous pouvons déjà commencer à lancer un `ping` sur cette interface:
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh# ip netns exec virli ping 127.0.0.1 42sh# ip netns exec virli ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms
@ -112,7 +112,7 @@ devient alors possible de réaliser un échange de paquets entre les deux.
Pour déplacer `veth1` dans notre *namespace* `virli` : Pour déplacer `veth1` dans notre *namespace* `virli` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# ip link set veth1 netns virli 42sh# ip link set veth1 netns virli
``` ```
</div> </div>
@ -120,7 +120,7 @@ Pour déplacer `veth1` dans notre *namespace* `virli` :
Il ne reste maintenant plus qu'à assigner une IP à chacune des interfaces : Il ne reste maintenant plus qu'à assigner une IP à chacune des interfaces :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# ip netns exec virli ip a add 10.10.10.42/24 dev veth1 42sh# ip netns exec virli ip a add 10.10.10.42/24 dev veth1
42sh# ip a add 10.10.10.41/24 dev veth0 42sh# ip a add 10.10.10.41/24 dev veth0
``` ```
@ -132,7 +132,7 @@ Dès lors[^linkdown], nous pouvons `ping`er chaque extrêmité :
vethX up`. vethX up`.
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh# ping 10.10.10.42 42sh# ping 10.10.10.42
- et - - et -
42sh# ip netns exec virli ping 10.10.10.41 42sh# ip netns exec virli ping 10.10.10.41
@ -229,7 +229,7 @@ Pour construire une nouvelle interface de ce type :
</div> </div>
## Aller plus loin ## Aller plus loin {-}
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 :

View file

@ -23,7 +23,7 @@ trouve.
Première étape s'isoler : Première étape s'isoler :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# unshare --pid --fork /bin/bash 42sh# unshare --pid --fork /bin/bash
``` ```
</div> </div>
@ -50,7 +50,7 @@ notre système initial. Pour s'en sortir, il est nécessaire de s'isoler du
Voici la nouvelle ligne de commande que l'on va utiliser : Voici la nouvelle ligne de commande que l'on va utiliser :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# unshare --pid --mount --fork --mount-proc /bin/bash 42sh# unshare --pid --mount --fork --mount-proc /bin/bash
``` ```
</div> </div>
@ -94,7 +94,7 @@ l'extérieur du conteneur, les propriétés d'`init` sont biens appliquées à
l'intérieur pour conserver un comportement cohérent. l'intérieur pour conserver un comportement cohérent.
## Aller plus loin ## Aller plus loin {-}
N'hésitez pas à jeter un œil à la page de manuel consacré à cet espace de N'hésitez pas à jeter un œil à la page de manuel consacré à cet espace de
noms : `pid_namespaces(7)`. noms : `pid_namespaces(7)`.

View file

@ -94,9 +94,11 @@ noyau pour adapter le comportement.
Si vous utilisez Debian ou l'un de ses dérivés, vous devrez autoriser Si vous utilisez Debian ou l'un de ses dérivés, vous devrez autoriser
explicitement cette utilisation non-privilégiée : explicitement cette utilisation non-privilégiée :
```shell <div lang="en-US">
```bash
42sh# sysctl -w kernel.unprivileged_userns_clone=1 42sh# sysctl -w kernel.unprivileged_userns_clone=1
``` ```
</div>
### Grsecurity {.unnumbered} ### Grsecurity {.unnumbered}

View file

@ -1,22 +1,24 @@
--- ---
title: Virtualisation légère -- TP n^o^ 4 title: Virtualisation légère -- TP n^o^ 4
subtitle: Linux Internals partie 2 subtitle: Linux Internals partie 2
author: Pierre-Olivier *nemunaire* Mercier author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Mercredi 7 novembre 2018 date: Mercredi 7 novembre 2018
abstract: |
Le but de ce second TP sur les mécanismes internes du noyau va nous
permettre d'utiliser les commandes et les appels systèmes relatifs
aux *namespaces* ainsi que d'appréhender la complexité des systèmes
de fichiers.
\vspace{1em}
Tous les exercices de ce TP sont à rendre à <virli@nemunai.re> au
plus tard le mercredi 14 novembre 2017 à 12 h 42.
En tant que personnes sensibilisées à la sécurité des échanges
électroniques, vous devrez m'envoyer vos rendus signés avec votre
clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
faire signer votre clef et n'hésitez pas à [faire signer votre
clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
... ...
Le but de ce second TP sur les mécanismes internes du noyau va nous permettre
d'utiliser les commandes et les appels systèmes relatifs aux *namespaces* ainsi
que d'appréhender la complexité des systèmes de fichiers.
Tous les exercices de ce TP sont à rendre à <virli@nemunai.re> au plus tard le
mercredi 14 novembre 2017 à 12 h 42.
En tant que personnes sensibilisées à la sécurité des échanges électroniques,
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire
signer votre clef et n'hésitez pas à
[faire signer votre clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
\tableofcontents

View file

@ -98,7 +98,7 @@ des groupes au lieu des utilisateurs.
## Utilisation de l'espace de noms ## Utilisation de l'espace de noms
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash 42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash
``` ```
</div> </div>
@ -110,7 +110,7 @@ jeu. L'idée étant que l'on a été désigné root dans son conteneur, on devra
pouvoir y faire ce que l'on veut, tant que l'on n'agit pas en dehors. pouvoir y faire ce que l'on veut, tant que l'on n'agit pas en dehors.
## Aller plus loin ## Aller plus loin {-}
N'hésitez pas à jeter un œil à la page du manuel consacré à ce *namespace* : N'hésitez pas à jeter un œil à la page du manuel consacré à ce *namespace* :
`user_namespaces(7)`. `user_namespaces(7)`.

View file

@ -1,19 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md setup.md what.md manual.md compose.md security.md rendu.md SOURCES = tutorial.md setup.md what.md manual.md compose.md security.md rendu.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \
--number-sections \
--smart \
-M lang=fr-FR \
-M fontsize=12pt \
-M papersize=a4paper \
-M mainfont="Linux Libertine O" \
-M monofont="FantasqueSansMono-Regular" \
-M sansfont="Linux Biolinum O" \
-M colorlinks=true \
-M linkcolor="black" \
-M urlcolor="[rgb]{0.2,0.6,0.4}" \
--include-in-header=../header.tex
all: tutorial.pdf all: tutorial.pdf

View file

@ -145,7 +145,7 @@ Une fois le build terminé, nous pouvons lancer la commande suivante et admirer
le résultat : le résultat :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker-compose up docker-compose up
``` ```
</div> </div>

View file

@ -47,7 +47,7 @@ le client fourni :
<div lang="en-US"> <div lang="en-US">
``` ```
42sh$ docker container run --rm -it --link mytsdb:influxdb \ 42sh$ docker container run --rm -it --link mytsdb:influxdb \
--entrypoint "/usr/bin/influx" influxdb -host influxdb > --entrypoint "/usr/bin/influx" influxdb -host influxdb
Connected to http://influxdb:8086 version 1.6.3 Connected to http://influxdb:8086 version 1.6.3
InfluxDB shell version: 1.6.3 InfluxDB shell version: 1.6.3
> show databases > show databases
@ -84,7 +84,7 @@ Tentons maintenant de remplir notre base de données avec les métriques du
système. Pour cela, on commence par télécharger *Telegraf* : système. Pour cela, on commence par télécharger *Telegraf* :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
curl https://dl.influxdata.com/telegraf/releases/telegraf-1.8.1-static_linux_amd64.tar.gz | \ curl https://dl.influxdata.com/telegraf/releases/telegraf-1.8.1-static_linux_amd64.tar.gz | \
tar xzv -C /tmp tar xzv -C /tmp
``` ```
@ -93,7 +93,7 @@ système. Pour cela, on commence par télécharger *Telegraf* :
Puis, lançons *Telegraf* : Puis, lançons *Telegraf* :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
cd /tmp/telegraf cd /tmp/telegraf
./telegraf --config telegraf.conf ./telegraf --config telegraf.conf
``` ```
@ -107,9 +107,9 @@ rediriger le port de notre conteneur sur notre machine locale (option `-p`).
Et observons ensuite : Et observons ensuite :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ docker container run --rm -it --link mytsdb:influxdb \ 42sh$ docker container run --rm -it --link mytsdb:influxdb \
--entrypoint "/usr/bin/influx" influxdb -host influxdb > --entrypoint "/usr/bin/influx" influxdb -host influxdb
InfluxDB shell version: 1.6.3 InfluxDB shell version: 1.6.3
> show databases > show databases
name: databases name: databases
@ -142,7 +142,7 @@ lancé, celui-ci va régulièrement envoyer des métriques de cette machine.
## Afficher les données collectées ## Afficher les données collectées
\hspace{2em}**Exercice :** À vous de jouer pour lancer le conteneur **Exercice :** À vous de jouer pour lancer le conteneur
[*Chronograf*](https://store.docker.com/images/chronograf). [*Chronograf*](https://store.docker.com/images/chronograf).
L'interface de *Chronograf* est disponible sur le port 8888. L'interface de *Chronograf* est disponible sur le port 8888.
@ -150,10 +150,9 @@ L'interface de *Chronograf* est disponible sur le port 8888.
Consultez la [documentation du conteneur](https://hub.docker.com/_/chronograf) Consultez la [documentation du conteneur](https://hub.docker.com/_/chronograf)
si besoin. si besoin.
*Attention :* la page d'accueil est vide au démarrage, pour savoir si vous avez **Attention :** la page d'accueil est vide au démarrage, pour savoir si vous avez
réussi, rendez-vous sous l'onglet *Hosts*, le nom de votre machine devrait y réussi, rendez-vous sous l'onglet *Hosts*, le nom de votre machine devrait y
apparaître. En cliquant dessus vous obtiendrez des graphiques similaires à ceux apparaître. En cliquant dessus vous obtiendrez des graphiques similaires à ceux
ci-dessous : ci-dessous :
![Résultat obtenu](chronograf_latest.png) ![Résultat obtenu](chronograf_latest.png)

View file

@ -32,7 +32,7 @@ L'équipe en charge de Docker compose met à disposition un exécutable contenan
tous les scripts. Nous pouvons l'installer en suivant la procédure suivante : tous les scripts. Nous pouvons l'installer en suivant la procédure suivante :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-Linux-x86_64 \ curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-Linux-x86_64 \
> /usr/bin/docker-compose > /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose chmod +x /usr/bin/docker-compose

View file

@ -1,22 +1,23 @@
--- ---
title: Virtualisation légère -- TP n^o^ 2.2 title: Virtualisation légère -- TP n^o^ 2.2
subtitle: Aller plus loin avec Docker subtitle: Aller plus loin avec Docker
author: Pierre-Olivier *Nemunaire* Mercier author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Jeudi 18 octobre 2017 date: Jeudi 18 octobre 2017
... abstract: |
Dans cette deuxième partie du TP, nous allons approfondir l'utilisation de
Docker !
Dans cette deuxième partie du TP, nous allons approfondir l'utilisation de Docker ! \vspace{1em}
Tous les éléments de ce TP (exercices et projet) sont à rendre à Tous les éléments de ce TP (exercices et projet) sont à rendre à
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2017 à 0 h 42. Consultez la <virli@nemunai.re> au plus tard le mercredi 24 octobre 2017 à 0
dernière section de chaque partie pour plus d'information sur les éléments à h 42. Consultez la dernière section de chaque partie pour plus d'information
rendre. sur les éléments à rendre.
En tant que personnes sensibilisées à la sécurité des échanges électroniques, En tant que personnes sensibilisées à la sécurité des échanges électroniques,
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire [me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
signer votre clef et n'hésitez pas à faire signer votre clef et n'hésitez pas à [faire signer votre
[faire signer votre clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/). clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
...
\tableofcontents

View file

@ -1,19 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md installation.md what.md first.md cleaning.md ex-flask.md volumes.md linking.md rendu.md SOURCES = tutorial.md installation.md what.md first.md cleaning.md ex-flask.md volumes.md linking.md rendu.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \
--number-sections \
--smart \
-M lang=fr-FR \
-M fontsize=12pt \
-M papersize=a4paper \
-M mainfont="Linux Libertine O" \
-M monofont="FantasqueSansMono-Regular" \
-M sansfont="Linux Biolinum O" \
-M colorlinks=true \
-M linkcolor="black" \
-M urlcolor="[rgb]{0.2,0.6,0.4}" \
--include-in-header=../header.tex
all: tutorial.pdf all: tutorial.pdf

View file

@ -32,7 +32,7 @@ Il y a de fortes chances pour que vous n'ayez plus besoin de ces vieux
conteneurs. Pour les supprimer, utilisez la commande : conteneurs. Pour les supprimer, utilisez la commande :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container rm 0e8bbff6d500 552d71619723 docker container rm 0e8bbff6d500 552d71619723
``` ```
</div> </div>
@ -40,7 +40,7 @@ conteneurs. Pour les supprimer, utilisez la commande :
ou encore : ou encore :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container rm cranky_jones dreamy_gates docker container rm cranky_jones dreamy_gates
``` ```
</div> </div>
@ -62,6 +62,6 @@ une commande `prune` qui supprimera les objets inutilisés.
## `docker-gc` ## `docker-gc`
Vous pouvez également utiliser l'image <https://github.com/spotify/docker-gc> Vous pouvez également utiliser l'image
pour effectuer le ménage de manière automatique, plus fréquemment. Mais [https://github.com/spotify/docker-gc](`docker-gc`) pour effectuer le ménage de
attention à vos données ! manière automatique, plus fréquemment. Mais attention à vos données !

View file

@ -12,7 +12,7 @@ page : <https://you.p0m.fr/>.
Nous pouvons télécharger et lancer le service grâce à : Nous pouvons télécharger et lancer le service grâce à :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run -i nemunaire/youp0m docker container run -i nemunaire/youp0m
``` ```
</div> </div>
@ -35,7 +35,7 @@ interférer avec son hôte.
Nous pouvons rediriger le port avec l'argument <span lang="en-US">`-p dst_host:src_cntr`</span> : Nous pouvons rediriger le port avec l'argument <span lang="en-US">`-p dst_host:src_cntr`</span> :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run -i -p 8080:8080 nemunaire/youp0m docker container run -i -p 8080:8080 nemunaire/youp0m
``` ```
</div> </div>
@ -46,7 +46,7 @@ Pour le moment, le service ne dispose d'aucune image à afficher, vous pouvez
utiliser cette syntaxe pour ajouter une image : utiliser cette syntaxe pour ajouter une image :
<div lang="en-US"> <div lang="en-US">
``` ```bash
base64 monimage.jpg | curl --data @- http://localhost:8080/api/images/monimage base64 monimage.jpg | curl --data @- http://localhost:8080/api/images/monimage
``` ```
</div> </div>
@ -54,7 +54,7 @@ utiliser cette syntaxe pour ajouter une image :
Si vous n'êtes pas particulièrement inspiré, vous pouvez ajouter ces images : Si vous n'êtes pas particulièrement inspiré, vous pouvez ajouter ces images :
<div lang="en-US"> <div lang="en-US">
``` ```bash
wget -O- https://you.p0m.fr/images/lynx4 | base64 | curl --data @- http://localhost:8080/api/images/lynx wget -O- https://you.p0m.fr/images/lynx4 | base64 | curl --data @- http://localhost:8080/api/images/lynx
wget -O- https://you.p0m.fr/images/otters | base64 | curl --data @- http://localhost:8080/api/images/otters wget -O- https://you.p0m.fr/images/otters | base64 | curl --data @- http://localhost:8080/api/images/otters
wget -O- https://you.p0m.fr/images/DNcrZ6u | base64 | curl --data @- http://localhost:8080/api/images/DNcrZ6u wget -O- https://you.p0m.fr/images/DNcrZ6u | base64 | curl --data @- http://localhost:8080/api/images/DNcrZ6u
@ -72,7 +72,7 @@ service ne s'exécutera pas dans notre terminal !
On utilise l'option `-d` pour lancer le conteneur en tâche de fond : On utilise l'option `-d` pour lancer le conteneur en tâche de fond :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run -d -p 8080:8080 nemunaire/youp0m docker container run -d -p 8080:8080 nemunaire/youp0m
``` ```
</div> </div>
@ -82,7 +82,7 @@ obtenir avec un `docker container ls`), nous pouvons consulter les logs du
service (en fait, les sorties standard et d'erreur) : service (en fait, les sorties standard et d'erreur) :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container logs 0123456789abcdef docker container logs 0123456789abcdef
``` ```
</div> </div>
@ -99,7 +99,7 @@ On ne peut pas utiliser le même port sur la machine hôte, mais pour le reste,
il s'agit des mêmes options : il s'agit des mêmes options :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run -d -p 8080:8081 nemunaire/youp0m docker container run -d -p 8080:8081 nemunaire/youp0m
``` ```
</div> </div>
@ -117,7 +117,7 @@ Lorsque l'on souhaite stopper un conteneur lancé en tâche de fond, on utilise
son identifiant dans la commande suivante : son identifiant dans la commande suivante :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container stop 0123456789abcdef docker container stop 0123456789abcdef
``` ```
</div> </div>

View file

@ -4,10 +4,10 @@ Mon premier conteneur
===================== =====================
Afin de tester la bonne marche de notre installation, lançons notre premier Afin de tester la bonne marche de notre installation, lançons notre premier
conteneur avec la commande : conteneur avec la commande\ :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run hello-world docker container run hello-world
``` ```
</div> </div>
@ -26,7 +26,7 @@ Nous pouvons directement utiliser le client pour rechercher une image sur le
*Store*, en utilisant la commande `search` : *Store*, en utilisant la commande `search` :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker search mariadb docker search mariadb
``` ```
</div> </div>
@ -35,7 +35,7 @@ Il est possible de mettre à jour les images locales ou simplement
pré-télécharger des images depuis le Store en utilisant la commande `pull` : pré-télécharger des images depuis le Store en utilisant la commande `pull` :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker image pull ubuntu docker image pull ubuntu
``` ```
</div> </div>
@ -59,7 +59,7 @@ Par exemple, pour consulter la liste des images dont nous disposons localement
nous-même), on utilise la commande `ls` sous le type d'objets `image` : nous-même), on utilise la commande `ls` sous le type d'objets `image` :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker image ls docker image ls
``` ```
</div> </div>
@ -88,7 +88,7 @@ lancer dans le conteneur ainsi que ses éventuels arguments. Essayons d'afficher
un Hello World : un Hello World :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run ubuntu /bin/echo "Hello World" docker container run ubuntu /bin/echo "Hello World"
``` ```
</div> </div>
@ -103,7 +103,7 @@ n'utilisez pas [Alpine Linux](https://www.alpine-linux.org), vous pourriez
tenter d'utiliser son gestionnaire de paquet `apk`, via : tenter d'utiliser son gestionnaire de paquet `apk`, via :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run alpine /sbin/apk stats docker container run alpine /sbin/apk stats
``` ```
</div> </div>
@ -139,7 +139,7 @@ du `run`. En fait, tout comme `git(1)` et ses sous-commandes, chaque niveau de
commande peut prendre des paramètres : commande peut prendre des paramètres :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker DOCKER_PARAMS container run RUN_OPTS image IMAGE_CMD IMAGE_ARGS ... docker DOCKER_PARAMS container run RUN_OPTS image IMAGE_CMD IMAGE_ARGS ...
``` ```
</div> </div>
@ -147,7 +147,7 @@ commande peut prendre des paramètres :
Par exemple : Par exemple :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker -H unix:///var/run/docker.sock container run -it alpine /bin/ash -c "echo foo" docker -H unix:///var/run/docker.sock container run -it alpine /bin/ash -c "echo foo"
``` ```
</div> </div>

View file

@ -82,7 +82,7 @@ un bac à sable dans lequel vous pourrez commencer à faire ce TP.
Vous devriez maintenant être capable de lancer la commande suivante : Vous devriez maintenant être capable de lancer la commande suivante :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker version docker version
``` ```
</div> </div>
@ -138,7 +138,7 @@ Si vous avez cette erreur : `dial unix /var/run/docker.sock: no such file or
directory.`, le deamon n'est sans doute pas lancé. Lancez-le : directory.`, le deamon n'est sans doute pas lancé. Lancez-le :
<div lang="en-US"> <div lang="en-US">
``` ```bash
sudo service docker restart sudo service docker restart
``` ```
</div> </div>
@ -151,7 +151,7 @@ denied.`, ajoutez votre utilisateur au groupe `docker` et **relancez votre
session** : session** :
<div lang="en-US"> <div lang="en-US">
``` ```bash
sudo gpasswd -a $USER docker sudo gpasswd -a $USER docker
``` ```
</div> </div>

View file

@ -78,7 +78,7 @@ La création d'un réseau se fait tout simplement au travers des sous-commandes
relatives aux objets Docker `network` : relatives aux objets Docker `network` :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker network create --driver bridge my_fic docker network create --driver bridge my_fic
``` ```
</div> </div>
@ -88,7 +88,7 @@ C'est ensuite ce nom de réseau que vous passerez à l'option `--network` de vos
réseau : réseau :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker network connect NETWORK CONTAINER docker network connect NETWORK CONTAINER
``` ```
</div> </div>
@ -98,7 +98,7 @@ mutuellement se découvrir grâce à un système de résolution de nom basé sur
nom de conteneur. nom de conteneur.
## 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.
@ -108,7 +108,7 @@ de données avec le nom d'utilisateur et le mot de passe par défaut. Vous les
obtiendrez en lisant l'aide : obtiendrez en lisant l'aide :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run --rm -e MYSQL_HOST="tcp(mysql_cntr_name:3306)" nemunaire/fic-admin -help docker container run --rm -e MYSQL_HOST="tcp(mysql_cntr_name:3306)" nemunaire/fic-admin -help
``` ```
</div> </div>

View file

@ -38,7 +38,7 @@ a pu voir durant ce premier cours.
### Exemple d'exécution ### Exemple d'exécution
<div lang="en-US"> <div lang="en-US">
``` ```bash
42sh$ ./mycloud-run.sh 42sh$ ./mycloud-run.sh
http://localhost:12345/ http://localhost:12345/
42sh$ #docker kill db 42sh$ #docker kill db

View file

@ -1,22 +1,23 @@
--- ---
title: Virtualisation légère -- TP n^o^ 1 title: Virtualisation légère -- TP n^o^ 1
subtitle: Les bases de Docker subtitle: Les bases de Docker
author: Pierre-Olivier *Nemunaire* Mercier author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Jeudi 4 octobre 2018 date: Jeudi 4 octobre 2018
... abstract: |
Durant ce premier TP, nous allons apprendre à utiliser Docker ! Durant ce premier TP, nous allons apprendre à utiliser Docker !
Le TP se termine par un petit projet à rendre à <virli@nemunai.re> au plus tard \vspace{1em}
le jeudi 18 octobre 2018 à 8 h 42, des questions de cours sont également à
compléter avant cette date sur Epitaf. Consultez la dernière partie de ce TP
pour les modalités.
En tant que personnes sensibilisées à la sécurité des échanges électroniques, Le TP se termine par un petit projet à rendre à <virli@nemunai.re>
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à au plus tard le jeudi 18 octobre 2018 à 8 h 42, des questions de
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire cours sont également à compléter avant cette date sur
signer votre clef et n'hésitez pas à Epitaf. Consultez la dernière partie de ce TP pour les modalités.
[faire signer la votre](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
\tableofcontents En tant que personnes sensibilisées à la sécurité des échanges
électroniques, vous devrez m'envoyer vos rendus signés avec votre
clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
faire signer votre clef et n'hésitez pas à [faire signer la
votre](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
...

View file

@ -28,7 +28,7 @@ le protocole HTTP, mais sans se casser la tête à installer et configurer un
serveur web : serveur web :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run --rm -p 80:80 -v ~/Downloads:/usr/share/nginx/html:ro -d nginx docker container run --rm -p 80:80 -v ~/Downloads:/usr/share/nginx/html:ro -d nginx
``` ```
</div> </div>
@ -48,7 +48,7 @@ Comme il s'agit d'un objet, la première chose à faire va être de créer notre
volume : volume :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker volume create prod_youp0m docker volume create prod_youp0m
docker volume create prod_foodp0m docker volume create prod_foodp0m
``` ```
@ -57,7 +57,7 @@ volume :
Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple : Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run --mount source=prod_youp0m,target=/srv/images nemunaire/youp0m docker container run --mount source=prod_youp0m,target=/srv/images nemunaire/youp0m
``` ```
</div> </div>
@ -65,7 +65,7 @@ Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple :
On pourra également faire de même avec un conteneur MySQL : On pourra également faire de même avec un conteneur MySQL :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run --name mydb --mount source=prod_db,target=/var/lib/mysql \ docker container run --name mydb --mount source=prod_db,target=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
``` ```
@ -78,7 +78,7 @@ Si plus tard, vous souhaitez créer un conteneur chargé de faire des
sauvegardes, vous pourriez le lancer comme ceci : sauvegardes, vous pourriez le lancer comme ceci :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run -it --volume-from mydb busybox /bin/bash docker container run -it --volume-from mydb busybox /bin/bash
``` ```
</div> </div>
@ -90,10 +90,10 @@ Lorsque vous n'avez pas besoin de stocker les données et que vous ne désirez
pas qu'elles persistent (des données sensibles par exemple) ou si cela peut pas qu'elles persistent (des données sensibles par exemple) ou si cela peut
améliorer les performances de votre conteneur, il est possible de créer des améliorer les performances de votre conteneur, il est possible de créer des
points de montages utilisant le système de fichiers `tmpfs` et donc résidant points de montages utilisant le système de fichiers `tmpfs` et donc résidant
exclusivement en RAM : exclusivement en RAM\ :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run --mount type=tmpfs,target=/srv/images nemunaire/youp0m docker container run --mount type=tmpfs,target=/srv/images nemunaire/youp0m
``` ```
</div> </div>

View file

@ -1,19 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md clair.md oci.md registry.md runc.md linuxkit.md rendu.md SOURCES = tutorial.md clair.md oci.md registry.md runc.md linuxkit.md rendu.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \
--number-sections \
--smart \
-M lang=fr-FR \
-M fontsize=12pt \
-M papersize=a4paper \
-M mainfont="Linux Libertine O" \
-M monofont="FantasqueSansMono-Regular" \
-M sansfont="Linux Biolinum O" \
-M colorlinks=true \
-M linkcolor="black" \
-M urlcolor="[rgb]{0.2,0.6,0.4}" \
--include-in-header=../header.tex
all: tutorial.pdf all: tutorial.pdf

View file

@ -1,7 +1,7 @@
\newpage \newpage
Une vision plus Clair de la sécurité ? Une vision plus Clair de la sécurité
====================================== ====================================
Nous avons vu, au travers de tous les précédents TP, que Docker nous apportait Nous avons vu, au travers de tous les précédents TP, que Docker nous apportait
un certain degré de sécurité d'emblée au lancement du conteneur. Cela peut sans un certain degré de sécurité d'emblée au lancement du conteneur. Cela peut sans
@ -86,7 +86,7 @@ Une fois lancé, la base nécessite d'être initialisée. L'opération peut pren
plusieurs minutes. Vous pouvez suivre l'avancement de l'ajout : plusieurs minutes. Vous pouvez suivre l'avancement de l'ajout :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
curl http://localhost:6060/v1/namespaces curl http://localhost:6060/v1/namespaces
curl http://localhost:6060/v1/namespaces/debian:9/vulnerabilities?limit=10 curl http://localhost:6060/v1/namespaces/debian:9/vulnerabilities?limit=10
``` ```
@ -100,7 +100,7 @@ conteneur, nous allons utiliser le programme
[`paclair`](https://github.com/yebinama/paclair) : [`paclair`](https://github.com/yebinama/paclair) :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
pip3 install paclair pip3 install paclair
``` ```
</div> </div>
@ -121,7 +121,7 @@ Pour obtenir un rapport d'analyse, on commence par envoyer les couches de
l'image à `Clair` : l'image à `Clair` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
paclair --conf conf.yml Docker nemunaire/fic-admin push paclair --conf conf.yml Docker nemunaire/fic-admin push
``` ```
</div> </div>
@ -129,7 +129,7 @@ l'image à `Clair` :
Puis on lui demande la génération d'un rapport `html` : Puis on lui demande la génération d'un rapport `html` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
paclair --conf conf.yml Docker nemunaire/fic-admin analyse --output-format html --output-report file paclair --conf conf.yml Docker nemunaire/fic-admin analyse --output-format html --output-report file
``` ```
</div> </div>
@ -137,7 +137,7 @@ Puis on lui demande la génération d'un rapport `html` :
Si l'on souhaite uniquement avoir des statistiques dans la console : Si l'on souhaite uniquement avoir des statistiques dans la console :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ paclair --conf conf.yml Docker node:latest analyse --output-format stats 42sh$ paclair --conf conf.yml Docker node:latest analyse --output-format stats
Unknown: 2 Unknown: 2
Negligible: 1 Negligible: 1
@ -147,7 +147,7 @@ Si l'on souhaite uniquement avoir des statistiques dans la console :
</div> </div>
## Exercice {.unnumbered} ## 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), notamment `nginx`, `golang`, du [Docker Hub](https://hub.docker.com/explore), notamment `nginx`, `golang`,

View file

@ -102,7 +102,7 @@ la partie `init`, elle sera alors lancé comme un équivalent de
<https://github.com/linuxkit/linuxkit/blob/master/pkg/getty/README.md#linuxkit-debug> <https://github.com/linuxkit/linuxkit/blob/master/pkg/getty/README.md#linuxkit-debug>
## *namespaces* ## `namespaces`
Chaque nouveau conteneur est donc lancé dans un espace distinct où il ne pourra Chaque nouveau conteneur est donc lancé dans un espace distinct où il ne pourra
pas interagir avec les autres, ou déborder s'il s'avérait qu'il expose une pas interagir avec les autres, ou déborder s'il s'avérait qu'il expose une
@ -134,7 +134,7 @@ Ou inversement, pour persister dans le namespace initial :
</div> </div>
### Partage de *namespace* ### Partage de `namespace`
Dans le cas où l'on souhaite que deux conteneurs partagent le même *namespace*, Dans le cas où l'on souhaite que deux conteneurs partagent le même *namespace*,
il faut passer le chemin vers la structure du noyau correspondante. il faut passer le chemin vers la structure du noyau correspondante.
@ -175,7 +175,7 @@ plates-formes pour aller y lancer des instances de cette image !
Pour construire l'image faite précédemment : Pour construire l'image faite précédemment :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
linuxkit build hello.yml linuxkit build hello.yml
``` ```
</div> </div>
@ -185,7 +185,7 @@ partie `kernel`) ainsi qu'une image. Exactement ce qu'attend QEMU ! Pour
tester, n'attendons pas davantage pour lancer : tester, n'attendons pas davantage pour lancer :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
linuxkit run qemu -gui hello linuxkit run qemu -gui hello
``` ```
</div> </div>
@ -244,7 +244,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

View file

@ -75,7 +75,7 @@ Dernière née de l'organisme, cette spécification fédère la notion de
aussi en envoyer. aussi en envoyer.
## Pour aller plus loin ## Pour aller plus loin {-}
Si maintenant `docker` fait appel à un programme externe pour lancer Si maintenant `docker` fait appel à un programme externe pour lancer
effectivement nos conteneurs, c'est que l'on peut changer cette implémentation effectivement nos conteneurs, c'est que l'on peut changer cette implémentation

View file

@ -3,6 +3,8 @@ Registres
**Outils nécessaires :** `curl`, `gunzip`, `jq`, `tar`. **Outils nécessaires :** `curl`, `gunzip`, `jq`, `tar`.
* * * * *
Dans cette partie, nous allons appréhender le fonctionnement d'un registre OCI, Dans cette partie, nous allons appréhender le fonctionnement d'un registre OCI,
et préparer le *rootfs* d'une image de base (Debian, Ubuntu, hello, ...) : en et préparer le *rootfs* d'une image de base (Debian, Ubuntu, hello, ...) : en
nous préoccupant simplement de la couche la plus basse (qui ne contient pas de nous préoccupant simplement de la couche la plus basse (qui ne contient pas de
@ -24,15 +26,15 @@ intéresse aujourd'hui !
Il n'en reste pas moins que le jeton est forgé pour un service donné (dans Il n'en reste pas moins que le jeton est forgé pour un service donné (dans
notre cas `registry.docker.io`) et avec un objectif bien cerné (pour nous, on notre cas `registry.docker.io`) et avec un objectif bien cerné (pour nous, on
souhaite récupérer le contenu du dépôt[^quiddepot] `hello-world` : souhaite récupérer le contenu du dépôt[^quiddepot] `hello-world` :
`repository:hello-world:pull`). Ce qui nous donne : <span lang="en-US">`repository:hello-world:pull`</span>). Ce qui nous donne :
[^quiddepot]: Dans un registre, les fichiers qui composent l'image forment un [^quiddepot]: Dans un registre, les fichiers qui composent l'image forment un
dépôt (*repository*). dépôt (*repository*).
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ curl "https://auth.docker.io/token"\ 42sh$ curl "https://auth.docker.io/token?service=registry.docker.io&"\
> "?service=registry.docker.io&scope=repository:library/hello-world:pull" | jq . > "scope=repository:library/hello-world:pull" | jq .
``` ```
```json ```json
{ {
@ -50,7 +52,7 @@ registre.
Avec `jq`, on peut l'extraire grâce à : Avec `jq`, on peut l'extraire grâce à :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
| jq -r .token | jq -r .token
``` ```
</div> </div>
@ -62,7 +64,7 @@ Une fois en possession de notre jeton, nous pouvons maintenant demander l'index
d'images à notre registre : d'images à notre registre :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
curl -s \ curl -s \
-H "Authorization: Bearer ${TOKEN}" \ -H "Authorization: Bearer ${TOKEN}" \
-H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \ -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \
@ -81,7 +83,7 @@ Demandons maintenant le manifest correspondant à notre matériel et à notre
système d'exploitation : système d'exploitation :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
curl -s \ curl -s \
-H "Authorization: Bearer ${TOKEN}" \ -H "Authorization: Bearer ${TOKEN}" \
-H "Accept: ${MEDIATYPE}" \ -H "Accept: ${MEDIATYPE}" \
@ -101,7 +103,7 @@ répertoire `blobs`, il ne s'agit en effet plus de manifest. Si les manifests so
Pour récupérer la configuration de l'image : Pour récupérer la configuration de l'image :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
curl -s --location \ curl -s --location \
-H "Authorization: Bearer ${TOKEN}" \ -H "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/hello-world/blobs/${CONFIG_DIGEST}" | jq . "https://registry-1.docker.io/v2/library/hello-world/blobs/${CONFIG_DIGEST}" | jq .
@ -112,7 +114,7 @@ Pour récupérer la configuration de l'image :
Enfin, armé du `digest` de notre couche, il ne nous reste plus qu'à la demander gentiment : Enfin, armé du `digest` de notre couche, il ne nous reste plus qu'à la demander gentiment :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
wget --header "Authorization: Bearer ${TOKEN}" \ wget --header "Authorization: Bearer ${TOKEN}" \
"https://registry-1.docker.io/v2/library/hello-world/blobs/${LAYER_DIGEST}" "https://registry-1.docker.io/v2/library/hello-world/blobs/${LAYER_DIGEST}"
``` ```
@ -126,7 +128,7 @@ Le type indiqué par le manifest pour cette couche était
tarball compressée au format gzip : tarball compressée au format gzip :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
mkdir rootfs mkdir rootfs
tar xzf ${DL_LAYER} -C rootfs tar xzf ${DL_LAYER} -C rootfs
``` ```
@ -135,7 +137,7 @@ tarball compressée au format gzip :
Et voilà, nous avons extrait notre première image, nous devrions pouvoir : Et voilà, nous avons extrait notre première image, nous devrions pouvoir :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# chroot rootfs /hello 42sh# chroot rootfs /hello
Hello from Docker! Hello from Docker!
[...] [...]
@ -143,12 +145,12 @@ Et voilà, nous avons extrait notre première image, nous devrions pouvoir :
</div> </div>
## Exercice {.unnumbered} ## Exercice {-}
Réalisez un script pour automatiser l'ensemble de ces étapes : Réalisez un script pour automatiser l'ensemble de ces étapes :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ cd $(mktemp) 42sh$ cd $(mktemp)
42sh$ ~/workspace/registry_play.sh library/hello 42sh$ ~/workspace/registry_play.sh library/hello

View file

@ -32,7 +32,13 @@ vous pouvez télécharger la dernière version :
d'alpine : `library/alpine` dans le registre Docker. 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 Si vous n'avez pas eu le temps de terminer l'exercice précédent, vous pouvez
utiliser `docker image save alpine | tar xv -C rootfs`. utiliser :
<div lang="en-US">
```bash
docker image save alpine | tar xv -C rootfs
```
</div>
## Modèle de configuration ## Modèle de configuration
@ -42,7 +48,7 @@ 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 : commande suivante, qui nous créera un modèle que nous adapterons un peu :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
runc spec runc spec
``` ```
</div> </div>
@ -56,7 +62,7 @@ Pour savoir à quoi correspondent tous ces éléments, vous pouvez consulter :
Voici comment nous pouvons tester le fonctionnement de notre *bundle* : Voici comment nous pouvons tester le fonctionnement de notre *bundle* :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh$ ls 42sh$ ls
rootfs/ config.json rootfs/ config.json
@ -70,7 +76,7 @@ retrouver tout l'écosystème de `docker` ; ici il n'y a pas de gestion des
journaux, etc. : journaux, etc. :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh# runc list 42sh# runc list
ID PID STATUS BUNDLE CREATED OWNER ID PID STATUS BUNDLE CREATED OWNER
virli1 12345 running /tmp/work/runctest 2012-12-12T12:12:12.123456789Z root virli1 12345 running /tmp/work/runctest 2012-12-12T12:12:12.123456789Z root
@ -81,13 +87,13 @@ journaux, etc. :
</div> </div>
## Attacher notre *home* ## Attacher notre `home`
Dans le modèle de `config.json`, il y a déjà de nombreux systèmes de fichiers 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 : qui sont montés. Nous pouvons les filtrer avec :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ jq .mounts config.json 42sh$ jq .mounts config.json
``` ```
```json ```json
@ -119,12 +125,12 @@ ajouter un élément à cette liste, demandant de *bind* :
</div> </div>
## Exercice ## Exercice {-}
Serez-vous capable de continuer l'édition de votre `config.json` afin d'obtenir Serez-vous capable de continuer l'édition de votre `config.json` afin d'obtenir
les mêmes restrictions que votre projet de moulette ? les mêmes restrictions que votre projet de moulette ?
* CGroups : 1GB RAM, 100 PID, ... * CGroups : 1\ GB RAM, 100\ PIDs, ...
* strict minimum de capabilities ; * strict minimum de capabilities ;
* filtres `seccomp` ; * filtres `seccomp` ;
* carte réseau `veth` ; * carte réseau `veth` ;

View file

@ -1,22 +1,23 @@
--- ---
title: Virtualisation légère -- TP n^o^ 5 title: Virtualisation légère -- TP n^o^ 5
subtitle: Docker Internals subtitle: Docker Internals
author: Pierre-Olivier *Nemunaire* Mercier author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Mercredi 14 novembre 2018 date: Mercredi 14 novembre 2018
... abstract: |
Dans ce cinquième du TP, nous allons entrer dans les sous-bassements de
Docker !
Dans ce cinquième du TP, nous allons entrer dans les sous-bassements de Docker ! \vspace{1em}
Tous les éléments de ce TP (exercices et projet) sont à rendre à Tous les éléments de ce TP (exercices et projet) sont à rendre à
<virli@nemunai.re> au plus tard le dimanche 25 novembre 2018 à 23 h 42. Consultez la <virli@nemunai.re> au plus tard le dimanche 25 novembre 2018 à 23
dernière section de chaque partie pour plus d'information sur les éléments à h 42. Consultez la dernière section de chaque partie pour plus d'information
rendre. sur les éléments à rendre.
En tant que personnes sensibilisées à la sécurité des échanges électroniques, En tant que personnes sensibilisées à la sécurité des échanges électroniques,
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire [me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
signer votre clef et n'hésitez pas à faire signer votre clef et n'hésitez pas à [faire signer votre
[faire signer votre clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/). clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
...
\tableofcontents

View file

@ -1,19 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md setup.md machine.md swarm.md stack.md rendu.md SOURCES = tutorial.md setup.md machine.md swarm.md stack.md rendu.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \
--number-sections \
--smart \
-M lang=fr-FR \
-M fontsize=12pt \
-M papersize=a4paper \
-M mainfont="Linux Libertine O" \
-M monofont="FantasqueSansMono-Regular" \
-M sansfont="Linux Biolinum O" \
-M colorlinks=true \
-M linkcolor="black" \
-M urlcolor="[rgb]{0.2,0.6,0.4}" \
--include-in-header=../header.tex
all: tutorial.pdf all: tutorial.pdf

View file

@ -55,7 +55,7 @@ donner à cette machine (les machines ne sont pas considérées comme jetables,
leur nom vous permettra par exemple de relancer une machine plus tard) : leur nom vous permettra par exemple de relancer une machine plus tard) :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker-machine create --driver virtualbox echinoidea docker-machine create --driver virtualbox echinoidea
``` ```
</div> </div>
@ -81,11 +81,11 @@ avec `docker-machine` cela prend tout son sens, car vous pouvez très facilement
changer de daamon/machine avec une simple commande : changer de daamon/machine avec une simple commande :
<div lang="en-US"> <div lang="en-US">
```shell ```
$ docker container ls 42sh$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS CONTAINER ID IMAGE COMMAND CREATED STATUS
$ eval $(docker-machine env echinoidea) 42sh$ eval $(docker-machine env echinoidea)
$ docker container ls -a 42sh$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS CONTAINER ID IMAGE COMMAND CREATED STATUS
a814293b9f45 armbuild/busybox "/bin/sh" 18 seconds ago Up 10 minutes a814293b9f45 armbuild/busybox "/bin/sh" 18 seconds ago Up 10 minutes
0caddeed5037 armbuild/alpine "/bin/sh" 2 weeks ago Created 0caddeed5037 armbuild/alpine "/bin/sh" 2 weeks ago Created
@ -141,7 +141,7 @@ Commençons par voir sur quel port le daemon `dockerd` de notre machine
virtuelle écoute : virtuelle écoute :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
(virt1) 42sh$ netstat -tpln | grep dockerd (virt1) 42sh$ netstat -tpln | grep dockerd
Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
tcp 0 0 :::2376 :::* 980/dockerd tcp 0 0 :::2376 :::* 980/dockerd
@ -151,7 +151,7 @@ virtuelle écoute :
Essayons de renseigner simplement cette configuration à notre client Docker : Essayons de renseigner simplement cette configuration à notre client Docker :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
(main) 42sh$ docker -H tcp://$VM1_IP:2376/ info (main) 42sh$ docker -H tcp://$VM1_IP:2376/ info
Get http://$VM1_IP:2376/v1.32/info: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02". Get http://$VM1_IP:2376/v1.32/info: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS? * Are you trying to connect to a TLS-enabled daemon without TLS?
@ -173,7 +173,7 @@ Tout le nécessaire est déjà configuré au sein de `boot2docker`, pour nos tes
nous n'avons qu'à recopier la clef et les certificats en place. nous n'avons qu'à recopier la clef et les certificats en place.
<div lang="en-US"> <div lang="en-US">
```shell ```bash
(main) 42sh$ mkdir remote/virt1 (main) 42sh$ mkdir remote/virt1
(main) 42sh$ scp "docker@$VM1_IP:.docker/*" remote/virt1 (main) 42sh$ scp "docker@$VM1_IP:.docker/*" remote/virt1
ca.pem ca.pem
@ -185,7 +185,7 @@ nous n'avons qu'à recopier la clef et les certificats en place.
Tentons maintenant de nous connecter au daemon distant en utilisant ces éléments : Tentons maintenant de nous connecter au daemon distant en utilisant ces éléments :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
42sh$ DOCKER_CERT_PATH=remote/virt1/ docker -H tcp://$VM1_IP:2376/ --tlsverify info 42sh$ DOCKER_CERT_PATH=remote/virt1/ docker -H tcp://$VM1_IP:2376/ --tlsverify info
``` ```
</div> </div>

View file

@ -27,7 +27,7 @@ pour bon nombres d'environnements. Nous pouvons l'installer en suivant la
procédure suivante : procédure suivante :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-Linux-x86_64 \ curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-Linux-x86_64 \
> /usr/bin/docker-machine > /usr/bin/docker-machine
chmod +x /usr/bin/docker-machine chmod +x /usr/bin/docker-machine

View file

@ -27,7 +27,7 @@ un serveur web, qui sera bien plus représentatif de ce que l'on pourra obtenir.
Précédemment, nous lancions notre serveur web favori avec : Précédemment, nous lancions notre serveur web favori avec :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker container run --name mywebs -d nginx docker container run --name mywebs -d nginx
``` ```
</div> </div>
@ -36,7 +36,7 @@ La même commande, mais déployée à partir d'un nœud manager, vers un nœud
*workers*, est : *workers*, est :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker service create --name myWebS nginx docker service create --name myWebS nginx
``` ```
</div> </div>
@ -46,7 +46,7 @@ Allons-y, essayons !
On peut consulter l'état du service avec, comme d'habitude `ls` : On peut consulter l'état du service avec, comme d'habitude `ls` :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh$ docker service ls 42sh$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS ID NAME MODE REPLICAS IMAGE PORTS
iyue3rgd0ohs myWebS replicated 1/1 nginx:latest iyue3rgd0ohs myWebS replicated 1/1 nginx:latest
@ -62,7 +62,7 @@ Rien de très excitant pour le moment, car nous ne pouvons pas vraiment accéder
d'ajouter une redirection de port : d'ajouter une redirection de port :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker service update --publish-add 80 myWebS docker service update --publish-add 80 myWebS
``` ```
</div> </div>
@ -109,7 +109,7 @@ Ce qui se fait souvent avec beaucoup de douleur hors de Docker, se résume ici
: :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker service update --replicas 3 myWebS docker service update --replicas 3 myWebS
``` ```
</div> </div>
@ -117,7 +117,7 @@ Ce qui se fait souvent avec beaucoup de douleur hors de Docker, se résume ici
Roulement de tambours ....... Roulement de tambours .......
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker service ps myWebS docker service ps myWebS
``` ```
</div> </div>
@ -139,7 +139,7 @@ Notre système de monitoring est une *stack* lui aussi, d'ailleurs, nous pouvons
la lancer grâce à notre `docker-compose.yml` : la lancer grâce à notre `docker-compose.yml` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker stack deploy --compose-file docker-compose.yml tic docker stack deploy --compose-file docker-compose.yml tic
``` ```
</div> </div>

View file

@ -77,7 +77,7 @@ La première chose à faire, est d'initialiser un cluster swarm. Pour se faire,
ce n'est pas plus compliqué que de faire : ce n'est pas plus compliqué que de faire :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker swarm init docker swarm init
``` ```
</div> </div>
@ -98,7 +98,7 @@ lorsque vous initialisez le cluster. Si vous avez raté la sortie de la
commande, vous pouvez retrouver le jeton avec : commande, vous pouvez retrouver le jeton avec :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
docker swarm join-token worker docker swarm join-token worker
``` ```
</div> </div>
@ -119,7 +119,7 @@ utilisant `docker-machine`.
des redirections de ports, mais le résultat n'est pas garanti ! des redirections de ports, mais le résultat n'est pas garanti !
<div lang="en-US"> <div lang="en-US">
```shell ```bash
eval $(docker-machine env echinoidea) eval $(docker-machine env echinoidea)
docker swarm join --token SWMTKN-1-...-... 10.10.10.42:2377 docker swarm join --token SWMTKN-1-...-... 10.10.10.42:2377
``` ```
@ -128,7 +128,7 @@ utilisant `docker-machine`.
Une fois rejoint, vous devriez voir apparaître un nouveau nœud *worker* dans : Une fois rejoint, vous devriez voir apparaître un nouveau nœud *worker* dans :
<div lang="en-US"> <div lang="en-US">
```shell ```
42sh$ eval $(docker-machine env -u) 42sh$ eval $(docker-machine env -u)
42sh$ docker node ls 42sh$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS

View file

@ -1,22 +1,24 @@
--- ---
title: Virtualisation légère -- TP n^o^ 2.3 title: Virtualisation légère -- TP n^o^ 2.3
subtitle: L'orchestration avec Docker subtitle: L'orchestration avec Docker
author: Pierre-Olivier *Nemunaire* Mercier author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Jeudi 18 octobre 2018 date: Jeudi 18 octobre 2018
... abstract: |
Dans la troisième partie de ce TP, nous allons orchestrer nos
conteneurs !
Dans la troisième partie de ce TP, nous allons orchestrer nos conteneurs ! \vspace{1em}
Tous les éléments de ce TP (exercices et projet) sont à rendre à Tous les éléments de ce TP (exercices et projet) sont à rendre à
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2018 à 0 h 42. Consultez la <virli@nemunai.re> au plus tard le mercredi 24 octobre 2018 à 0
dernière section de chaque partie pour plus d'information sur les éléments à h 42. Consultez la dernière section de chaque partie pour plus
rendre. d'information sur les éléments à rendre.
En tant que personnes sensibilisées à la sécurité des échanges électroniques, En tant que personnes sensibilisées à la sécurité des échanges
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à électroniques, vous devrez m'envoyer vos rendus signés avec votre
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire clef PGP. Pensez à
signer votre clef et n'hésitez pas à [me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
[faire signer votre clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/). faire signer votre clef et n'hésitez pas à [faire signer votre
clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
\tableofcontents ...

View file

@ -1,19 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md interactive.md dockerfile.md goodpractices.md entrypoint.md rendu.md SOURCES = tutorial.md interactive.md dockerfile.md goodpractices.md entrypoint.md rendu.md
PANDOCOPTS = --latex-engine=xelatex \
--standalone \
--normalize \
--number-sections \
--smart \
-M lang=fr-FR \
-M fontsize=12pt \
-M papersize=a4paper \
-M mainfont="Linux Libertine O" \
-M monofont="FantasqueSansMono-Regular" \
-M sansfont="Linux Biolinum O" \
-M colorlinks=true \
-M linkcolor="black" \
-M urlcolor="[rgb]{0.2,0.6,0.4}" \
--include-in-header=../header.tex
all: tutorial.pdf all: tutorial.pdf

View file

@ -9,7 +9,7 @@ construction de nouvelles images. Nous pouvons arriver au même résultat que ce
que l'on a réussi à faire précédemment en utilisant le `Dockerfile` suivant : que l'on a réussi à faire précédemment en utilisant le `Dockerfile` suivant :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
FROM ubuntu:latest FROM ubuntu:latest
RUN apt-get update RUN apt-get update
@ -21,16 +21,16 @@ La syntaxe d'un `Dockerfile` est simple : le premier mot de chaque ligne est
l'intitulé d'une instruction (que l'on écrit généralement en majuscule), elle l'intitulé d'une instruction (que l'on écrit généralement en majuscule), elle
est suivie de ses arguments. est suivie de ses arguments.
Dans notre exemple, nous utilisons `FROM` qui indique une image de départ à Dans notre exemple, nous utilisons `FROM`{.dockerfile} qui indique une image de
utiliser ; `RUN` est une commande qui sera exécutée dans le conteneur, dans le départ à utiliser ; `RUN`{.dockerfile} est une commande qui sera exécutée dans
but de le construire. le conteneur, dans le but de le construire.
Pour lancer la construction de la nouvelle image, créons un nouveau dossier ne Pour lancer la construction de la nouvelle image, créons un nouveau dossier ne
contenant que votre fichier `Dockerfile`, plaçons-nous ensuite dedans, puis contenant que votre fichier `Dockerfile`, plaçons-nous ensuite dedans, puis
lançons la commande `build` : lançons la commande `build` :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker image build --tag=my_editor . docker image build --tag=my_editor .
``` ```
</div> </div>
@ -39,7 +39,7 @@ Une fois la construction de l'image terminée, nous pouvons la lancer et
constater l'existence de notre éditeur favori : constater l'existence de notre éditeur favori :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run -it my_editor /bin/bash docker container run -it my_editor /bin/bash
``` ```
</div> </div>
@ -53,7 +53,7 @@ correspondra à une nouvelle couche de notre image.
Cela signifie que l'exemple suivant **ne fonctionne pas** : Cela signifie que l'exemple suivant **ne fonctionne pas** :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
COPY db.sql /db.sql COPY db.sql /db.sql
RUN service mysqld start RUN service mysqld start
RUN mysql -u root -p toor virli < /db.sql RUN mysql -u root -p toor virli < /db.sql
@ -61,14 +61,14 @@ Cela signifie que l'exemple suivant **ne fonctionne pas** :
</div> </div>
Cet exemple ne fonctionne pas car le serveur MySQL est bien lancé dans le Cet exemple ne fonctionne pas car le serveur MySQL est bien lancé dans le
premier `RUN`, mais il se trouve brûtalement arrêté dès lors que la commande premier `RUN`{.dockerfile}, mais il se trouve brûtalement arrêté dès lors que
`service` se termine. En fait, à chaque instruction, Docker réalise la commande `service` se termine. En fait, à chaque instruction, Docker réalise
automatiquement un `run` suivi d'un `commit`. Et vous pouvez constater par automatiquement un `run` suivi d'un `commit`. Et vous pouvez constater par
vous-même que, en créant l'image `tinysql` à partir d'un simple `apt install vous-même que, en créant l'image `tinysql` à partir d'un simple `apt install
mysql` : mysql` :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run tinysql service mysqld start docker container run tinysql service mysqld start
``` ```
</div> </div>
@ -79,16 +79,16 @@ processus.
Pour avoir le résultat escompté, il faut exécuter les commandes ensemble : Pour avoir le résultat escompté, il faut exécuter les commandes ensemble :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
COPY db.sql /db.sql COPY db.sql /db.sql
RUN service mysqld start && mysql -u root -p toor virli < /db.sql RUN service mysqld start && mysql -u root -p toor virli < /db.sql
``` ```
</div> </div>
Après le `RUN`, MySQL sera de nouveau tué. Après le `RUN`{.dockerfile}, MySQL sera de nouveau tué.
En aucun cas, une commande exécutée par un `RUN` se retrouvera en cours En aucun cas, une commande exécutée par un `RUN`{.dockerfile} se retrouvera en
d'exécution lorsque l'on invoquera un conteneur par `docker container cours d'exécution lorsque l'on invoquera un conteneur par `docker container
run`. Seul la commande fournie par l'utilisateur ou la commande par défaut de run`. Seul la commande fournie par l'utilisateur ou la commande par défaut de
l'image sera exécutée au lancement d'un conteneur. l'image sera exécutée au lancement d'un conteneur.
@ -98,7 +98,7 @@ l'image sera exécutée au lancement d'un conteneur.
Construisons maintenant un conteneur avec un service web : Construisons maintenant un conteneur avec un service web :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
FROM my_editor FROM my_editor
RUN apt-get update RUN apt-get update
@ -108,7 +108,7 @@ Construisons maintenant un conteneur avec un service web :
``` ```
</div> </div>
L'instruction `EXPOSE` sera traitée plus tard par le client Docker (équivalent L'instruction `EXPOSE`{.dockerfile} sera traitée plus tard par le client Docker (équivalent
à l'argument `--expose`). Il s'agit d'une métadonnée qui sera attachée à à l'argument `--expose`). Il s'agit d'une métadonnée qui sera attachée à
l'image (et à toutes ses images filles). l'image (et à toutes ses images filles).
@ -130,7 +130,7 @@ Dans un autre terminal, lancer un `docker container ls` et consulter la colonne
Rendez-vous ensuite dans votre navigateur sur <http://localhost:49153/>. Rendez-vous ensuite dans votre navigateur sur <http://localhost:49153/>.
*À vous de jouer :* utilisez l'instruction `COPY` pour afficher votre propre **À vous de jouer :** utilisez l'instruction `COPY`{.dockerfile} pour afficher votre propre
`index.html` remplaçant celui installé de base par `nginx`. Si vous manquez `index.html` remplaçant celui installé de base par `nginx`. Si vous manquez
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).
@ -169,22 +169,22 @@ images), en haut du `Dockerfile`.
## Métadonnées pures ## Métadonnées pures
L'instruction LABEL permet d'ajouter une métadonnée à une image, sous forme de L'instruction `LABEL`{.dockerfile} permet d'ajouter une métadonnée à une image,
clef/valeur. sous forme de clef/valeur.
Une métadonnée Une métadonnée
[courante](https://github.com/nginxinc/docker-nginx/blob/master/mainline/stretch/Dockerfile#L3) [courante](https://github.com/nginxinc/docker-nginx/blob/master/mainline/stretch/Dockerfile#L3)
est d'indiquer le nom du mainteneur de l'image : est d'indiquer le nom du mainteneur de l'image :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
LABEL maintainer="Pierre-Olivier Mercier <nemunaire@nemunai.re>" LABEL maintainer="Pierre-Olivier Mercier <nemunaire@nemunai.re>"
``` ```
</div> </div>
Dans notre `Dockerfile`, indiquez juste après l'image de base, vos noms, Dans notre `Dockerfile`, indiquez juste après l'image de base, vos noms,
prénoms et mails de contact avec l'instruction `LABEL maintainer`, pour prénoms et mails de contact avec l'instruction `LABEL maintainer`{.dockerfile},
indiquer que c'est vous qui maintenez cette image, si des utilisateurs ont pour indiquer que c'est vous qui maintenez cette image, si des utilisateurs ont
besoin de vous avertir pour le mettre à jour ou s'ils rencontrent des besoin de vous avertir pour le mettre à jour ou s'ils rencontrent des
difficultés par exemple. difficultés par exemple.
@ -194,17 +194,17 @@ On le place dès le début, car comme c'est une information qui n'est pas amener
## Commande par défaut ## Commande par défaut
Vous pouvez placer dans un `Dockerfile` une instruction `CMD` qui sera exécutée Vous pouvez placer dans un `Dockerfile` une instruction `CMD`{.dockerfile} qui
si aucune commande n'est passée lors du `run`, par exemple : sera exécutée si aucune commande n'est passée lors du `run`, par exemple :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
CMD nginx -g "daemon off;" CMD nginx -g "daemon off;"
``` ```
</div> </div>
<div lang="en-US"> <div lang="en-US">
``` ```bash
42sh$ docker image build --tag=my_nginx . 42sh$ docker image build --tag=my_nginx .
42sh$ docker container run -d -P my_nginx 42sh$ docker container run -d -P my_nginx
``` ```
@ -238,7 +238,7 @@ plusieurs conteneurs, avant d'agréger le contenu compilé au sein du conteneur
final : final :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
FROM gcc:4.9 FROM gcc:4.9
COPY . /usr/src/myapp COPY . /usr/src/myapp
WORKDIR /usr/src/myapp WORKDIR /usr/src/myapp
@ -252,9 +252,9 @@ final :
Dans cet exemple, deux conteneurs distincts sont créés : le premier à partir de Dans cet exemple, deux conteneurs distincts sont créés : le premier à partir de
l'image `gcc`, il contient tout le nécessaire pour compiler notre l'image `gcc`, il contient tout le nécessaire pour compiler notre
`hello.c`. Mais l'image finale (le dernier `FROM` de notre `Dockerfile`) est `hello.c`. Mais l'image finale (le dernier `FROM`{.dockerfile} de notre
l'image vide, dans laquelle nous recopions simplement le produit de notre `Dockerfile`) est l'image vide, dans laquelle nous recopions simplement le
compilation. produit de notre compilation.
L'image ainsi générée est minime, car elle ne contient rien d'autre que le L'image ainsi générée est minime, car elle ne contient rien d'autre que le
strict nécessaire pour s'exécuter. strict nécessaire pour s'exécuter.
@ -267,7 +267,7 @@ donner des noms à chaque image, plutôt que de devoir jongler avec les
numéros. Dans ce cas, on indiquera : numéros. Dans ce cas, on indiquera :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
FROM gcc:4.9 as builder FROM gcc:4.9 as builder
COPY . /usr/src/myapp COPY . /usr/src/myapp
WORKDIR /usr/src/myapp WORKDIR /usr/src/myapp
@ -301,7 +301,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
@ -311,17 +311,12 @@ Pour réaliser ce genre de contribution, on ajoute généralement un `Dockerfile
à la racine du dépôt. à la racine du dépôt.
Vous pouvez cloner le dépôts de sources de `youp0m` à : Vous pouvez cloner le dépôts de sources de `youp0m` à :
<https://git.nemunai.re/youp0m.git>
<div lang="en-US">
```
https://git.nemunai.re/youp0m.git
```
</div>
Pour compiler le projet, vous pouvez utiliser dans votre `Dockerfile` Pour compiler le projet, vous pouvez utiliser dans votre `Dockerfile`
<div lang="en-US"> <div lang="en-US">
```go ```dockerfile
FROM golang:1.11 FROM golang:1.11
COPY . /go/src/git.nemunai.re/youp0m COPY . /go/src/git.nemunai.re/youp0m
WORKDIR /go/src/git.nemunai.re/youp0m WORKDIR /go/src/git.nemunai.re/youp0m

View file

@ -9,8 +9,8 @@ Afin de faire bénéficier à nos utilisateurs d'une immersion parfaite, nous
allons faire en sorte que notre image permette d'être utilisée ainsi : allons faire en sorte que notre image permette d'être utilisée ainsi :
<div lang="en-US"> <div lang="en-US">
``` ```bash
42sh$ docker run -d -p 80:80 youp0m -bind :80 docker run -d -p 80:80 youp0m -bind :80
``` ```
</div> </div>
@ -19,16 +19,17 @@ Plutôt que de laisser l'utilisateur se débrouiller avec le chemin interne dans
lequel il va trouver le bon binaire : lequel il va trouver le bon binaire :
<div lang="en-US"> <div lang="en-US">
``` ```bash
42sh$ docker run -d -p 80:80 youp0m /srv/youp0m -bind :80 docker run -d -p 80:80 youp0m /srv/youp0m -bind :80
``` ```
</div> </div>
Essayez les deux commandes, si vous avez utilisé l'instruction `CMD` dans votre Essayez les deux commandes, si vous avez utilisé l'instruction
`Dockerfile` jusqu'à présent, vous devez vous trouver dans le deuxième cas. `CMD`{.dockerfile} dans votre `Dockerfile` jusqu'à présent, vous devez vous
trouver dans le deuxième cas.
Pour améliorer la situation, définissez Pour améliorer la situation, définissez
l'[`ENTRYPOINT`](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`.
@ -43,25 +44,26 @@ Notre but, dans cette partie, sera de créer un utilisateur administrateur
(pouvant passer le contrôle d'accès <http://localhost:8080/admin/>) : (pouvant passer le contrôle d'accès <http://localhost:8080/admin/>) :
<div lang="en-US"> <div lang="en-US">
``` ```bash
42sh$ docker run -i --rm -p 8080:8080 -e YOUP0M_PASSWORD=admin youp0m docker run -i --rm -p 8080:8080 -e YOUP0M_PASSWORD=admin youp0m
``` ```
</div> </div>
### Bases du script ### Bases du script
Notre script d'`ENTRYPOINT` sera appelé avec en argument, ceux passés par Notre script d'`ENTRYPOINT`{.dockerfile} sera appelé avec en argument, ceux
l'utilisateur après le nom de l'image, ou, à défaut, le contenu de `CMD`. passés par l'utilisateur après le nom de l'image, ou, à défaut, le contenu de
`CMD`.
C'est donc l'`ENTRYPOINT` qui est responsable de la bonne utilisation de C'est donc l'`ENTRYPOINT`{.dockerfile} qui est responsable de la bonne
ceux-ci, de leur modification, ... utilisation de ceux-ci, de leur modification, ...
À la fin d'un script d'`ENTRYPOINT`, afin de garder comme premier processus du À la fin d'un script d'`ENTRYPOINT`{.dockerfile}, afin de garder comme premier
conteneur le programme qui nous intéresse, on réalise un `execve(2)`, sans processus du conteneur le programme qui nous intéresse, on réalise un
`fork(2)` : `execve(2)`, sans `fork(2)` :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
exec /srv/youp0m $@ exec /srv/youp0m $@
``` ```
</div> </div>
@ -70,8 +72,8 @@ Dans cet exemple : `exec` est la commande interne à notre shell pour lui
indiquer de remplacer son fil d'exécution par cette commande (sans `exec`, il indiquer de remplacer son fil d'exécution par cette commande (sans `exec`, il
va `fork(2)` avant). `$@` est ici pour transmettre tel quel la liste des va `fork(2)` avant). `$@` est ici pour transmettre tel quel la liste des
arguments passés au script (il s'agit de ceux donnés par l'utilisateur, sur la arguments passés au script (il s'agit de ceux donnés par l'utilisateur, sur la
ligne de commande du `run`, ou du contenu de `CMD` si l'utilisateur n'a rien ligne de commande du `run`, ou du contenu de `CMD`{.dockerfile} si
précisé). l'utilisateur n'a rien précisé).
### Format du fichier `htpasswd` ### Format du fichier `htpasswd`
@ -80,7 +82,7 @@ Le format attendu est celui d'un fichier `htpasswd` typique d'Apache. Vous
pourriez obtenir un fichier valide avec : pourriez obtenir un fichier valide avec :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
( (
echo -n "$YOUP0M_USERNAME" echo -n "$YOUP0M_USERNAME"
echo -n ":" echo -n ":"
@ -93,11 +95,12 @@ Il faut ensuite passer le fichier sur la ligne de commande grâce à l'option
`-htpasswd`. `-htpasswd`.
### Exercice ### Exercice {-}
Écrivez un script d'`ENTRYPOINT`, analysant les variables d'environnement, à la Écrivez un script d'`ENTRYPOINT`{.dockerfile}, analysant les variables
recherche de `YOUP0M_USERNAME` et `YOUP0M_PASSWORD` pour initialiser le fichier d'environnement, à la recherche de `YOUP0M_USERNAME` et `YOUP0M_PASSWORD` pour
`.htpasswd` qui sera ajouté à la liste des arguments à passer au service. initialiser le fichier `.htpasswd` qui sera ajouté à la liste des arguments à
passer au service.
Par exemple : Par exemple :

View file

@ -91,7 +91,7 @@ Dans l'interface sélectionnez la base `telegraf` puis explorez les valeurs :
Laissons tourner `telegraf` afin de constituer un petit historique de valeurs. Laissons tourner `telegraf` afin de constituer un petit historique de valeurs.
## Rendu ## Rendu {-}
Avant de passer à la suite, placez votre `Dockerfile` et les éventuels fichiers Avant de passer à la suite, placez votre `Dockerfile` et les éventuels fichiers
annexes dans un dossier `influxdb`. annexes dans un dossier `influxdb`.

View file

@ -55,7 +55,7 @@ vous codez.
Lorsqu'une ligne devient complexe, allez à la ligne : Lorsqu'une ligne devient complexe, allez à la ligne :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
nginx \ nginx \
php5-fpm php5-fpm
@ -70,7 +70,7 @@ Lorsque c'est possible, ordonnez vos lignes suivant un ordre logique. Par
exemple : exemple :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
bzr \ bzr \
cvs \ cvs \
@ -99,9 +99,9 @@ Il y a un certain nombre de règles à connaître pour bien utiliser ce mécanis
le(s) différente(s) image(s) qui dérive(nt) de la commande précédente. Si le(s) différente(s) image(s) qui dérive(nt) de la commande précédente. Si
aucune commande correspondante n'est trouvé, le cache se retrouve invalidé aucune commande correspondante n'est trouvé, le cache se retrouve invalidé
pour les instructions suivantes. pour les instructions suivantes.
- Pour les instructions `ADD` et `COPY`, en plus de la comparaison précédente, - Pour les instructions `ADD`{.dockerfile} et `COPY`{.dockerfile}, en plus de
la somme de contrôle du fichier est ajoutée. Si le fichier a été modifié, le la comparaison précédente, la somme de contrôle du fichier est ajoutée. Si le
cache se retrouve invalidé. fichier a été modifié, le cache se retrouve invalidé.
- Une fois que le cache est invalidé, toutes les commandes restantes à exécuter - Une fois que le cache est invalidé, toutes les commandes restantes à exécuter
dans le `Dockerfile` vont être exécutées. dans le `Dockerfile` vont être exécutées.
@ -132,10 +132,10 @@ lors de sa construction.
## Exposez les ports standards ## Exposez les ports standards
La commande `EXPOSE` vous permet d'indiquer les ports sur lesquels votre La commande `EXPOSE`{.dockerfile} vous permet d'indiquer les ports sur lesquels
conteneur s'attend à recevoir des paquets venant de l'extérieur. Ces ports ne votre conteneur s'attend à recevoir des paquets venant de l'extérieur. Ces
sont pas partagés avec l'hôte ou les autres conteneur, donc vous n'avez pas de ports ne sont pas partagés avec l'hôte ou les autres conteneur, donc vous
raison de ne pas utiliser les ports standards. n'avez pas de raison de ne pas utiliser les ports standards.
Si vous faites cela, il y a de forte chance qu'il n'y ait pas besoin de Si vous faites cela, il y a de forte chance qu'il n'y ait pas besoin de
modifier la configuration des autres logiciels contenu dans d'autres conteneurs modifier la configuration des autres logiciels contenu dans d'autres conteneurs
@ -154,7 +154,7 @@ L'entrypoint peut être utilisé de deux manières différentes :
indiqué dans l'entrypoint. Par exemple pour nginx : indiqué dans l'entrypoint. Par exemple pour nginx :
<div lang="en-US"> <div lang="en-US">
``` ```dockerfile
ENTRYPOINT ["nginx"] ENTRYPOINT ["nginx"]
CMD ["-g daemon off;"] CMD ["-g daemon off;"]
``` ```
@ -166,7 +166,7 @@ L'entrypoint peut être utilisé de deux manières différentes :
l'image de PostgreSQL possède cet entrypoint : l'image de PostgreSQL possède cet entrypoint :
<div lang="en-US"> <div lang="en-US">
```shell ```bash
#!/bin/bash #!/bin/bash
set -e set -e
@ -187,7 +187,8 @@ L'entrypoint peut être utilisé de deux manières différentes :
## `[""]`, `'` et sans `[]` ## `[""]`, `'` et sans `[]`
Les instructions `ENTRYPOINT` et `CMD` peuvent prendre deux formes : Les instructions `ENTRYPOINT`{.dockerfile} et `CMD`{.dockerfile} peuvent
prendre deux formes :
- `["cmd", "arg1", "arg2"]` : ici, un simple `exexve` sera effectué avec ces - `["cmd", "arg1", "arg2"]` : ici, un simple `exexve` sera effectué avec ces
arguments. Si d'éventuels variables se trouve dans les arguments, elles ne arguments. Si d'éventuels variables se trouve dans les arguments, elles ne
@ -201,14 +202,14 @@ pouvez pas utiliser les simple quotes.
## Volumes ## Volumes
L'instruction `VOLUME` doit être utilisée pour exposer tous les espaces de L'instruction `VOLUME`{.dockerfile} doit être utilisée pour exposer tous les
stockage de données, configuration, ... espaces de stockage de données, configuration,\ ...
## Réduisez les privilèges ## Réduisez les privilèges
Utilisez l'instruction `USER` dès que vous le pouvez, lorsqu'un service ne Utilisez l'instruction `USER`{.dockerfile} dès que vous le pouvez, lorsqu'un
réclame pas de privilège particulier. service ne réclame pas de privilège particulier.
Il vous faudra sans doute créer l'utilisateur et son groupe dans le Dockerfile. Il vous faudra sans doute créer l'utilisateur et son groupe dans le Dockerfile.

View file

@ -6,7 +6,7 @@ Modification interactive
Pour créer une image, commençons par entrer dans un nouveau conteneur : Pour créer une image, commençons par entrer dans un nouveau conteneur :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run -it ubuntu /bin/bash docker container run -it ubuntu /bin/bash
``` ```
</div> </div>
@ -19,7 +19,7 @@ afin de ne pas livrer de superflu, la liste des paquets et son cache ne sont
pas incluses dans le conteneur. pas incluses dans le conteneur.
<div lang="en-US"> <div lang="en-US">
``` ```bash
apt-get update apt-get update
``` ```
</div> </div>
@ -33,7 +33,7 @@ jour.
Installons maintenant un programme : Installons maintenant un programme :
<div lang="en-US"> <div lang="en-US">
``` ```bash
apt-get install nano apt-get install nano
``` ```
</div> </div>
@ -45,7 +45,7 @@ Sauvegardez vos modifications en tant que nouvelle image Docker, avec
la commande `commit` : la commande `commit` :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container commit CONTAINER my_nano docker container commit CONTAINER my_nano
``` ```
</div> </div>
@ -57,7 +57,7 @@ doit servir de modèle. `my_nano` est le nom que vous voudrez utiliser
Testons sans plus attendre notre nouvelle image : Testons sans plus attendre notre nouvelle image :
<div lang="en-US"> <div lang="en-US">
``` ```bash
docker container run -it my_nano /bin/bash docker container run -it my_nano /bin/bash
``` ```
</div> </div>

View file

@ -7,8 +7,8 @@ Projet
------ ------
Avec l'aide d'un `Dockerfile` *multi-stage*, réalisez l'image la plus petite Avec l'aide d'un `Dockerfile` *multi-stage*, réalisez l'image la plus petite
possible (partant d'un `FROM scratch`), qui permette d'utiliser la [page de possible (partant d'un `FROM scratch`{.dockerfile}), qui permette d'utiliser la
compte à rebours](https://virli.nemunai.re/countdown.html) avec cette [page de compte à rebours](https://virli.nemunai.re/countdown.html) avec cette
configuration pour nginx : configuration pour nginx :
<div lang="en-US"> <div lang="en-US">

View file

@ -1,22 +1,24 @@
--- ---
title: Virtualisation légère -- TP n^o^ 2.1 title: Virtualisation légère -- TP n^o^ 2.1
subtitle: Construire des images Docker subtitle: Construire des images Docker
author: Pierre-Olivier *Nemunaire* Mercier author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA institute: EPITA
date: Jeudi 18 octobre 2018 date: Jeudi 18 octobre 2018
... abstract: |
Durant ce deuxième TP, nous allons voir comment créer nos propres
images !
Durant ce deuxième TP, nous allons voir comment créer nos propres images ! \vspace{1em}
Tous les éléments de ce TP (exercices et projet) sont à rendre à Tous les éléments de ce TP (exercices et projet) sont à rendre à
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2018 à 0 h 42. Consultez la <virli@nemunai.re> au plus tard le mercredi 24 octobre 2018 à 0
dernière section de chaque partie pour plus d'information sur les éléments à h 42. Consultez la dernière section de chaque partie pour plus
rendre. d'information sur les éléments à rendre.
En tant que personnes sensibilisées à la sécurité des échanges électroniques, En tant que personnes sensibilisées à la sécurité des échanges
vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à électroniques, vous devrez m'envoyer vos rendus signés avec votre
[me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire clef PGP. Pensez à
signer votre clef et n'hésitez pas à [me](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96)
[faire signer votre clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/). faire signer votre clef et n'hésitez pas à [faire signer votre
clef](https://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/).
\tableofcontents ...

View file

@ -1,6 +1,20 @@
% Decent marging...
\usepackage[cm]{fullpage} \usepackage[cm]{fullpage}
\addto\captionsfrench{ % Indentation for all paragraph (even the first one) + ventilate
\renewcommand{\contentsname} \usepackage{indentfirst}
{Sommaire} \setlength{\parskip}{6pt plus 2pt minus 1pt}
}
% Avoid vertical space before/after itemize
\usepackage{enumitem}
\setlist{nosep}
% Use sans-serif font for section' titles
\usepackage{sectsty}
\allsectionsfont{\sffamily \bfseries}
% Use monospaced font for URLs
\urlstyle{tt}
% In french, list item starts with dash, not bullet
\renewcommand\labelitemi{---}

View file

@ -20,9 +20,11 @@ La méthode la plus simple pour lancer un conteneur `lxc` est d'utiliser l'un de
ces modèles pour obtenir un nouveau système. On utilise pour cela la commande ces modèles pour obtenir un nouveau système. On utilise pour cela la commande
`lxc-create` : `lxc-create` :
``` <div lang="en-US">
```bash
lxc-create --name toto_first --template debian lxc-create --name toto_first --template debian
``` ```
</div>
Ce modèle va créer un dossier dans `/var/lib/lxc/` (pouvant varier d'une Ce modèle va créer un dossier dans `/var/lib/lxc/` (pouvant varier d'une
distribution à l'autre) portant le nom que nous avons précisé. Ce dossier va distribution à l'autre) portant le nom que nous avons précisé. Ce dossier va
@ -32,9 +34,11 @@ enfin le dossier `rootfs` contenant le système en lui-même.
Une fois l'installation terminée, on peut démarrer le conteneur : Une fois l'installation terminée, on peut démarrer le conteneur :
``` <div lang="en-US">
```bash
lxc-start --name toto_first lxc-start --name toto_first
``` ```
</div>
`lxc` va appeler `/sbin/init` et démarrer tous les services que l'on peut `lxc` va appeler `/sbin/init` et démarrer tous les services que l'on peut
s'attendre à trouver dans n'importe quelle machine virtuelle (et même physique) s'attendre à trouver dans n'importe quelle machine virtuelle (et même physique)
@ -59,9 +63,11 @@ Le modèle *Debian*, que nous avons utilisé, préremplit un fichier de
configuration sans définir de paramètre pour le réseau. Il n'y a donc pas configuration sans définir de paramètre pour le réseau. Il n'y a donc pas
d'interface dans le conteneur pour le connecter : d'interface dans le conteneur pour le connecter :
``` <div lang="en-US">
```lxc
lxc.network.type = empty lxc.network.type = empty
``` ```
</div>
Un excellent article détaillant les différents types de configuration réseau Un excellent article détaillant les différents types de configuration réseau
est accessible à est accessible à
@ -80,12 +86,14 @@ supplémentaire sur le réseau.
Modifions notre fichier de configuration afin qu'il ressemble à quelque chose Modifions notre fichier de configuration afin qu'il ressemble à quelque chose
comme : comme :
``` <div lang="en-US">
```lxc
lxc.network.type = macvlan lxc.network.type = macvlan
lxc.network.macvlan.mode = bridge lxc.network.macvlan.mode = bridge
lxc.network.flags = up lxc.network.flags = up
lxc.network.link = eth0 lxc.network.link = eth0
``` ```
</div>
Après avoir démarré le conteneur, il devrait avoir obtenu une IP du serveur Après avoir démarré le conteneur, il devrait avoir obtenu une IP du serveur
DHCP de l'école. L'inconvénient dans cette configuration est qu'il faille un DHCP de l'école. L'inconvénient dans cette configuration est qu'il faille un
@ -101,11 +109,13 @@ plus flexible.
Voici un extrait de configuration correspondant au paramétrage d'une interface Voici un extrait de configuration correspondant au paramétrage d'une interface
virtuelle pour un conteneur donné : virtuelle pour un conteneur donné :
``` <div lang="en-US">
```lxc
lxc.network.type = veth lxc.network.type = veth
lxc.network.ipv4 = 172.23.42.2/24 lxc.network.ipv4 = 172.23.42.2/24
lxc.network.flags = up lxc.network.flags = up
``` ```
</div>
Dans cette situation, au démarrage du conteneur, `lxc` va créer une interface Dans cette situation, au démarrage du conteneur, `lxc` va créer une interface
veth, avec un côté placé dans la machine hôte et l'autre côté placé dans le veth, avec un côté placé dans la machine hôte et l'autre côté placé dans le
@ -115,9 +125,11 @@ ensuite de configurer la machine hôte.
Commençons par attribuer une IP à cette nouvelle interface, en adaptant à votre Commençons par attribuer une IP à cette nouvelle interface, en adaptant à votre
identifiant d'interface : identifiant d'interface :
``` <div lang="en-US">
```bash
ip addr add 172.23.42.1/24 dev vethYJWD6R ip addr add 172.23.42.1/24 dev vethYJWD6R
``` ```
</div>
À partir de là, nous devrions pouvoir pinger notre conteneur depuis notre À partir de là, nous devrions pouvoir pinger notre conteneur depuis notre
machine hôte : `ping 172.23.42.2`. machine hôte : `ping 172.23.42.2`.
@ -129,9 +141,11 @@ via 10.0.0.0/8, le réseau de l'école.
Pour que notre machine hôte route les paquets, exécuter la commande : Pour que notre machine hôte route les paquets, exécuter la commande :
``` <div lang="en-US">
```bash
sysctl -w net.ipv4.ip_forward=1 sysctl -w net.ipv4.ip_forward=1
``` ```
</div>
Cette variable, que nous retrouvons dans `/proc/sys/net/ipv4/ip_forward`, Cette variable, que nous retrouvons dans `/proc/sys/net/ipv4/ip_forward`,
indique au noyau qu'il peut faire passer les paquets réseau d'une interface à indique au noyau qu'il peut faire passer les paquets réseau d'une interface à
@ -141,16 +155,20 @@ est une adresse privée, non routable sur Internet, ni même par le bocal. Il
faut donc ajouter une couche de NAT/PAT pour réécrire les adresses sources faut donc ajouter une couche de NAT/PAT pour réécrire les adresses sources
avant d'envoyer les paquets sur internet : avant d'envoyer les paquets sur internet :
``` <div lang="en-US">
```bash
iptables -t nat -A POSTROUTING ! -o vethYJWD6R -s 172.23.42.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING ! -o vethYJWD6R -s 172.23.42.0/24 -j MASQUERADE
``` ```
</div>
Dernière étape, dans notre conteneur, nous devons indiquer la route à utiliser Dernière étape, dans notre conteneur, nous devons indiquer la route à utiliser
pour accéder à internet : pour accéder à internet :
``` <div lang="en-US">
```bash
ip route add default via 172.23.42.1 ip route add default via 172.23.42.1
``` ```
</div>
Nous avons maintenant internet dans notre conteneur ! Nous avons maintenant internet dans notre conteneur !
@ -159,18 +177,22 @@ Nous avons maintenant internet dans notre conteneur !
### Installation de InfluxDB ### Installation de InfluxDB
``` <div lang="en-US">
```bash
apt-get update apt-get update
apt-get install wget apt-get install wget
wget https://s3.amazonaws.com/influxdb/influxdb_0.9.4.2_amd64.deb wget https://s3.amazonaws.com/influxdb/influxdb_0.9.4.2_amd64.deb
dpkg -i influxdb_0.9.4.2_amd64.deb dpkg -i influxdb_0.9.4.2_amd64.deb
``` ```
</div>
### Test de l'installation ### Test de l'installation
<div lang="en-US">
``` ```
/opt/influxdb/influxd /opt/influxdb/influxd
``` ```
</div>
Une fois que le service est démarré, vous devriez pouvoir accéder à l'interface Une fois que le service est démarré, vous devriez pouvoir accéder à l'interface
à : <http://172.23.42.2:8083/> à : <http://172.23.42.2:8083/>

16
tutorial/pandoc-opts.mk Normal file
View file

@ -0,0 +1,16 @@
PANDOCOPTS = --pdf-engine=xelatex \
--standalone \
--number-sections \
--toc \
-f markdown+smart \
-M fontsize=12pt \
-M papersize=a4paper \
-M mainfont="Linux Libertine O" \
-M monofont="FantasqueSansMono-Regular" \
-M sansfont="Linux Biolinum O" \
-M colorlinks=true \
-M linkcolor="black" \
-M urlcolor="ForestGreen" \
-M indent=true \
-V toc-title="Sommaire" \
--include-in-header=../header.tex