tutorials: improve theme + use pandoc 2
This commit is contained in:
parent
de21be218a
commit
d25af4fdb2
65 changed files with 1281 additions and 1292 deletions
|
@ -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
|
||||
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
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ echo 'Hello World!' > toto
|
||||
42sh$ setfattr -n user.foo -v bar 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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ sudo chown root:root toto && sudo chmod o-r toto
|
||||
42sh$ cat toto
|
||||
cat: toto: Permission denied
|
||||
|
@ -106,7 +106,7 @@ les ACL POSIX vous autorisent à le lire.
|
|||
Vous pouvez voir ces attributs avec la commande :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ getfattr -d -m "^system" toto
|
||||
# file: toto
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ getfattr -d -m "^security" $(which ping)
|
||||
# file: bin/ping
|
||||
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
|
||||
|
@ -136,7 +136,7 @@ Si votre distribution profite de ces attributs étendus, vous devriez obtenir :
|
|||
Ou, dans sa version plus lisible :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ getcap $(which ping)
|
||||
/bin/ping = cap_net_raw+ep
|
||||
```
|
||||
|
@ -149,7 +149,7 @@ Ou, dans sa version plus lisible :
|
|||
d'un processus :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh$ ./view_caps 1
|
||||
cap_user_header_t
|
||||
-----------------
|
||||
|
@ -181,7 +181,7 @@ d'un processus :
|
|||
Astuces : `capget(2)`, X-macros, ...
|
||||
|
||||
|
||||
## Pour aller plus loin
|
||||
## Pour aller plus loin {-}
|
||||
|
||||
Je vous recommande la lecture des *man* suivants :
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ pas de dossier `freezer` ou si celui-ci est vide, montez-le en suivant la
|
|||
procédure suivante :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
mkdir /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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
mkdir /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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
echo $PID > /sys/fs/cgroup/freezer/virli/tasks
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state
|
||||
```
|
||||
</div>
|
||||
|
@ -120,7 +120,7 @@ calcul à notre shell et ses fils :
|
|||
l'exécution :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state
|
||||
```
|
||||
</div>
|
||||
|
@ -138,7 +138,7 @@ Commençons par lancer le conteneur Docker d'InfluxDB (pour éviter de
|
|||
l'installer sur notre machine) :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker container run --name mytsdb -d -p 8086:8086 influxdb
|
||||
```
|
||||
</div>
|
||||
|
@ -148,7 +148,7 @@ métriques. Voici comment on s'était débrouillé dans un précédent TP pour
|
|||
interagir avec InfluxDB :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker container exec -i mytsdb influxdb <<EOF
|
||||
CREATE DATABASE metrics;
|
||||
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
|
||||
mémoire.
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
42sh# mkdir /sys/fs/cgroup...
|
||||
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: 155648/550502400 (0%)
|
||||
```
|
||||
</div>
|
||||
|
||||
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
|
||||
|
@ -192,7 +194,7 @@ Maintenant, envoyons nos données vers la base
|
|||
<https://docs.influxdata.com/influxdb/v1.6/guides/writing_data/> :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
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)"
|
||||
```
|
||||
|
@ -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
|
||||
processus va pouvoir allouer au maximum :
|
||||
|
||||
```shell
|
||||
<div lang="en-US">
|
||||
```
|
||||
42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes
|
||||
0
|
||||
# 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
|
||||
4194304
|
||||
```
|
||||
</div>
|
||||
|
||||
Chaque *cgroup*s défini de nombreux indicateurs et possède de nombreux
|
||||
limiteurs, n'hésitez pas à consulter la documentation associée à chaque
|
||||
*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
|
||||
Control groups](https://lwn.net/Articles/604609/) est excellente !
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mkdir newroot
|
||||
```
|
||||
</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
|
||||
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
|
||||
première isolation :
|
||||
première isolation\ :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
cp $(which busybox) newroot/
|
||||
chroot newroot /busybox ash
|
||||
```
|
||||
|
@ -39,7 +39,7 @@ Jusque là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour
|
|||
`bash` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ cp $(which bash) newroot/
|
||||
42sh# chroot newroot /bash
|
||||
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.
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
debootstrap jessie newroot/ http://httpredir.debian.org/debian/
|
||||
```
|
||||
</div>
|
||||
|
@ -68,10 +68,10 @@ l'utilisateur lors de l'installation) le système de base.
|
|||
### *stage3*
|
||||
|
||||
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">
|
||||
```shell
|
||||
```bash
|
||||
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/
|
||||
```
|
||||
|
@ -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.
|
||||
|
||||
|
||||
## Exercice
|
||||
## Exercice {-}
|
||||
|
||||
Écrivons maintenant un programme dont le seul but est de s'échapper du `chroot` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
make escape
|
||||
echo bar > ../foo
|
||||
chroot .
|
||||
|
@ -96,7 +96,7 @@ environnement qui tient dans 300 MB.
|
|||
Dans le nouvel environnement, vous ne devriez pas pouvoir faire :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
cat ../foo
|
||||
```
|
||||
</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 !
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
./escape
|
||||
cat /path/to/foo
|
||||
```
|
||||
(chroot) 42sh# ./escape
|
||||
bash# cat /path/to/foo
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
make menuconfig
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -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` :
|
||||
|
||||
```shell
|
||||
<div lang="en-US">
|
||||
```
|
||||
42sh$ cat /sys/power/state
|
||||
freeze mem
|
||||
```
|
||||
</div>
|
||||
|
||||
La modification d'un élément se fait avec `echo`, comme ceci :
|
||||
|
||||
```shell
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
42sh# echo mem > /sys/power/state
|
||||
```
|
||||
</div>
|
||||
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh$ ./rev_kdb_leds.sh input20
|
||||
```
|
||||
</div>
|
||||
|
@ -158,7 +162,7 @@ Voici un exemple d'utilisation :
|
|||
Voici un exemple d'utilisation :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh$ ./batinfo.sh
|
||||
BAT0 Discharging
|
||||
====
|
||||
|
@ -184,7 +188,7 @@ Voici un exemple d'utilisation :
|
|||
Voici un exemple d'utilisation :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh$ ./cpuinfo.sh
|
||||
cpu0
|
||||
====
|
||||
|
|
|
@ -77,7 +77,7 @@ argument de l'appel système :
|
|||
</div>
|
||||
|
||||
|
||||
### Exercice
|
||||
### Exercice {-}
|
||||
|
||||
Écrivez un programme filtrant un appel système, à l'aide de `seccomp` :
|
||||
|
||||
|
|
|
@ -1,22 +1,25 @@
|
|||
---
|
||||
title: Virtualisation légère -- TP n^o^ 3
|
||||
subtitle: Linux Internals partie 1
|
||||
author: Pierre-Olivier *Nemunaire* Mercier
|
||||
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||
institute: EPITA
|
||||
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
|
||||
|
|
|
@ -1,22 +1,8 @@
|
|||
include ../pandoc-opts.mk
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ Exemples {.unnumbered}
|
|||
--------
|
||||
|
||||
<div lang="en-US">
|
||||
```sh
|
||||
```
|
||||
42sh$ ./cmpns $(pgrep influxdb) $(pgrep init)
|
||||
- cgroup: differ
|
||||
- ipc: differ
|
||||
|
@ -30,7 +30,7 @@ Exemples {.unnumbered}
|
|||
</div>
|
||||
|
||||
<div lang="en-US">
|
||||
```sh
|
||||
```
|
||||
42sh$ ./cmpns $(pgrep init) self
|
||||
- cgroup: same
|
||||
- ipc: same
|
||||
|
@ -47,7 +47,7 @@ Ici, `self` fait référence au processus actuellement exécuté.
|
|||
Et pourquoi pas :
|
||||
|
||||
<div lang="en-US">
|
||||
```sh
|
||||
```
|
||||
42sh$ unshare -m ./cmpns $$ self
|
||||
- cgroup: same
|
||||
- ipc: same
|
||||
|
|
|
@ -17,11 +17,11 @@ Pour savoir si vous avez réussi, comparez les sorties des commandes :
|
|||
- ...
|
||||
|
||||
|
||||
Tests {.unnumbered}
|
||||
Tests {-}
|
||||
-----
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh$ docker run --name mywebserver -d -p 80:80 nginx
|
||||
d63ceae863956f8312aca60b7a57fbcc1fdf679ae4c90c5d9455405005d4980a
|
||||
42sh$ docker container inspect --format '{{ .State.Pid }}' mywebserver
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
---
|
||||
title: Virtualisation légère -- Linux Internals partie 2
|
||||
subtitle: Support de cours
|
||||
author: Pierre-Olivier *nemunaire* Mercier
|
||||
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||
institute: EPITA
|
||||
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
|
||||
|
|
|
@ -63,7 +63,7 @@ Lorsque l'on souhaite monter à un deuxième endroit (ou plus) une partition, on
|
|||
utilise le *bind mount* :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
mount --bind olddir newdir
|
||||
```
|
||||
</div>
|
||||
|
@ -81,7 +81,7 @@ Pour que tout cela fonctionne, nous aurons besoin, au préalable, d'exécuter le
|
|||
commandes suivantes :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
cd newroot
|
||||
mount --bind /dev dev
|
||||
mount --bind /proc proc
|
||||
|
@ -104,7 +104,7 @@ d'accroche qu'il contient, il faut utiliser `--rbind`. Il serait donc plus
|
|||
correct de lancer :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
cd newroot
|
||||
mount --rbind /dev dev
|
||||
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*).
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
# Création de notre répertoire de travail
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mkdir /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*.
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
# Suite de l'exemple précédent
|
||||
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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mkdir /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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mkdir /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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mount --make-private mountpoint
|
||||
```
|
||||
</div>
|
||||
|
@ -214,7 +214,7 @@ propagation, on utilise l'option suivante :
|
|||
Ce mode interdira tout tentative d'attache à un autre endroit.
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mount --make-unbindable /mnt/test-slave
|
||||
```
|
||||
</div>
|
||||
|
@ -222,7 +222,7 @@ Ce mode interdira tout tentative d'attache à un autre endroit.
|
|||
Il ne sera pas possible de faire :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mkdir /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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
mount --make-rshared mountpoint
|
||||
mount --make-rslave 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)` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mount --move olddir newdir
|
||||
```
|
||||
</div>
|
||||
|
@ -277,7 +277,7 @@ On utilise pour cela l'option `--move` de `mount(8)` :
|
|||
Par exemple :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mount --move /dev /newroot/dev
|
||||
```
|
||||
</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, ...
|
||||
|
||||
|
||||
## Aller plus loin
|
||||
## Aller plus loin {-}
|
||||
|
||||
Voici quelques articles qui valent le détour, en lien avec les points de
|
||||
montage :
|
||||
|
|
|
@ -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
|
||||
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
|
||||
l'arborescence !
|
||||
l'arborescence\ !
|
||||
|
||||
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
|
||||
|
@ -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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# mkdir /mnt/newroot
|
||||
42sh# mount -t tmpfs none /mnt/newroot
|
||||
```
|
||||
|
@ -73,7 +73,7 @@ devoir nous isoler sur :
|
|||
Isolons-nous :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# unshare -p -m -f --mount-proc
|
||||
```
|
||||
</div>
|
||||
|
@ -89,7 +89,7 @@ Commençons donc par étiqueter tous nos points de montage (de ce *namespace*),
|
|||
comme esclave :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# mount --make-rslave /
|
||||
```
|
||||
</div>
|
||||
|
@ -131,7 +131,7 @@ Pour lancer la première commande dans la nouvelle racine, on passe généraleme
|
|||
par :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# exec chroot / command
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -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
|
||||
noms.
|
||||
|
||||
```shell
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
mount --make-rslave /
|
||||
```
|
||||
</div>
|
||||
|
||||
|
||||
### 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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh# hostname --fqdn
|
||||
koala.zoo.paris
|
||||
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)` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# nsenter --uts=/proc/42/ns/uts /bin/bash
|
||||
```
|
||||
</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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# touch /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.
|
||||
|
||||
|
||||
## Aller plus loin
|
||||
## Aller plus loin {-}
|
||||
|
||||
Je vous recommande la lecture des *man* suivants :
|
||||
|
||||
|
|
|
@ -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* :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh# unshare -n ip a
|
||||
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
|
||||
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# ip netns add virli
|
||||
```
|
||||
</div>
|
||||
|
@ -53,7 +53,7 @@ Maintenant que notre *namespace* est créé, nous pouvons regarder s'il contient
|
|||
des interfaces :
|
||||
|
||||
<div lang="en-US">
|
||||
```sh
|
||||
```
|
||||
42sh# ip netns exec virli ip link
|
||||
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
|
||||
|
@ -67,7 +67,7 @@ D'ailleurs, cette interface est rapportée comme étant désactivée, activons-l
|
|||
via la commande :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# ip netns exec virli ip link set dev lo up
|
||||
```
|
||||
</div>
|
||||
|
@ -75,7 +75,7 @@ via la commande :
|
|||
À ce stade, nous pouvons déjà commencer à lancer un `ping` sur cette interface:
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh# ip netns exec virli ping 127.0.0.1
|
||||
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
|
||||
|
@ -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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# ip link set veth1 netns virli
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
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
|
||||
```
|
||||
|
@ -132,7 +132,7 @@ Dès lors[^linkdown], nous pouvons `ping`er chaque extrêmité :
|
|||
vethX up`.
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh# ping 10.10.10.42
|
||||
- et -
|
||||
42sh# ip netns exec virli ping 10.10.10.41
|
||||
|
@ -229,7 +229,7 @@ Pour construire une nouvelle interface de ce type :
|
|||
</div>
|
||||
|
||||
|
||||
## Aller plus loin
|
||||
## Aller plus loin {-}
|
||||
|
||||
Pour approfondir les différentes techniques de routage, je vous
|
||||
recommande cet article :
|
||||
|
|
|
@ -23,7 +23,7 @@ trouve.
|
|||
Première étape s'isoler :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# unshare --pid --fork /bin/bash
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# unshare --pid --mount --fork --mount-proc /bin/bash
|
||||
```
|
||||
</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.
|
||||
|
||||
|
||||
## Aller plus loin
|
||||
## Aller plus loin {-}
|
||||
|
||||
N'hésitez pas à jeter un œil à la page de manuel consacré à cet espace de
|
||||
noms : `pid_namespaces(7)`.
|
||||
|
|
|
@ -94,9 +94,11 @@ noyau pour adapter le comportement.
|
|||
Si vous utilisez Debian ou l'un de ses dérivés, vous devrez autoriser
|
||||
explicitement cette utilisation non-privilégiée :
|
||||
|
||||
```shell
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
42sh# sysctl -w kernel.unprivileged_userns_clone=1
|
||||
```
|
||||
</div>
|
||||
|
||||
|
||||
### Grsecurity {.unnumbered}
|
||||
|
|
|
@ -1,22 +1,24 @@
|
|||
---
|
||||
title: Virtualisation légère -- TP n^o^ 4
|
||||
subtitle: Linux Internals partie 2
|
||||
author: Pierre-Olivier *nemunaire* Mercier
|
||||
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||
institute: EPITA
|
||||
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
|
||||
|
|
|
@ -98,7 +98,7 @@ des groupes au lieu des utilisateurs.
|
|||
## Utilisation de l'espace de noms
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash
|
||||
```
|
||||
</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.
|
||||
|
||||
|
||||
## Aller plus loin
|
||||
## Aller plus loin {-}
|
||||
|
||||
N'hésitez pas à jeter un œil à la page du manuel consacré à ce *namespace* :
|
||||
`user_namespaces(7)`.
|
||||
|
|
|
@ -1,19 +1,6 @@
|
|||
include ../pandoc-opts.mk
|
||||
|
||||
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
|
||||
|
|
|
@ -145,7 +145,7 @@ Une fois le build terminé, nous pouvons lancer la commande suivante et admirer
|
|||
le résultat :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker-compose up
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -47,7 +47,7 @@ le client fourni :
|
|||
<div lang="en-US">
|
||||
```
|
||||
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
|
||||
InfluxDB shell version: 1.6.3
|
||||
> 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* :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
curl https://dl.influxdata.com/telegraf/releases/telegraf-1.8.1-static_linux_amd64.tar.gz | \
|
||||
tar xzv -C /tmp
|
||||
```
|
||||
|
@ -93,7 +93,7 @@ système. Pour cela, on commence par télécharger *Telegraf* :
|
|||
Puis, lançons *Telegraf* :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
cd /tmp/telegraf
|
||||
./telegraf --config telegraf.conf
|
||||
```
|
||||
|
@ -107,9 +107,9 @@ rediriger le port de notre conteneur sur notre machine locale (option `-p`).
|
|||
Et observons ensuite :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
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
|
||||
> show 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
|
||||
|
||||
\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).
|
||||
|
||||
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)
|
||||
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
|
||||
apparaître. En cliquant dessus vous obtiendrez des graphiques similaires à ceux
|
||||
ci-dessous :
|
||||
|
||||
|
||||

|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-Linux-x86_64 \
|
||||
> /usr/bin/docker-compose
|
||||
chmod +x /usr/bin/docker-compose
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
---
|
||||
title: Virtualisation légère -- TP n^o^ 2.2
|
||||
subtitle: Aller plus loin avec Docker
|
||||
author: Pierre-Olivier *Nemunaire* Mercier
|
||||
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||
institute: EPITA
|
||||
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 à
|
||||
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2017 à 0 h 42. Consultez la
|
||||
dernière section de chaque partie pour plus d'information sur les éléments à
|
||||
rendre.
|
||||
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2017 à 0
|
||||
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
|
||||
[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/).
|
||||
...
|
||||
|
|
|
@ -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
|
||||
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
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container rm 0e8bbff6d500 552d71619723
|
||||
```
|
||||
</div>
|
||||
|
@ -40,7 +40,7 @@ conteneurs. Pour les supprimer, utilisez la commande :
|
|||
ou encore :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container rm cranky_jones dreamy_gates
|
||||
```
|
||||
</div>
|
||||
|
@ -62,6 +62,6 @@ une commande `prune` qui supprimera les objets inutilisés.
|
|||
|
||||
## `docker-gc`
|
||||
|
||||
Vous pouvez également utiliser l'image <https://github.com/spotify/docker-gc>
|
||||
pour effectuer le ménage de manière automatique, plus fréquemment. Mais
|
||||
attention à vos données !
|
||||
Vous pouvez également utiliser l'image
|
||||
[https://github.com/spotify/docker-gc](`docker-gc`) pour effectuer le ménage de
|
||||
manière automatique, plus fréquemment. Mais attention à vos données !
|
||||
|
|
|
@ -12,7 +12,7 @@ page : <https://you.p0m.fr/>.
|
|||
Nous pouvons télécharger et lancer le service grâce à :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run -i nemunaire/youp0m
|
||||
```
|
||||
</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> :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run -i -p 8080:8080 nemunaire/youp0m
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
base64 monimage.jpg | curl --data @- http://localhost:8080/api/images/monimage
|
||||
```
|
||||
</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 :
|
||||
|
||||
<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/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
|
||||
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run -d -p 8080:8080 nemunaire/youp0m
|
||||
```
|
||||
</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) :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container logs 0123456789abcdef
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run -d -p 8080:8081 nemunaire/youp0m
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container stop 0123456789abcdef
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -4,10 +4,10 @@ Mon premier conteneur
|
|||
=====================
|
||||
|
||||
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">
|
||||
```
|
||||
```bash
|
||||
docker container run hello-world
|
||||
```
|
||||
</div>
|
||||
|
@ -26,7 +26,7 @@ Nous pouvons directement utiliser le client pour rechercher une image sur le
|
|||
*Store*, en utilisant la commande `search` :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker search mariadb
|
||||
```
|
||||
</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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker image pull ubuntu
|
||||
```
|
||||
</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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker image ls
|
||||
```
|
||||
</div>
|
||||
|
@ -88,7 +88,7 @@ lancer dans le conteneur ainsi que ses éventuels arguments. Essayons d'afficher
|
|||
un Hello World :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run ubuntu /bin/echo "Hello World"
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run alpine /sbin/apk stats
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker DOCKER_PARAMS container run RUN_OPTS image IMAGE_CMD IMAGE_ARGS ...
|
||||
```
|
||||
</div>
|
||||
|
@ -147,7 +147,7 @@ commande peut prendre des paramètres :
|
|||
Par exemple :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker -H unix:///var/run/docker.sock container run -it alpine /bin/ash -c "echo foo"
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker version
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
sudo service docker restart
|
||||
```
|
||||
</div>
|
||||
|
@ -151,7 +151,7 @@ denied.`, ajoutez votre utilisateur au groupe `docker` et **relancez votre
|
|||
session** :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
sudo gpasswd -a $USER docker
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker network create --driver bridge my_fic
|
||||
```
|
||||
</div>
|
||||
|
@ -88,7 +88,7 @@ C'est ensuite ce nom de réseau que vous passerez à l'option `--network` de vos
|
|||
réseau :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker network connect NETWORK CONTAINER
|
||||
```
|
||||
</div>
|
||||
|
@ -98,7 +98,7 @@ mutuellement se découvrir grâce à un système de résolution de nom basé sur
|
|||
nom de conteneur.
|
||||
|
||||
|
||||
## Exercice
|
||||
## Exercice {-}
|
||||
|
||||
À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run --rm -e MYSQL_HOST="tcp(mysql_cntr_name:3306)" nemunaire/fic-admin -help
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -38,7 +38,7 @@ a pu voir durant ce premier cours.
|
|||
### Exemple d'exécution
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
42sh$ ./mycloud-run.sh
|
||||
http://localhost:12345/
|
||||
42sh$ #docker kill db
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
---
|
||||
title: Virtualisation légère -- TP n^o^ 1
|
||||
subtitle: Les bases de Docker
|
||||
author: Pierre-Olivier *Nemunaire* Mercier
|
||||
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||
institute: EPITA
|
||||
date: Jeudi 4 octobre 2018
|
||||
...
|
||||
|
||||
abstract: |
|
||||
Durant ce premier TP, nous allons apprendre à utiliser Docker !
|
||||
|
||||
Le TP se termine par un petit projet à rendre à <virli@nemunai.re> au plus tard
|
||||
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.
|
||||
\vspace{1em}
|
||||
|
||||
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/).
|
||||
Le TP se termine par un petit projet à rendre à <virli@nemunai.re>
|
||||
au plus tard 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.
|
||||
|
||||
\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/).
|
||||
...
|
||||
|
|
|
@ -28,7 +28,7 @@ le protocole HTTP, mais sans se casser la tête à installer et configurer un
|
|||
serveur web :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run --rm -p 80:80 -v ~/Downloads:/usr/share/nginx/html:ro -d nginx
|
||||
```
|
||||
</div>
|
||||
|
@ -48,7 +48,7 @@ Comme il s'agit d'un objet, la première chose à faire va être de créer notre
|
|||
volume :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker volume create prod_youp0m
|
||||
docker volume create prod_foodp0m
|
||||
```
|
||||
|
@ -57,7 +57,7 @@ volume :
|
|||
Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run --mount source=prod_youp0m,target=/srv/images nemunaire/youp0m
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run --name mydb --mount source=prod_db,target=/var/lib/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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run -it --volume-from mydb busybox /bin/bash
|
||||
```
|
||||
</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
|
||||
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
|
||||
exclusivement en RAM :
|
||||
exclusivement en RAM\ :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run --mount type=tmpfs,target=/srv/images nemunaire/youp0m
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -1,19 +1,6 @@
|
|||
include ../pandoc-opts.mk
|
||||
|
||||
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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
\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
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
curl http://localhost:6060/v1/namespaces
|
||||
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) :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
pip3 install paclair
|
||||
```
|
||||
</div>
|
||||
|
@ -121,7 +121,7 @@ Pour obtenir un rapport d'analyse, on commence par envoyer les couches de
|
|||
l'image à `Clair` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
paclair --conf conf.yml Docker nemunaire/fic-admin push
|
||||
```
|
||||
</div>
|
||||
|
@ -129,7 +129,7 @@ l'image à `Clair` :
|
|||
Puis on lui demande la génération d'un rapport `html` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
paclair --conf conf.yml Docker nemunaire/fic-admin analyse --output-format html --output-report file
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ paclair --conf conf.yml Docker node:latest analyse --output-format stats
|
||||
Unknown: 2
|
||||
Negligible: 1
|
||||
|
@ -147,7 +147,7 @@ Si l'on souhaite uniquement avoir des statistiques dans la console :
|
|||
</div>
|
||||
|
||||
|
||||
## Exercice {.unnumbered}
|
||||
## Exercice {-}
|
||||
|
||||
Déterminez le nombre de vulnérabilités dans les principales images officielles
|
||||
du [Docker Hub](https://hub.docker.com/explore), notamment `nginx`, `golang`,
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
||||
## *namespaces*
|
||||
## `namespaces`
|
||||
|
||||
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
|
||||
|
@ -134,7 +134,7 @@ Ou inversement, pour persister dans le namespace initial :
|
|||
</div>
|
||||
|
||||
|
||||
### Partage de *namespace*
|
||||
### Partage de `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.
|
||||
|
@ -175,7 +175,7 @@ plates-formes pour aller y lancer des instances de cette image !
|
|||
Pour construire l'image faite précédemment :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
linuxkit build hello.yml
|
||||
```
|
||||
</div>
|
||||
|
@ -185,7 +185,7 @@ partie `kernel`) ainsi qu'une image. Exactement ce qu'attend QEMU ! Pour
|
|||
tester, n'attendons pas davantage pour lancer :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
linuxkit run qemu -gui hello
|
||||
```
|
||||
</div>
|
||||
|
@ -244,7 +244,7 @@ une interface `virtual ethernet` :
|
|||
</div>
|
||||
|
||||
|
||||
## Exercice
|
||||
## Exercice {-}
|
||||
|
||||
Réalisez une recette `vault.yml` démarrant une instance du gestionnaire de
|
||||
secrets [Hashicorp Vault](https://www.vaultproject.io/), utilisant une [base de
|
||||
|
|
|
@ -75,7 +75,7 @@ Dernière née de l'organisme, cette spécification fédère la notion de
|
|||
aussi en envoyer.
|
||||
|
||||
|
||||
## Pour aller plus loin
|
||||
## Pour aller plus loin {-}
|
||||
|
||||
Si maintenant `docker` fait appel à un programme externe pour lancer
|
||||
effectivement nos conteneurs, c'est que l'on peut changer cette implémentation
|
||||
|
|
|
@ -3,6 +3,8 @@ Registres
|
|||
|
||||
**Outils nécessaires :** `curl`, `gunzip`, `jq`, `tar`.
|
||||
|
||||
* * * * *
|
||||
|
||||
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
|
||||
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
|
||||
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` :
|
||||
`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
|
||||
dépôt (*repository*).
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
42sh$ curl "https://auth.docker.io/token"\
|
||||
> "?service=registry.docker.io&scope=repository:library/hello-world:pull" | jq .
|
||||
```bash
|
||||
42sh$ curl "https://auth.docker.io/token?service=registry.docker.io&"\
|
||||
> "scope=repository:library/hello-world:pull" | jq .
|
||||
```
|
||||
```json
|
||||
{
|
||||
|
@ -50,7 +52,7 @@ registre.
|
|||
Avec `jq`, on peut l'extraire grâce à :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
| jq -r .token
|
||||
```
|
||||
</div>
|
||||
|
@ -62,7 +64,7 @@ Une fois en possession de notre jeton, nous pouvons maintenant demander l'index
|
|||
d'images à notre registre :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
curl -s \
|
||||
-H "Authorization: Bearer ${TOKEN}" \
|
||||
-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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
curl -s \
|
||||
-H "Authorization: Bearer ${TOKEN}" \
|
||||
-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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
curl -s --location \
|
||||
-H "Authorization: Bearer ${TOKEN}" \
|
||||
"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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
wget --header "Authorization: Bearer ${TOKEN}" \
|
||||
"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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
mkdir 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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# chroot rootfs /hello
|
||||
Hello from Docker!
|
||||
[...]
|
||||
|
@ -143,12 +145,12 @@ Et voilà, nous avons extrait notre première image, nous devrions pouvoir :
|
|||
</div>
|
||||
|
||||
|
||||
## Exercice {.unnumbered}
|
||||
## Exercice {-}
|
||||
|
||||
Réalisez un script pour automatiser l'ensemble de ces étapes :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ cd $(mktemp)
|
||||
|
||||
42sh$ ~/workspace/registry_play.sh library/hello
|
||||
|
|
|
@ -32,7 +32,13 @@ vous pouvez télécharger la dernière version :
|
|||
d'alpine : `library/alpine` dans le registre Docker.
|
||||
|
||||
Si vous n'avez pas eu le temps de terminer l'exercice précédent, vous pouvez
|
||||
utiliser `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
|
||||
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
runc spec
|
||||
```
|
||||
</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* :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh$ ls
|
||||
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. :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh# runc list
|
||||
ID PID STATUS BUNDLE CREATED OWNER
|
||||
virli1 12345 running /tmp/work/runctest 2012-12-12T12:12:12.123456789Z root
|
||||
|
@ -81,13 +87,13 @@ journaux, etc. :
|
|||
</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
|
||||
qui sont montés. Nous pouvons les filtrer avec :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ jq .mounts config.json
|
||||
```
|
||||
```json
|
||||
|
@ -119,12 +125,12 @@ ajouter un élément à cette liste, demandant de *bind* :
|
|||
</div>
|
||||
|
||||
|
||||
## Exercice
|
||||
## Exercice {-}
|
||||
|
||||
Serez-vous capable de continuer l'édition de votre `config.json` afin d'obtenir
|
||||
les mêmes restrictions que votre projet de moulette ?
|
||||
|
||||
* CGroups : 1GB RAM, 100 PID, ...
|
||||
* CGroups : 1\ GB RAM, 100\ PIDs, ...
|
||||
* strict minimum de capabilities ;
|
||||
* filtres `seccomp` ;
|
||||
* carte réseau `veth` ;
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
---
|
||||
title: Virtualisation légère -- TP n^o^ 5
|
||||
subtitle: Docker Internals
|
||||
author: Pierre-Olivier *Nemunaire* Mercier
|
||||
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||
institute: EPITA
|
||||
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 à
|
||||
<virli@nemunai.re> au plus tard le dimanche 25 novembre 2018 à 23 h 42. Consultez la
|
||||
dernière section de chaque partie pour plus d'information sur les éléments à
|
||||
rendre.
|
||||
<virli@nemunai.re> au plus tard le dimanche 25 novembre 2018 à 23
|
||||
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
|
||||
[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/).
|
||||
...
|
||||
|
|
|
@ -1,19 +1,6 @@
|
|||
include ../pandoc-opts.mk
|
||||
|
||||
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
|
||||
|
|
|
@ -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) :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker-machine create --driver virtualbox echinoidea
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
$ docker container ls
|
||||
```
|
||||
42sh$ docker container ls
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS
|
||||
$ eval $(docker-machine env echinoidea)
|
||||
$ docker container ls -a
|
||||
42sh$ eval $(docker-machine env echinoidea)
|
||||
42sh$ docker container ls -a
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS
|
||||
a814293b9f45 armbuild/busybox "/bin/sh" 18 seconds ago Up 10 minutes
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
(virt1) 42sh$ netstat -tpln | grep dockerd
|
||||
Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
|
||||
tcp 0 0 :::2376 :::* 980/dockerd
|
||||
|
@ -151,7 +151,7 @@ virtuelle écoute :
|
|||
Essayons de renseigner simplement cette configuration à notre client Docker :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
(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".
|
||||
* 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.
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
(main) 42sh$ mkdir remote/virt1
|
||||
(main) 42sh$ scp "docker@$VM1_IP:.docker/*" remote/virt1
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
42sh$ DOCKER_CERT_PATH=remote/virt1/ docker -H tcp://$VM1_IP:2376/ --tlsverify info
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -27,7 +27,7 @@ pour bon nombres d'environnements. Nous pouvons l'installer en suivant la
|
|||
procédure suivante :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-Linux-x86_64 \
|
||||
> /usr/bin/docker-machine
|
||||
chmod +x /usr/bin/docker-machine
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker container run --name mywebs -d nginx
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker service create --name myWebS nginx
|
||||
```
|
||||
</div>
|
||||
|
@ -46,7 +46,7 @@ Allons-y, essayons !
|
|||
On peut consulter l'état du service avec, comme d'habitude `ls` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh$ docker service ls
|
||||
ID NAME MODE REPLICAS IMAGE PORTS
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker service update --publish-add 80 myWebS
|
||||
```
|
||||
</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">
|
||||
```shell
|
||||
```bash
|
||||
docker service update --replicas 3 myWebS
|
||||
```
|
||||
</div>
|
||||
|
@ -117,7 +117,7 @@ Ce qui se fait souvent avec beaucoup de douleur hors de Docker, se résume ici
|
|||
Roulement de tambours .......
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker service ps myWebS
|
||||
```
|
||||
</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` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker stack deploy --compose-file docker-compose.yml tic
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker swarm init
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
docker swarm join-token worker
|
||||
```
|
||||
</div>
|
||||
|
@ -119,7 +119,7 @@ utilisant `docker-machine`.
|
|||
des redirections de ports, mais le résultat n'est pas garanti !
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
eval $(docker-machine env echinoidea)
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```
|
||||
42sh$ eval $(docker-machine env -u)
|
||||
42sh$ docker node ls
|
||||
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
|
||||
|
|
|
@ -1,22 +1,24 @@
|
|||
---
|
||||
title: Virtualisation légère -- TP n^o^ 2.3
|
||||
subtitle: L'orchestration avec Docker
|
||||
author: Pierre-Olivier *Nemunaire* Mercier
|
||||
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||
institute: EPITA
|
||||
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 à
|
||||
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2018 à 0 h 42. Consultez la
|
||||
dernière section de chaque partie pour plus d'information sur les éléments à
|
||||
rendre.
|
||||
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2018 à 0
|
||||
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
|
||||
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/).
|
||||
...
|
||||
|
|
|
@ -1,19 +1,6 @@
|
|||
include ../pandoc-opts.mk
|
||||
|
||||
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
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
FROM ubuntu:latest
|
||||
|
||||
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
|
||||
est suivie de ses arguments.
|
||||
|
||||
Dans notre exemple, nous utilisons `FROM` qui indique une image de départ à
|
||||
utiliser ; `RUN` est une commande qui sera exécutée dans le conteneur, dans le
|
||||
but de le construire.
|
||||
Dans notre exemple, nous utilisons `FROM`{.dockerfile} qui indique une image de
|
||||
départ à utiliser ; `RUN`{.dockerfile} est une commande qui sera exécutée dans
|
||||
le conteneur, dans le but de le construire.
|
||||
|
||||
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
|
||||
lançons la commande `build` :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker image build --tag=my_editor .
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run -it my_editor /bin/bash
|
||||
```
|
||||
</div>
|
||||
|
@ -53,7 +53,7 @@ correspondra à une nouvelle couche de notre image.
|
|||
Cela signifie que l'exemple suivant **ne fonctionne pas** :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
COPY db.sql /db.sql
|
||||
RUN service mysqld start
|
||||
RUN mysql -u root -p toor virli < /db.sql
|
||||
|
@ -61,14 +61,14 @@ Cela signifie que l'exemple suivant **ne fonctionne pas** :
|
|||
</div>
|
||||
|
||||
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
|
||||
`service` se termine. En fait, à chaque instruction, Docker réalise
|
||||
premier `RUN`{.dockerfile}, mais il se trouve brûtalement arrêté dès lors que
|
||||
la commande `service` se termine. En fait, à chaque instruction, Docker réalise
|
||||
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
|
||||
mysql` :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run tinysql service mysqld start
|
||||
```
|
||||
</div>
|
||||
|
@ -79,16 +79,16 @@ processus.
|
|||
Pour avoir le résultat escompté, il faut exécuter les commandes ensemble :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
COPY db.sql /db.sql
|
||||
RUN service mysqld start && mysql -u root -p toor virli < /db.sql
|
||||
```
|
||||
</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
|
||||
d'exécution lorsque l'on invoquera un conteneur par `docker container
|
||||
En aucun cas, une commande exécutée par un `RUN`{.dockerfile} se retrouvera en
|
||||
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
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
FROM my_editor
|
||||
|
||||
RUN apt-get update
|
||||
|
@ -108,7 +108,7 @@ Construisons maintenant un conteneur avec un service web :
|
|||
```
|
||||
</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'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/>.
|
||||
|
||||
*À 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
|
||||
d'inspiration, utilisez [cette page de compte à
|
||||
rebours](https://virli.nemunai.re/countdown.html).
|
||||
|
@ -169,22 +169,22 @@ images), en haut du `Dockerfile`.
|
|||
|
||||
## Métadonnées pures
|
||||
|
||||
L'instruction LABEL permet d'ajouter une métadonnée à une image, sous forme de
|
||||
clef/valeur.
|
||||
L'instruction `LABEL`{.dockerfile} permet d'ajouter une métadonnée à une image,
|
||||
sous forme de clef/valeur.
|
||||
|
||||
Une métadonnée
|
||||
[courante](https://github.com/nginxinc/docker-nginx/blob/master/mainline/stretch/Dockerfile#L3)
|
||||
est d'indiquer le nom du mainteneur de l'image :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
LABEL maintainer="Pierre-Olivier Mercier <nemunaire@nemunai.re>"
|
||||
```
|
||||
</div>
|
||||
|
||||
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
|
||||
indiquer que c'est vous qui maintenez cette image, si des utilisateurs ont
|
||||
prénoms et mails de contact avec l'instruction `LABEL maintainer`{.dockerfile},
|
||||
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
|
||||
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
|
||||
|
||||
Vous pouvez placer dans un `Dockerfile` une instruction `CMD` qui sera exécutée
|
||||
si aucune commande n'est passée lors du `run`, par exemple :
|
||||
Vous pouvez placer dans un `Dockerfile` une instruction `CMD`{.dockerfile} qui
|
||||
sera exécutée si aucune commande n'est passée lors du `run`, par exemple :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
CMD nginx -g "daemon off;"
|
||||
```
|
||||
</div>
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
42sh$ docker image build --tag=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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
FROM gcc:4.9
|
||||
COPY . /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
|
||||
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
|
||||
l'image vide, dans laquelle nous recopions simplement le produit de notre
|
||||
compilation.
|
||||
`hello.c`. Mais l'image finale (le dernier `FROM`{.dockerfile} de notre
|
||||
`Dockerfile`) est l'image vide, dans laquelle nous recopions simplement le
|
||||
produit de notre compilation.
|
||||
|
||||
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.
|
||||
|
@ -267,7 +267,7 @@ donner des noms à chaque image, plutôt que de devoir jongler avec les
|
|||
numéros. Dans ce cas, on indiquera :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
FROM gcc:4.9 as builder
|
||||
COPY . /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.
|
||||
|
||||
|
||||
## Exercice
|
||||
## Exercice {-}
|
||||
|
||||
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
|
||||
|
@ -311,17 +311,12 @@ Pour réaliser ce genre de contribution, on ajoute généralement un `Dockerfile
|
|||
à la racine du dépôt.
|
||||
|
||||
Vous pouvez cloner le dépôts de sources de `youp0m` à :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
https://git.nemunai.re/youp0m.git
|
||||
```
|
||||
</div>
|
||||
<https://git.nemunai.re/youp0m.git>
|
||||
|
||||
Pour compiler le projet, vous pouvez utiliser dans votre `Dockerfile`
|
||||
|
||||
<div lang="en-US">
|
||||
```go
|
||||
```dockerfile
|
||||
FROM golang:1.11
|
||||
COPY . /go/src/git.nemunai.re/youp0m
|
||||
WORKDIR /go/src/git.nemunai.re/youp0m
|
||||
|
|
|
@ -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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
42sh$ docker run -d -p 80:80 youp0m -bind :80
|
||||
```bash
|
||||
docker run -d -p 80:80 youp0m -bind :80
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
42sh$ docker run -d -p 80:80 youp0m /srv/youp0m -bind :80
|
||||
```bash
|
||||
docker run -d -p 80:80 youp0m /srv/youp0m -bind :80
|
||||
```
|
||||
</div>
|
||||
|
||||
Essayez les deux commandes, si vous avez utilisé l'instruction `CMD` dans votre
|
||||
`Dockerfile` jusqu'à présent, vous devez vous trouver dans le deuxième cas.
|
||||
Essayez les deux commandes, si vous avez utilisé l'instruction
|
||||
`CMD`{.dockerfile} dans votre `Dockerfile` jusqu'à présent, vous devez vous
|
||||
trouver dans le deuxième cas.
|
||||
|
||||
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`.
|
||||
|
||||
|
||||
|
@ -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/>) :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
42sh$ docker run -i --rm -p 8080:8080 -e YOUP0M_PASSWORD=admin youp0m
|
||||
```bash
|
||||
docker run -i --rm -p 8080:8080 -e YOUP0M_PASSWORD=admin youp0m
|
||||
```
|
||||
</div>
|
||||
|
||||
### Bases du script
|
||||
|
||||
Notre script d'`ENTRYPOINT` sera appelé avec en argument, ceux passés par
|
||||
l'utilisateur après le nom de l'image, ou, à défaut, le contenu de `CMD`.
|
||||
Notre script d'`ENTRYPOINT`{.dockerfile} sera appelé avec en argument, ceux
|
||||
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
|
||||
ceux-ci, de leur modification, ...
|
||||
C'est donc l'`ENTRYPOINT`{.dockerfile} qui est responsable de la bonne
|
||||
utilisation de ceux-ci, de leur modification, ...
|
||||
|
||||
À la fin d'un script d'`ENTRYPOINT`, afin de garder comme premier processus du
|
||||
conteneur le programme qui nous intéresse, on réalise un `execve(2)`, sans
|
||||
`fork(2)` :
|
||||
À la fin d'un script d'`ENTRYPOINT`{.dockerfile}, afin de garder comme premier
|
||||
processus du conteneur le programme qui nous intéresse, on réalise un
|
||||
`execve(2)`, sans `fork(2)` :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
exec /srv/youp0m $@
|
||||
```
|
||||
</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
|
||||
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
|
||||
ligne de commande du `run`, ou du contenu de `CMD` si l'utilisateur n'a rien
|
||||
précisé).
|
||||
ligne de commande du `run`, ou du contenu de `CMD`{.dockerfile} si
|
||||
l'utilisateur n'a rien précisé).
|
||||
|
||||
|
||||
### 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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
(
|
||||
echo -n "$YOUP0M_USERNAME"
|
||||
echo -n ":"
|
||||
|
@ -93,11 +95,12 @@ Il faut ensuite passer le fichier sur la ligne de commande grâce à l'option
|
|||
`-htpasswd`.
|
||||
|
||||
|
||||
### Exercice
|
||||
### Exercice {-}
|
||||
|
||||
Écrivez un script d'`ENTRYPOINT`, analysant les variables d'environnement, à la
|
||||
recherche de `YOUP0M_USERNAME` et `YOUP0M_PASSWORD` pour initialiser le fichier
|
||||
`.htpasswd` qui sera ajouté à la liste des arguments à passer au service.
|
||||
Écrivez un script d'`ENTRYPOINT`{.dockerfile}, analysant les variables
|
||||
d'environnement, à la recherche de `YOUP0M_USERNAME` et `YOUP0M_PASSWORD` pour
|
||||
initialiser le fichier `.htpasswd` qui sera ajouté à la liste des arguments à
|
||||
passer au service.
|
||||
|
||||
Par exemple :
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
||||
## Rendu
|
||||
## Rendu {-}
|
||||
|
||||
Avant de passer à la suite, placez votre `Dockerfile` et les éventuels fichiers
|
||||
annexes dans un dossier `influxdb`.
|
||||
|
|
|
@ -55,7 +55,7 @@ vous codez.
|
|||
Lorsqu'une ligne devient complexe, allez à la ligne :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
RUN apt-get update && apt-get install -y \
|
||||
nginx \
|
||||
php5-fpm
|
||||
|
@ -70,7 +70,7 @@ Lorsque c'est possible, ordonnez vos lignes suivant un ordre logique. Par
|
|||
exemple :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
RUN apt-get update && apt-get install -y \
|
||||
bzr \
|
||||
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
|
||||
aucune commande correspondante n'est trouvé, le cache se retrouve invalidé
|
||||
pour les instructions suivantes.
|
||||
- Pour les instructions `ADD` et `COPY`, en plus de la comparaison précédente,
|
||||
la somme de contrôle du fichier est ajoutée. Si le fichier a été modifié, le
|
||||
cache se retrouve invalidé.
|
||||
- Pour les instructions `ADD`{.dockerfile} et `COPY`{.dockerfile}, en plus de
|
||||
la comparaison précédente, la somme de contrôle du fichier est ajoutée. Si le
|
||||
fichier a été modifié, le cache se retrouve invalidé.
|
||||
- Une fois que le cache est invalidé, toutes les commandes restantes à exécuter
|
||||
dans le `Dockerfile` vont être exécutées.
|
||||
|
||||
|
@ -132,10 +132,10 @@ lors de sa construction.
|
|||
|
||||
## Exposez les ports standards
|
||||
|
||||
La commande `EXPOSE` vous permet d'indiquer les ports sur lesquels votre
|
||||
conteneur s'attend à recevoir des paquets venant de l'extérieur. Ces ports ne
|
||||
sont pas partagés avec l'hôte ou les autres conteneur, donc vous n'avez pas de
|
||||
raison de ne pas utiliser les ports standards.
|
||||
La commande `EXPOSE`{.dockerfile} vous permet d'indiquer les ports sur lesquels
|
||||
votre conteneur s'attend à recevoir des paquets venant de l'extérieur. Ces
|
||||
ports ne sont pas partagés avec l'hôte ou les autres conteneur, donc vous
|
||||
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
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```dockerfile
|
||||
ENTRYPOINT ["nginx"]
|
||||
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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```shell
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
|
@ -187,7 +187,8 @@ L'entrypoint peut être utilisé de deux manières différentes :
|
|||
|
||||
## `[""]`, `'` 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
|
||||
arguments. Si d'éventuels variables se trouve dans les arguments, elles ne
|
||||
|
@ -201,14 +202,14 @@ pouvez pas utiliser les simple quotes.
|
|||
|
||||
## Volumes
|
||||
|
||||
L'instruction `VOLUME` doit être utilisée pour exposer tous les espaces de
|
||||
stockage de données, configuration, ...
|
||||
L'instruction `VOLUME`{.dockerfile} doit être utilisée pour exposer tous les
|
||||
espaces de stockage de données, configuration,\ ...
|
||||
|
||||
|
||||
## Réduisez les privilèges
|
||||
|
||||
Utilisez l'instruction `USER` dès que vous le pouvez, lorsqu'un service ne
|
||||
réclame pas de privilège particulier.
|
||||
Utilisez l'instruction `USER`{.dockerfile} dès que vous le pouvez, lorsqu'un
|
||||
service ne réclame pas de privilège particulier.
|
||||
|
||||
Il vous faudra sans doute créer l'utilisateur et son groupe dans le Dockerfile.
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ Modification interactive
|
|||
Pour créer une image, commençons par entrer dans un nouveau conteneur :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run -it ubuntu /bin/bash
|
||||
```
|
||||
</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.
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
apt-get update
|
||||
```
|
||||
</div>
|
||||
|
@ -33,7 +33,7 @@ jour.
|
|||
Installons maintenant un programme :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
apt-get install nano
|
||||
```
|
||||
</div>
|
||||
|
@ -45,7 +45,7 @@ Sauvegardez vos modifications en tant que nouvelle image Docker, avec
|
|||
la commande `commit` :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container commit CONTAINER my_nano
|
||||
```
|
||||
</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 :
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
```bash
|
||||
docker container run -it my_nano /bin/bash
|
||||
```
|
||||
</div>
|
||||
|
|
|
@ -7,8 +7,8 @@ Projet
|
|||
------
|
||||
|
||||
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
|
||||
compte à rebours](https://virli.nemunai.re/countdown.html) avec cette
|
||||
possible (partant d'un `FROM scratch`{.dockerfile}), qui permette d'utiliser la
|
||||
[page de compte à rebours](https://virli.nemunai.re/countdown.html) avec cette
|
||||
configuration pour nginx :
|
||||
|
||||
<div lang="en-US">
|
||||
|
|
|
@ -1,22 +1,24 @@
|
|||
---
|
||||
title: Virtualisation légère -- TP n^o^ 2.1
|
||||
subtitle: Construire des images Docker
|
||||
author: Pierre-Olivier *Nemunaire* Mercier
|
||||
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
|
||||
institute: EPITA
|
||||
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 à
|
||||
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2018 à 0 h 42. Consultez la
|
||||
dernière section de chaque partie pour plus d'information sur les éléments à
|
||||
rendre.
|
||||
<virli@nemunai.re> au plus tard le mercredi 24 octobre 2018 à 0
|
||||
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
|
||||
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/).
|
||||
...
|
||||
|
|
|
@ -1,6 +1,20 @@
|
|||
% Decent marging...
|
||||
\usepackage[cm]{fullpage}
|
||||
|
||||
\addto\captionsfrench{
|
||||
\renewcommand{\contentsname}
|
||||
{Sommaire}
|
||||
}
|
||||
% Indentation for all paragraph (even the first one) + ventilate
|
||||
\usepackage{indentfirst}
|
||||
\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{---}
|
||||
|
|
|
@ -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
|
||||
`lxc-create` :
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
lxc-create --name toto_first --template debian
|
||||
```
|
||||
</div>
|
||||
|
||||
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
|
||||
|
@ -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 :
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
lxc-start --name toto_first
|
||||
```
|
||||
</div>
|
||||
|
||||
`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)
|
||||
|
@ -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
|
||||
d'interface dans le conteneur pour le connecter :
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```lxc
|
||||
lxc.network.type = empty
|
||||
```
|
||||
</div>
|
||||
|
||||
Un excellent article détaillant les différents types de configuration réseau
|
||||
est accessible à
|
||||
|
@ -80,12 +86,14 @@ supplémentaire sur le réseau.
|
|||
Modifions notre fichier de configuration afin qu'il ressemble à quelque chose
|
||||
comme :
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```lxc
|
||||
lxc.network.type = macvlan
|
||||
lxc.network.macvlan.mode = bridge
|
||||
lxc.network.flags = up
|
||||
lxc.network.link = eth0
|
||||
```
|
||||
</div>
|
||||
|
||||
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
|
||||
|
@ -101,11 +109,13 @@ plus flexible.
|
|||
Voici un extrait de configuration correspondant au paramétrage d'une interface
|
||||
virtuelle pour un conteneur donné :
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```lxc
|
||||
lxc.network.type = veth
|
||||
lxc.network.ipv4 = 172.23.42.2/24
|
||||
lxc.network.flags = up
|
||||
```
|
||||
</div>
|
||||
|
||||
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
|
||||
|
@ -115,9 +125,11 @@ ensuite de configurer la machine hôte.
|
|||
Commençons par attribuer une IP à cette nouvelle interface, en adaptant à votre
|
||||
identifiant d'interface :
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
ip addr add 172.23.42.1/24 dev vethYJWD6R
|
||||
```
|
||||
</div>
|
||||
|
||||
À partir de là, nous devrions pouvoir pinger notre conteneur depuis notre
|
||||
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 :
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
sysctl -w net.ipv4.ip_forward=1
|
||||
```
|
||||
</div>
|
||||
|
||||
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 à
|
||||
|
@ -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
|
||||
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
|
||||
```
|
||||
</div>
|
||||
|
||||
Dernière étape, dans notre conteneur, nous devons indiquer la route à utiliser
|
||||
pour accéder à internet :
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
ip route add default via 172.23.42.1
|
||||
```
|
||||
</div>
|
||||
|
||||
Nous avons maintenant internet dans notre conteneur !
|
||||
|
||||
|
@ -159,18 +177,22 @@ Nous avons maintenant internet dans notre conteneur !
|
|||
|
||||
### Installation de InfluxDB
|
||||
|
||||
```
|
||||
<div lang="en-US">
|
||||
```bash
|
||||
apt-get update
|
||||
apt-get install wget
|
||||
wget https://s3.amazonaws.com/influxdb/influxdb_0.9.4.2_amd64.deb
|
||||
dpkg -i influxdb_0.9.4.2_amd64.deb
|
||||
```
|
||||
</div>
|
||||
|
||||
### Test de l'installation
|
||||
|
||||
<div lang="en-US">
|
||||
```
|
||||
/opt/influxdb/influxd
|
||||
```
|
||||
</div>
|
||||
|
||||
Une fois que le service est démarré, vous devriez pouvoir accéder à l'interface
|
||||
à : <http://172.23.42.2:8083/>
|
||||
|
|
16
tutorial/pandoc-opts.mk
Normal file
16
tutorial/pandoc-opts.mk
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue