Use lang en-US for samples

This commit is contained in:
nemunaire 2017-10-17 08:29:07 +02:00
parent f2f93440a7
commit 13dadd8c59
33 changed files with 318 additions and 0 deletions

View File

@ -77,6 +77,7 @@ Sous Linux, les attributs sont regroupés dans des espaces de noms :
Par exemple, on peut définir un attribut sur un fichier comme cela : Par exemple, on peut définir un attribut sur un fichier comme cela :
<div lang="en-US">
```shell ```shell
42sh$ echo 'Hello World!' > toto 42sh$ echo 'Hello World!' > toto
42sh$ setfattr -n user.foo -v bar toto 42sh$ setfattr -n user.foo -v bar toto
@ -84,9 +85,11 @@ Par exemple, on peut définir un attribut sur un fichier comme cela :
# file: toto # file: toto
user.foo="bar" user.foo="bar"
``` ```
</div>
Encore plus fort, vous pouvez utiliser les ACL POSIX : Encore plus fort, vous pouvez utiliser les ACL POSIX :
<div lang="en-US">
```shell ```shell
42sh$ sudo chown root:root toto && sudo chmod o-r toto 42sh$ sudo chown root:root toto && sudo chmod o-r toto
42sh$ cat toto 42sh$ cat toto
@ -95,17 +98,20 @@ cat: toto: Permission denied
42sh$ cat toto 42sh$ cat toto
Hello World! Hello World!
``` ```
</div>
Bien que les droits UNIX traditionnels ne vous donnent pas accès au fichier, Bien que les droits UNIX traditionnels ne vous donnent pas accès au fichier,
les ACL POSIX vous autorisent à le lire. les ACL POSIX vous autorisent à le lire.
Vous pouvez voir ces attributs avec la commande : Vous pouvez voir ces attributs avec la commande :
<div lang="en-US">
```shell ```shell
42sh$ getfattr -d -m "^system" toto 42sh$ getfattr -d -m "^system" toto
# file: toto # file: toto
system.posix_acl_access=0sgAAEAD/////AgAEOgDAEAA/////xAABAD////8= system.posix_acl_access=0sgAAEAD/////AgAEOgDAEAA/////xAABAD////8=
``` ```
</div>
### `ping` ### `ping`
@ -119,18 +125,22 @@ l'utilisation de cet attribut auquel on accroîtrait l'ensemble des
Si votre distribution profite de ces attributs étendus, vous devriez obtenir : Si votre distribution profite de ces attributs étendus, vous devriez obtenir :
<div lang="en-US">
```shell ```shell
42sh$ getfattr -d -m "^security" $(which ping) 42sh$ getfattr -d -m "^security" $(which ping)
# file: bin/ping # file: bin/ping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA= security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
``` ```
</div>
Ou, dans sa version plus lisible : Ou, dans sa version plus lisible :
<div lang="en-US">
```shell ```shell
42sh$ getcap $(which ping) 42sh$ getcap $(which ping)
/bin/ping = cap_net_raw+ep /bin/ping = cap_net_raw+ep
``` ```
</div>
## Exercice : visualisateur de capabilities d'un processus ## Exercice : visualisateur de capabilities d'un processus
@ -138,6 +148,7 @@ Ou, dans sa version plus lisible :
Écrivons maintenant un programme permettant de voir les *capabilities* Écrivons maintenant un programme permettant de voir les *capabilities*
d'un processus : d'un processus :
<div lang="en-US">
```shell ```shell
42sh$ ./view_caps 1 42sh$ ./view_caps 1
cap_user_header_t cap_user_header_t
@ -165,6 +176,7 @@ permitted: 0xffffffff
CAP_DAC_READ_SEARCH CAP_DAC_READ_SEARCH
inheritable: 0x0 inheritable: 0x0
``` ```
</div>
Astuces : `capget(2)`, X-macros, ... Astuces : `capget(2)`, X-macros, ...

View File

@ -22,10 +22,12 @@ En fonction de la configuration de votre système, il est possible que les
pas de dossier `freezer` ou si celui-ci est vide, montez-le en suivant la pas de dossier `freezer` ou si celui-ci est vide, montez-le en suivant la
procédure suivante : procédure suivante :
<div lang="en-US">
``` ```
mkdir /sys/fs/cgroup/freezer/ mkdir /sys/fs/cgroup/freezer/
mount -t cgroup -o freezer none /sys/fs/cgroup/freezer/ mount -t cgroup -o freezer none /sys/fs/cgroup/freezer/
``` ```
</div>
Cette dernière commande monte le groupe de processus racine, pour le *cgroup* Cette dernière commande monte le groupe de processus racine, pour le *cgroup*
freezer. Tous les dossiers contenu dans cette racine sont donc des freezer. Tous les dossiers contenu dans cette racine sont donc des
@ -40,10 +42,12 @@ groupe.
Pour créer un groupe, il suffit de créer un nouveau dossier dans un groupe Pour créer un groupe, il suffit de créer un nouveau dossier dans un groupe
existant, par exemple la racine : existant, par exemple la racine :
<div lang="en-US">
``` ```
mkdir /sys/fs/cgroup/freezer/virli/ mkdir /sys/fs/cgroup/freezer/virli/
ls /sys/fs/cgroup/freezer/virli/ ls /sys/fs/cgroup/freezer/virli/
``` ```
</div>
Nous avons maintenant un nouveau groupe de processus `virli` dans le *cgroup* Nous avons maintenant un nouveau groupe de processus `virli` dans le *cgroup*
Freezer. Comme il s'agit d'une hiérarchie, le groupe `virli` hérite des Freezer. Comme il s'agit d'une hiérarchie, le groupe `virli` hérite des
@ -60,9 +64,11 @@ PID : `echo $$`.
La liste des processus rattachés à un *cgroup* se trouve dans le fichier `task` La liste des processus rattachés à un *cgroup* se trouve dans le fichier `task`
du groupe. Pour ajouter une tâche à ce groupe, cela se passe de cette manière : du groupe. Pour ajouter une tâche à ce groupe, cela se passe de cette manière :
<div lang="en-US">
``` ```
echo $PID > /sys/fs/cgroup/freezer/virli/tasks echo $PID > /sys/fs/cgroup/freezer/virli/tasks
``` ```
</div>
Il faut ici remplacer `$PID` par le PID du shell que l'on a relevé juste avant. Il faut ici remplacer `$PID` par le PID du shell que l'on a relevé juste avant.
@ -91,23 +97,29 @@ consulter
Faisons exécuter à notre interpréteur une commande pour voir effectivement Faisons exécuter à notre interpréteur une commande pour voir effectivement
l'exécution s'arrêter. Si vous manquez d'inspiration, utilisez : l'exécution s'arrêter. Si vous manquez d'inspiration, utilisez :
<div lang="en-US">
``` ```
for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done
``` ```
</div>
Maintenant, nous avons donné l'ordre au noyau de ne plus allouer de temps de Maintenant, nous avons donné l'ordre au noyau de ne plus allouer de temps de
calcul à notre shell et ses fils : calcul à notre shell et ses fils :
<div lang="en-US">
``` ```
echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state
``` ```
</div>
À cet instant, vous devriez voir votre compteur s'arrêter. Pour reprendre À cet instant, vous devriez voir votre compteur s'arrêter. Pour reprendre
l'exécution : l'exécution :
<div lang="en-US">
``` ```
echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state
``` ```
</div>
## Exercice : script de monitoring ## Exercice : script de monitoring
@ -121,16 +133,20 @@ données des statistiques issues des *cgroup*s.
Commençons par lancer le conteneur Docker d'InfluxDB (pour éviter de Commençons par lancer le conteneur Docker d'InfluxDB (pour éviter de
l'installer sur notre machine) : l'installer sur notre machine) :
<div lang="en-US">
```shell ```shell
docker run -d -p 8086:8086 -p 8083:8083 influxdb docker run -d -p 8086:8086 -p 8083:8083 influxdb
``` ```
</div>
Il nous faut ensuite créer une base de données pour y stocker les métriques, Il nous faut ensuite créer une base de données pour y stocker les métriques,
rendez-vous à <http://localhost:8083/> puis entrez la requête : rendez-vous à <http://localhost:8083/> puis entrez la requête :
<div lang="en-US">
```sql ```sql
CREATE DATABASE metrics; CREATE DATABASE metrics;
``` ```
</div>
### Monitoring instantané vers la console ### Monitoring instantané vers la console
@ -157,17 +173,21 @@ par défaut par votre système. Si vous êtes dans ce cas, essayez d'ajouter
Maintenant, envoyons nos données vers la base Maintenant, envoyons nos données vers la base
<https://docs.influxdata.com/influxdb/v1.0/guides/writing_data/> : <https://docs.influxdata.com/influxdb/v1.0/guides/writing_data/> :
<div lang="en-US">
``` ```
curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \ curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \
"$my_cgroup_name memory.usage_in_bytes=$(cat .../my_cgroup_name/memory.usage_in_bytes)" "$my_cgroup_name memory.usage_in_bytes=$(cat .../my_cgroup_name/memory.usage_in_bytes)"
``` ```
</div>
Pour vérifier que les données ont bien été ajoutées, nous pouvons effectuer la Pour vérifier que les données ont bien été ajoutées, nous pouvons effectuer la
requête suivante dans l'interface web d'InfluxDB : requête suivante dans l'interface web d'InfluxDB :
<div lang="en-US">
```sql ```sql
SELECT * from "$my_cgroup_name"; SELECT * from "$my_cgroup_name";
``` ```
</div>
### Monitorer davantage de données ### Monitorer davantage de données
@ -195,10 +215,12 @@ privilèges particuliers.
#### Exemple #### Exemple
<div lang="en-US">
``` ```
42sh$ sudo ./monitor_init my_cgroup_name 42sh$ sudo ./monitor_init my_cgroup_name
42sh$ ./monitor my_cgroup_name memhog 500 42sh$ ./monitor my_cgroup_name memhog 500
``` ```
</div>
## Fixer des limites ## Fixer des limites

View File

@ -13,9 +13,11 @@ vu comme étant la racine du système de fichiers. En anglais : *change root*:
Pour se créer un environnement afin de changer notre racine, il va falloir Pour se créer un environnement afin de changer notre racine, il va falloir
commencer par créer le dossier de notre nouvelle racine : commencer par créer le dossier de notre nouvelle racine :
<div lang="en-US">
```shell ```shell
mkdir newroot mkdir newroot
``` ```
</div>
### `busybox` ### `busybox`
@ -25,10 +27,12 @@ dynamiques. Il se suffit donc à lui-même dans un chroot (dans lequel on ne peu
pas accéder aux bibliothèques du système, il faudrait toutes les copier à la pas accéder aux bibliothèques du système, il faudrait toutes les copier à la
main). main).
<div lang="en-US">
```shell ```shell
cp $(which busybox) newroot/ cp $(which busybox) newroot/
chroot newroot /busybox ash chroot newroot /busybox ash
``` ```
</div>
### `debootstrap` ### `debootstrap`
@ -38,9 +42,11 @@ Debian et ses dérivés. Il permet d'installer dans un dossier (en général, ce
dossier correspond au point de montage de la nouvelle racine choisie par dossier correspond au point de montage de la nouvelle racine choisie par
l'utilisateur lors de l'installation) le système de base. l'utilisateur lors de l'installation) le système de base.
<div lang="en-US">
```shell ```shell
debootstrap jessie newroot/ http://httpredir.debian.org/debian/ debootstrap jessie newroot/ http://httpredir.debian.org/debian/
``` ```
</div>
`pacstrap` est le programme équivalent pour Archlinux. `pacstrap` est le programme équivalent pour Archlinux.
@ -50,10 +56,12 @@ debootstrap jessie newroot/ http://httpredir.debian.org/debian/
Les distributions « à l'ancienne » proposent encore de télécharger leur système Les distributions « à l'ancienne » proposent encore de télécharger leur système
de base sous forme de tarball : de base sous forme de tarball :
<div lang="en-US">
```shell ```shell
wget ftp://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/20160929/stage3-amd64-20160929.tar.bz2 wget ftp://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/20160929/stage3-amd64-20160929.tar.bz2
tar xpf stage3-amd64-*.tar.bz2 -C newroot/ tar xpf stage3-amd64-*.tar.bz2 -C newroot/
``` ```
</div>
L'avantage de télécharger l'archive de Gentoo est que l'on a déjà `gcc` dans un L'avantage de télécharger l'archive de Gentoo est que l'on a déjà `gcc` dans un
environnement qui tient dans 300 MB. environnement qui tient dans 300 MB.
@ -63,24 +71,30 @@ environnement qui tient dans 300 MB.
Écrivons maintenant un programme dont le seul but est de s'échaper du `chroot`: Écrivons maintenant un programme dont le seul but est de s'échaper du `chroot`:
<div lang="en-US">
```shell ```shell
make escape make escape
echo bar > ../foo echo bar > ../foo
chroot . chroot .
``` ```
</div>
Dans le nouvel environnement, vous ne devriez pas pouvoir faire : Dans le nouvel environnement, vous ne devriez pas pouvoir faire :
<div lang="en-US">
```shell ```shell
cat ../foo cat ../foo
``` ```
</div>
Mais une fois votre programme `escape` exécuté, vous devriez pouvoir ! Mais une fois votre programme `escape` exécuté, vous devriez pouvoir !
<div lang="en-US">
```shell ```shell
./escape ./escape
cat /path/to/foo cat /path/to/foo
``` ```
</div>
## Rendu ## Rendu

View File

@ -9,6 +9,7 @@ Ce TP requiert un noyau Linux, dans sa version 3.8 au minimum. Il doit de plus
être compilé avec les options suivantes (lorsqu'elles sont disponibles pour être compilé avec les options suivantes (lorsqu'elles sont disponibles pour
votre version) : votre version) :
<div lang="en-US">
``` ```
General setup ---> General setup --->
[*] Control Group support ---> [*] Control Group support --->
@ -38,6 +39,7 @@ Device Drivers --->
<M> MAC-VLAN support <M> MAC-VLAN support
<M> Virtual ethernet pair device <M> Virtual ethernet pair device
``` ```
</div>
### Vérification via `menuconfig` ### Vérification via `menuconfig`
@ -53,9 +55,11 @@ disponible sur la page d'accueil de <https://kernel.org>.
Dans les sources, on affiche la liste des options avec la commande : Dans les sources, on affiche la liste des options avec la commande :
<div lang="en-US">
```shell ```shell
make menuconfig make menuconfig
``` ```
</div>
### Vérification via `/boot/config-xxx` ### Vérification via `/boot/config-xxx`
@ -69,6 +73,7 @@ fichiers initial (`initramfs-xxx`) et des symboles de débogage
Ce fichier répertorie toutes les options qui ont été activées. Par rapport à Ce fichier répertorie toutes les options qui ont été activées. Par rapport à
l'arbre présenté ci-dessus, vous devriez trouver : l'arbre présenté ci-dessus, vous devriez trouver :
<div lang="en-US">
``` ```
CONFIG_CGROUPS=y CONFIG_CGROUPS=y
CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_FREEZER=y
@ -96,6 +101,7 @@ CONFIG_NETDEVICES=y
CONFIG_MACVLAN=m CONFIG_MACVLAN=m
CONFIG_VETH=m CONFIG_VETH=m
``` ```
</div>
### Vérification via `/proc/config.gz` ### Vérification via `/proc/config.gz`

View File

@ -22,6 +22,7 @@ n'est pas forcément une mauvaise solution.
Réduisez au maximum les capabilities, de telle sorte qu'il ne soit pas possible Réduisez au maximum les capabilities, de telle sorte qu'il ne soit pas possible
de faire un ping dans l'environnement restreint : de faire un ping dans l'environnement restreint :
<div lang="en-US">
```shell ```shell
42sh# ping 8.8.8.8 42sh# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
@ -39,6 +40,7 @@ rtt min/avg/max/mdev = 3.931/3.954/3.978/0.067 ms
bash# ping 8.8.8.8 bash# ping 8.8.8.8
ping: icmp open socket: Permission denied ping: icmp open socket: Permission denied
``` ```
</div>
Astuces : `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, ... Astuces : `prctl(2)`, `capabilities(7)`, `capget(2)`, `capset(2)`, ...

View File

@ -20,8 +20,10 @@ placer à la racine de votre rendu.
Voici une arborescence type : Voici une arborescence type :
<div lang="en-US">
``` ```
login_x-TP3/questions.txt login_x-TP3/questions.txt
login_x-TP3/mymoulette/README login_x-TP3/mymoulette/README
login_x-TP3/mymoulette/... login_x-TP3/mymoulette/...
``` ```
</div>

View File

@ -10,10 +10,12 @@ unique partant d'une racine[1] et où l'on peut placer au sein de son arborescen
des points de montage. Ainsi, l'utilisateur définit généralement deux points de des points de montage. Ainsi, l'utilisateur définit généralement deux points de
montage : montage :
<div lang="en-US">
``` ```
/dev/sda1 on / type ext4 (rw,relatime,data=ordered) /dev/sda1 on / type ext4 (rw,relatime,data=ordered)
/dev/sda3 on /home type ext4 (rw,relatime,data=ordered) /dev/sda3 on /home type ext4 (rw,relatime,data=ordered)
``` ```
</div>
Dans ce schéma, la racine correspond à la première partition du premier disque, Dans ce schéma, la racine correspond à la première partition du premier disque,
et les fichiers des utilisateurs sont sur la troisième partition du premier et les fichiers des utilisateurs sont sur la troisième partition du premier
@ -72,9 +74,11 @@ Après avoir exécuté le script, nous devrions avoir :
Voici un exemple d'utilisation : Voici un exemple d'utilisation :
<div lang="en-US">
```shell ```shell
42sh$ ./rev_kdb_leds.sh input20 42sh$ ./rev_kdb_leds.sh input20
``` ```
</div>
### `procinfo` ### `procinfo`
@ -82,6 +86,7 @@ Voici un exemple d'utilisation :
Explorons le pseudo système de fichiers `/proc` pour écrire un script qui va Explorons le pseudo système de fichiers `/proc` pour écrire un script qui va
afficher des informations sur un processus donné : afficher des informations sur un processus donné :
<div lang="en-US">
``` ```
42sh$ ./procinfo $$ 42sh$ ./procinfo $$
PID: 4242 PID: 4242
@ -117,6 +122,7 @@ pid:[4026531836]
user:[4026531837] user:[4026531837]
uts:[4026531838] uts:[4026531838]
``` ```
</div>
## Rendu ## Rendu

View File

@ -44,12 +44,14 @@ intégralité : vous ne pourrez pas monter les partitions indiquées par le
Pour que tout cela fonctionne, vous avez besoin au préalable d'exécuter les Pour que tout cela fonctionne, vous avez besoin au préalable d'exécuter les
commandes suivantes : commandes suivantes :
<div lang="en-US">
``` ```
cd newroot cd newroot
mount --bind /dev dev mount --bind /dev dev
mount --bind /proc proc mount --bind /proc proc
mount --bind /sys sys mount --bind /sys sys
``` ```
</div>
En se `chroot`ant à nouveau dans cette nouvelle racine, nous voyons que tous En se `chroot`ant à nouveau dans cette nouvelle racine, nous voyons que tous
nos outils fonctionnent comme prévu. nos outils fonctionnent comme prévu.
@ -65,12 +67,14 @@ monter au nouvel emplacement le système de fichier ainsi que tous les points
d'accroche qu'il contient, il faut utiliser `--rbind`. Il serait donc plus d'accroche qu'il contient, il faut utiliser `--rbind`. Il serait donc plus
correct de lancer : correct de lancer :
<div lang="en-US">
``` ```
cd newroot cd newroot
mount --rbind /dev dev mount --rbind /dev dev
mount -t proc none proc mount -t proc none proc
mount --rbind /sys sys mount --rbind /sys sys
``` ```
</div>
## Les montages parfumés ## Les montages parfumés
@ -89,6 +93,7 @@ partage (on parle de *peer group*).
Essayons de voir à quoi cela correspond avec l'exemple suivant : Essayons de voir à quoi cela correspond avec l'exemple suivant :
<div lang="en-US">
```shell ```shell
# Création de nos répertoires de travail # Création de nos répertoires de travail
cd /mnt cd /mnt
@ -100,14 +105,17 @@ mount --make-shared /tmp
# Duplication de l'accroche, sans s'occuper des éventuels sous-accroches # Duplication de l'accroche, sans s'occuper des éventuels sous-accroches
mount --bind /tmp /mnt/test-shared mount --bind /tmp /mnt/test-shared
``` ```
</div>
Si l'on attache un nouveau point de montage dans `/tmp` ou dans Si l'on attache un nouveau point de montage dans `/tmp` ou dans
`/mnt/test-shared`, avec la politique `shared`, l'accroche sera propagée : `/mnt/test-shared`, avec la politique `shared`, l'accroche sera propagée :
<div lang="en-US">
```shell ```shell
mkdir /mnt/test-shared/toto mkdir /mnt/test-shared/toto
mount -t tmpfs none /mnt/test-shared/toto mount -t tmpfs none /mnt/test-shared/toto
``` ```
</div>
Un coup de `findmnt` nous montre l'existence de deux nouveaux points de Un coup de `findmnt` nous montre l'existence de deux nouveaux points de
montages. À `/mnt/test-shared/toto`, mais également à `/tmp/toto`. montages. À `/mnt/test-shared/toto`, mais également à `/tmp/toto`.
@ -119,6 +127,7 @@ De la même manière que lorsque la propagation est partagée, cette politique
propagera, mais seulement dans un sens. Le point de montage déclaré comme propagera, mais seulement dans un sens. Le point de montage déclaré comme
esclave ne propagera pas ses nouveaux points de montage. esclave ne propagera pas ses nouveaux points de montage.
<div lang="en-US">
```shell ```shell
# Suite de l'exemple précédent # Suite de l'exemple précédent
cd /mnt cd /mnt
@ -130,20 +139,25 @@ mount --bind /mnt/test-shared /mnt/test-slave
# On rend notre dossier esclave # On rend notre dossier esclave
mount --make-slave /mnt/test-slave mount --make-slave /mnt/test-slave
``` ```
</div>
Si l'on effectue un montage dans `/mnt/test-shared` : Si l'on effectue un montage dans `/mnt/test-shared` :
<div lang="en-US">
```shell ```shell
mkdir /mnt/test-shared/foo mkdir /mnt/test-shared/foo
mount -t tmpfs none /mnt/test-shared/foo mount -t tmpfs none /mnt/test-shared/foo
``` ```
</div>
Le point de montage apparaît bien sous `/mnt/test-slave/foo`. Par contre : Le point de montage apparaît bien sous `/mnt/test-slave/foo`. Par contre :
<div lang="en-US">
```shell ```shell
mkdir /mnt/test-slave/bar mkdir /mnt/test-slave/bar
mount -t tmpfs none /mnt/test-slave/bar mount -t tmpfs none /mnt/test-slave/bar
``` ```
</div>
Le nouveau point de montage n'est pas propagé dans `/mnt/test-shared/bar`. Le nouveau point de montage n'est pas propagé dans `/mnt/test-shared/bar`.
@ -155,25 +169,31 @@ C'est le mode le plus simple : ici les points de montage ne sont pas propagés.
Pour forcer un point d'accroche a ne pas propager et à ne pas recevoir de Pour forcer un point d'accroche a ne pas propager et à ne pas recevoir de
propagation, on utilise l'option suivante : propagation, on utilise l'option suivante :
<div lang="en-US">
```shell ```shell
mount --make-private mountpoint mount --make-private mountpoint
``` ```
</div>
### non-attachable -- *unbindable mount* ### non-attachable -- *unbindable mount*
Ce mode interdira tout tentative d'attache à un autre endroit. Ce mode interdira tout tentative d'attache à un autre endroit.
<div lang="en-US">
```shell ```shell
mount --make-unbindable /mnt/test-slave mount --make-unbindable /mnt/test-slave
``` ```
</div>
Il ne sera pas possible de faire : Il ne sera pas possible de faire :
<div lang="en-US">
```shell ```shell
mkdir /mnt/test-unbindable mkdir /mnt/test-unbindable
mount --bind /mnt/test-slave /mnt/test-unbindable mount --bind /mnt/test-slave /mnt/test-unbindable
``` ```
</div>
### Parfums récursifs ### Parfums récursifs
@ -182,12 +202,14 @@ Les options que nous venons de voir s'applique sur un point de montage. Il
existe les mêmes options pour les appliquer en cascade sur les points d'attache existe les mêmes options pour les appliquer en cascade sur les points d'attache
contenu dans le sous-arbre : contenu dans le sous-arbre :
<div lang="en-US">
``` ```
mount --make-rshared mountpoint mount --make-rshared mountpoint
mount --make-rslave mountpoint mount --make-rslave mountpoint
mount --make-rprivate mountpoint mount --make-rprivate mountpoint
mount --make-runbindable mountpoint mount --make-runbindable mountpoint
``` ```
</div>
## `bind` de dossiers et de fichiers ## `bind` de dossiers et de fichiers
@ -212,15 +234,19 @@ emplacement soit prévenu du changement.
On utilise pour cela l'option `--move` de `mount(8)` : On utilise pour cela l'option `--move` de `mount(8)` :
<div lang="en-US">
```shell ```shell
mount --move olddir newdir mount --move olddir newdir
``` ```
</div>
Par exemple : Par exemple :
<div lang="en-US">
```shell ```shell
mount --move /dev /newroot/dev mount --move /dev /newroot/dev
``` ```
</div>
Il est courant de faire appel à cette option lorsque l'on souhaite changer la Il est courant de faire appel à cette option lorsque l'on souhaite changer la
racine de notre système de fichier : passer de l'initramfs au système au racine de notre système de fichier : passer de l'initramfs au système au

View File

@ -40,10 +40,12 @@ ne se trouvait pas à la racine d'une partition au moment du basculement.
Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs` : Si vous n'avez pas de partition à disposition, vous pouvez utiliser un `tmpfs` :
<div lang="en-US">
```shell ```shell
mkdir /mnt/newroot mkdir /mnt/newroot
mount -t tmpfs none /mnt/newroot mount -t tmpfs none /mnt/newroot
``` ```
</div>
Placez ensuite dans cette nouvelle racine le système de votre choix (cf. le TP Placez ensuite dans cette nouvelle racine le système de votre choix (cf. le TP
précédent pour les différentes méthodes et liens). précédent pour les différentes méthodes et liens).
@ -72,9 +74,11 @@ devoir nous isoler sur :
Isolons-nous : Isolons-nous :
<div lang="en-US">
```shell ```shell
unshare -p -m -f --mount-proc unshare -p -m -f --mount-proc
``` ```
</div>
### Dissocier la propagation des démontages ### Dissocier la propagation des démontages
@ -86,9 +90,11 @@ mount*.
Commençons donc par étiqueter tous nos points de montage (de ce *namespace*), Commençons donc par étiqueter tous nos points de montage (de ce *namespace*),
comme esclave : comme esclave :
<div lang="en-US">
```shell ```shell
mount --make-rslave / mount --make-rslave /
``` ```
</div>
### Démonter tout ! ### Démonter tout !
@ -125,6 +131,8 @@ Une fois le pivot effectué, on peut démonter l'ancienne racine.
Pour lancer la première commande dans la nouvelle racine, on passe généralement Pour lancer la première commande dans la nouvelle racine, on passe généralement
par : par :
<div lang="en-US">
```shell ```shell
exec chroot / command exec chroot / command
``` ```
</div>

View File

@ -121,6 +121,7 @@ nouveaux *namespaces* et placer le processus dedans.
Par exemple, nous pouvons modifier sans crainte le nom de notre machine, si Par exemple, nous pouvons modifier sans crainte le nom de notre machine, si
nous sommes passé dans un autre *namespace* `UTS` : nous sommes passé dans un autre *namespace* `UTS` :
<div lang="en-US">
```shell ```shell
42sh# hostname --fqdn 42sh# hostname --fqdn
koala.zoo.paris koala.zoo.paris
@ -134,6 +135,7 @@ bash# exit
42sh# hostname --fqdn 42sh# hostname --fqdn
koala.zoo.paris koala.zoo.paris
``` ```
</div>
Nous avons pu ici modifier le nom de machine, sans que cela n'affecte notre Nous avons pu ici modifier le nom de machine, sans que cela n'affecte notre
machine hôte. machine hôte.
@ -167,6 +169,7 @@ Les mêmes `flags` sont utilisés lors des appels à `unshare(2)` ou `setns(2)`.
Pour créer un nouveau processus qui sera à la fois dans un nouvel *namespace* Pour créer un nouveau processus qui sera à la fois dans un nouvel *namespace*
réseau et dans un nouveau *namespace* CGroup, on écrirait un code similaire à : réseau et dans un nouveau *namespace* CGroup, on écrirait un code similaire à :
<div lang="en-US">
```c ```c
#include <sched.h> #include <sched.h>
@ -180,6 +183,7 @@ pid_t pid = clone(do_execvp,
clone_flags, clone_flags,
&args); &args);
``` ```
</div>
Le premier argument est un pointeur sur fonction. Il s'agit de la fonction qui Le premier argument est un pointeur sur fonction. Il s'agit de la fonction qui
sera appelée par le nouveau processus. sera appelée par le nouveau processus.
@ -198,6 +202,7 @@ programmes s'exécutent dans les mêmes *namespaces*.
### Exemples ### Exemples
<div lang="en-US">
```sh ```sh
42sh$ ./cmpns $(pgrep influxdb) $(pgrep init) 42sh$ ./cmpns $(pgrep influxdb) $(pgrep init)
- cgroup: differ - cgroup: differ
@ -208,7 +213,9 @@ programmes s'exécutent dans les mêmes *namespaces*.
- user: same - user: same
- uts: same - uts: same
``` ```
</div>
<div lang="en-US">
```sh ```sh
42sh$ ./cmpns $(pgrep init) self 42sh$ ./cmpns $(pgrep init) self
- cgroup: same - cgroup: same
@ -219,11 +226,13 @@ programmes s'exécutent dans les mêmes *namespaces*.
- user: same - user: same
- uts: same - uts: same
``` ```
</div>
Ici, `self` fait référence au processus actuellement exécuté. Ici, `self` fait référence au processus actuellement exécuté.
Et pourquoi pas : Et pourquoi pas :
<div lang="en-US">
```sh ```sh
42sh$ unshare -m ./cmpns $$ self 42sh$ unshare -m ./cmpns $$ self
- cgroup: same - cgroup: same
@ -234,6 +243,7 @@ Et pourquoi pas :
- user: same - user: same
- uts: same - uts: same
``` ```
</div>
## Rejoindre un *namespace* ## Rejoindre un *namespace*
@ -242,6 +252,7 @@ Rejoindre un *namespace* se fait en utilisant l'appel système `setns(2)`,
auquel on passe le *file descriptor* d'un des liens du dossier auquel on passe le *file descriptor* d'un des liens du dossier
`/proc/<PID>/ns/` : `/proc/<PID>/ns/` :
<div lang="en-US">
```c ```c
#define _GNU_SOURCE #define _GNU_SOURCE
#include <fcntl.h> #include <fcntl.h>
@ -271,12 +282,15 @@ int main(int argc, char *argv[])
return EXIT_FAILURE; return EXIT_FAILURE;
} }
``` ```
</div>
Dans un shell, on utilisera la commande `nsenter(1)` : Dans un shell, on utilisera la commande `nsenter(1)` :
<div lang="en-US">
```shell ```shell
42sh# nsenter --uts=/proc/42/ns/uts /bin/bash 42sh# nsenter --uts=/proc/42/ns/uts /bin/bash
``` ```
</div>
### `docker exec` ### `docker exec`
@ -310,10 +324,12 @@ termine.
Lorsque l'on a besoin de référencer un *namespace* (par exemple pour le faire Lorsque l'on a besoin de référencer un *namespace* (par exemple pour le faire
persister après le dernier processus), on peut utiliser un `mount bind` : persister après le dernier processus), on peut utiliser un `mount bind` :
<div lang="en-US">
```shell ```shell
42sh# touch /tmp/ns/myrefns 42sh# touch /tmp/ns/myrefns
42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns 42sh# mount --bind /proc/<PID>/ns/mount /tmp/ns/myrefns
``` ```
</div>
De cette manière, même si le lien initial n'existe plus (si le `<PID>` s'est De cette manière, même si le lien initial n'existe plus (si le `<PID>` s'est
terminé), `/tmp/ns/myrefns` pointera toujours au bon endroit. terminé), `/tmp/ns/myrefns` pointera toujours au bon endroit.

View File

@ -12,11 +12,13 @@ règles de filtrage, etc.
En entrant dans un nouvel espace de nom `network`, on se retrouve dans un En entrant dans un nouvel espace de nom `network`, on se retrouve dans un
environnement qui n'a plus que l'interface de loopback : environnement qui n'a plus que l'interface de loopback :
<div lang="en-US">
```shell ```shell
42sh# unshare -n ip a 42sh# unshare -n ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
``` ```
</div>
Qui dit nouvelle pile réseau, dit également que les ports qui étaient assignés Qui dit nouvelle pile réseau, dit également que les ports qui étaient assignés
dans l'espace principal, ne le sont plus dans le conteneur : il est donc dans l'espace principal, ne le sont plus dans le conteneur : il est donc
@ -31,9 +33,11 @@ La suite d'outils `iproute2` propose une interface simplifiée pour utiliser le
Tout d'abord, nous allons créer un nouvel espace de nom : Tout d'abord, nous allons créer un nouvel espace de nom :
<div lang="en-US">
```shell ```shell
42sh$ ip netns add virli 42sh$ ip netns add virli
``` ```
</div>
La technique utilisée ici pour avoir des *namespaces* nommés est la même que La technique utilisée ici pour avoir des *namespaces* nommés est la même que
celle que nous avons vu dans la première partie sur les *namespaces* : via un celle que nous avons vu dans la première partie sur les *namespaces* : via un
@ -42,9 +46,11 @@ persister le namespace malgré le fait que plus aucun processus ne s'y exécute.
Maintenant que notre *namespace* est créé, voyons s'il contient des interfaces : Maintenant que notre *namespace* est créé, voyons s'il contient des interfaces :
<div lang="en-US">
```sh ```sh
42sh$ ip netns exec virli ip link 42sh$ ip netns exec virli ip link
``` ```
</div>
Cette commande ne devrait vous montrer que l'interface de *loopback*, car nous Cette commande ne devrait vous montrer que l'interface de *loopback*, car nous
n'avons pour l'instant pas encore attaché la moindre interface. n'avons pour l'instant pas encore attaché la moindre interface.
@ -52,16 +58,20 @@ n'avons pour l'instant pas encore attaché la moindre interface.
D'ailleurs, cette interface est rapportée comme étant désactivée, activons-là D'ailleurs, cette interface est rapportée comme étant désactivée, activons-là
via la commande : via la commande :
<div lang="en-US">
```shell ```shell
42sh$ ip netns exec virli ip link set dev lo up 42sh$ ip netns exec virli ip link set dev lo up
``` ```
</div>
Si tout se passe bien, vous devriez maintenant pouvoir lancer un `ping` sur Si tout se passe bien, vous devriez maintenant pouvoir lancer un `ping` sur
cette interface : cette interface :
<div lang="en-US">
```shell ```shell
42sh$ ip netns exec virli ping 127.0.0.1 42sh$ ip netns exec virli ping 127.0.0.1
``` ```
</div>
## *Virtual Ethernet* ## *Virtual Ethernet*
@ -74,9 +84,11 @@ centaines de conteneurs à gérer.
Une technique couramment employée consiste à créer une interface virtuelle de Une technique couramment employée consiste à créer une interface virtuelle de
type `veth` : type `veth` :
<div lang="en-US">
``` ```
ip link add veth0 type veth peer name veth1 ip link add veth0 type veth peer name veth1
``` ```
</div>
Une interface `veth` se comporte comme un tube bidirectionnel : tout ce qui Une interface `veth` se comporte comme un tube bidirectionnel : tout ce qui
entre d'un côté sort de l'autre et inversement. La commande précédente a donc entre d'un côté sort de l'autre et inversement. La commande précédente a donc
@ -89,24 +101,30 @@ devient alors possible de réaliser un échange de paquet entre les deux.
Pour déplacer `veth1` dans notre *namespace* `virli` : Pour déplacer `veth1` dans notre *namespace* `virli` :
<div lang="en-US">
```shell ```shell
42sh# ip link set veth1 netns virli 42sh# ip link set veth1 netns virli
``` ```
</div>
Il ne reste plus maintenant qu'à assigner une IP à chacune des interfaces : Il ne reste plus maintenant qu'à assigner une IP à chacune des interfaces :
<div lang="en-US">
```shell ```shell
42sh# ip netns exec virli ip a add 10.10.10.42/24 dev veth1 42sh# ip netns exec virli ip a add 10.10.10.42/24 dev veth1
42sh# ip a add 10.10.10.41/24 dev veth0 42sh# ip a add 10.10.10.41/24 dev veth0
``` ```
</div>
Testons maintenant que la communication entre les deux passe bient : Testons maintenant que la communication entre les deux passe bient :
<div lang="en-US">
```shell ```shell
42sh# ping 10.10.10.42 42sh# ping 10.10.10.42
- et - - et -
42sh# ip netns exec virli ping 10.10.10.41 42sh# ip netns exec virli ping 10.10.10.41
``` ```
</div>
Il ne reste donc pas grand chose à faire pour fournir Internet à notre Il ne reste donc pas grand chose à faire pour fournir Internet à notre
conteneur, via un peu de NAT ou grâce à un pont Ethernet. conteneur, via un peu de NAT ou grâce à un pont Ethernet.
@ -125,11 +143,13 @@ gourmande.
Il est possible d'attribuer juste une interface de VLAN, si l'on a switch les Il est possible d'attribuer juste une interface de VLAN, si l'on a switch les
supportant. supportant.
<div lang="en-US">
``` ```
42sh# ip link add link eth0 name eth0.100 type vlan id 100 42sh# ip link add link eth0 name eth0.100 type vlan id 100
42sh# ip link set dev eth0.100 up 42sh# ip link set dev eth0.100 up
42sh# ip link set eth0.100 netns virli 42sh# ip link set eth0.100 netns virli
``` ```
</div>
### MACVLAN ### MACVLAN
@ -149,9 +169,11 @@ l'équipement réseau derrière la machine de rerouter le paquet vers la machine
Pour construire une nouvelle interface de ce type : Pour construire une nouvelle interface de ce type :
<div lang="en-US">
``` ```
ip link add link eth0 mac0 type macvlan mode vepa ip link add link eth0 mac0 type macvlan mode vepa
``` ```
</div>
#### *Bridge* #### *Bridge*
@ -163,9 +185,11 @@ sortie.
Pour construire une nouvelle interface de ce type : Pour construire une nouvelle interface de ce type :
<div lang="en-US">
``` ```
ip link add link eth0 mac1 type macvlan mode bridge ip link add link eth0 mac1 type macvlan mode bridge
``` ```
</div>
## Aller plus loin ## Aller plus loin

View File

@ -22,9 +22,11 @@ se trouve).
Première étape s'isoler : Première étape s'isoler :
<div lang="en-US">
```shell ```shell
unshare --pid --fork /bin/bash unshare --pid --fork /bin/bash
``` ```
</div>
Nous utilisons ici l'option `-f`, pour que le passage dans le nouvel espace de Nous utilisons ici l'option `-f`, pour que le passage dans le nouvel espace de
noms des PID soit effectif (cf. Introduction). noms des PID soit effectif (cf. Introduction).
@ -47,9 +49,11 @@ système initial. Pour s'en sortir, il est nécessaire de s'isoler du *namespace
Voici la nouvelle ligne de commande que l'on va utiliser : Voici la nouvelle ligne de commande que l'on va utiliser :
<div lang="en-US">
```shell ```shell
unshare --pid --mount --fork --mount-proc /bin/bash unshare --pid --mount --fork --mount-proc /bin/bash
``` ```
</div>
Avec l'option `--mount-proc`, `unshare` va s'occuper de monter le nouveau Avec l'option `--mount-proc`, `unshare` va s'occuper de monter le nouveau
`/proc`. `/proc`.

View File

@ -40,6 +40,7 @@ Astuce : `pivot_root(2)`, `umount(2)`.
Partant d'une liste d'interfaces sur la machine hôte similaire à : Partant d'une liste d'interfaces sur la machine hôte similaire à :
<div lang="en-US">
``` ```
42sh$ ip link 42sh$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
@ -47,9 +48,11 @@ Partant d'une liste d'interfaces sur la machine hôte similaire à :
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 90:2b:34:5e:fa:a7 brd ff:ff:ff:ff:ff:ff link/ether 90:2b:34:5e:fa:a7 brd ff:ff:ff:ff:ff:ff
``` ```
</div>
Vous devrez pouvoir `ping` votre conteneur depuis votre hôte : Vous devrez pouvoir `ping` votre conteneur depuis votre hôte :
<div lang="en-US">
``` ```
42sh$ ip address 42sh$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
@ -69,6 +72,7 @@ PING 10.10.10.42 (10.10.10.42) 56(84) bytes of data.
2 packets transmitted, 2 received, 0% packet loss, time 1003ms 2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 3.789/3.847/3.906/0.085 ms rtt min/avg/max/mdev = 3.789/3.847/3.906/0.085 ms
``` ```
</div>
Dans l'exemple ci-dessus, l'interface dans le conteneur a l'IP `10.10.10.42`, Dans l'exemple ci-dessus, l'interface dans le conteneur a l'IP `10.10.10.42`,
tandis que la machine hôte a l'IP `10.10.10.41`. tandis que la machine hôte a l'IP `10.10.10.41`.

View File

@ -17,7 +17,9 @@ ZIP, RAR, ...).
Voici une arborescence type: Voici une arborescence type:
<div lang="en-US">
``` ```
login_x-mymoulette/README login_x-mymoulette/README
login_x-mymoulette/... login_x-mymoulette/...
``` ```
</div>

View File

@ -61,9 +61,11 @@ Sur chaque ligne, on doit indiquer :
Par exemple, le *namespace* `user` initial défini le correspondance suivante : Par exemple, le *namespace* `user` initial défini le correspondance suivante :
<div lang="en-US">
``` ```
0 0 4294967295 0 0 4294967295
``` ```
</div>
Cela signifie que les utilisateurs dont l'identifiant court de 0 à -2 inclu, Cela signifie que les utilisateurs dont l'identifiant court de 0 à -2 inclu,
dans cet espace de noms, correspond aux utilisateurs allant de 0 à -1 inclu, dans cet espace de noms, correspond aux utilisateurs allant de 0 à -1 inclu,
@ -71,9 +73,11 @@ pour le processus affichant ce fichier.
Lorsque l'on crée un *namespace* `user`, généralement, la correspondance vaut : Lorsque l'on crée un *namespace* `user`, généralement, la correspondance vaut :
<div lang="en-US">
``` ```
0 1000 1 0 1000 1
``` ```
</div>
Dans cette situation, on comprend que notre processus considère que Dans cette situation, on comprend que notre processus considère que
l'utilisateur root, dans le conteneur équivaut à l'utilisateur 1000 hors de l'utilisateur root, dans le conteneur équivaut à l'utilisateur 1000 hors de
@ -88,9 +92,11 @@ des groupes au lieu des utilisateurs.
## Utilisation de l'espace de noms ## Utilisation de l'espace de noms
<div lang="en-US">
```shell ```shell
42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash 42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash
``` ```
</div>
Un `capsh --print` nous montre que l'on est bien root et que l'on possède Un `capsh --print` nous montre que l'on est bien root et que l'on possède
toutes les capabilities. Cependant, cela ne signifie pas que l'on a tous les toutes les capabilities. Cependant, cela ne signifie pas que l'on a tous les

View File

@ -19,25 +19,31 @@ l'option `--rm`.
Vous pouvez afficher l'ensemble des conteneurs, quelque soit leur état (en Vous pouvez afficher l'ensemble des conteneurs, quelque soit leur état (en
cours d'exécution, arrêtés, ...) avec la commande suivante : cours d'exécution, arrêtés, ...) avec la commande suivante :
<div lang="en-US">
``` ```
42sh$ docker container ls -a 42sh$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
552d71619723 hello-world "/hello" 4 days ago Exited (0) 4 days ago dreamy_gates 552d71619723 hello-world "/hello" 4 days ago Exited (0) 4 days ago dreamy_gates
0e8bbff6d500 debian "/bin/bash" 2 weeks ago Exited (0) 2 weeks ago cranky_jones 0e8bbff6d500 debian "/bin/bash" 2 weeks ago Exited (0) 2 weeks ago cranky_jones
``` ```
</div>
Il y a de fortes chances pour que vous n'ayez plus besoin de ces vieux Il y a de fortes chances pour que vous n'ayez plus besoin de ces vieux
conteneurs. Pour les supprimer, utilisez la commande : conteneurs. Pour les supprimer, utilisez la commande :
<div lang="en-US">
``` ```
docker container rm 0e8bbff6d500 552d71619723 docker container rm 0e8bbff6d500 552d71619723
``` ```
</div>
ou encore : ou encore :
<div lang="en-US">
``` ```
docker container rm cranky_jones dreamy_gates docker container rm cranky_jones dreamy_gates
``` ```
</div>
## Images ## Images

View File

@ -6,9 +6,11 @@ Mon premier conteneur
Afin de tester la bonne marche de notre installation, lançons notre premier Afin de tester la bonne marche de notre installation, lançons notre premier
conteneur avec la commande : conteneur avec la commande :
<div lang="en-US">
``` ```
docker container run hello-world docker container run hello-world
``` ```
</div>
Cette commande va automatiquement exécuter une série de commandes pour nous, Cette commande va automatiquement exécuter une série de commandes pour nous,
comme indiqué dans le message affiché en retour : comme indiqué dans le message affiché en retour :
@ -23,16 +25,20 @@ node.js, etc.
Nous pouvons directement utiliser le client pour rechercher une image sur le Nous pouvons directement utiliser le client pour rechercher une image sur le
*Store*, en utilisant la commande `search` : *Store*, en utilisant la commande `search` :
<div lang="en-US">
``` ```
docker search mariadb docker search mariadb
``` ```
</div>
Il est possible de mettre à jour les images locales ou simplement Il est possible de mettre à jour les images locales ou simplement
pré-télécharger des images depuis le Store en utilisant la commande `pull` : pré-télécharger des images depuis le Store en utilisant la commande `pull` :
<div lang="en-US">
``` ```
docker image pull ubuntu docker image pull ubuntu
``` ```
</div>
Remarquez comment on interagit avec chaque *objet Docker* : dans la ligne de Remarquez comment on interagit avec chaque *objet Docker* : dans la ligne de
commande, le premier mot clef est le type d'objet (`container`, `image`, commande, le premier mot clef est le type d'objet (`container`, `image`,
@ -52,9 +58,11 @@ Par exemple, pour consulter la liste des images dont nous disposons localement
(soit parce qu'on les a téléchargées, soit parce que nous les avons créées (soit parce qu'on les a téléchargées, soit parce que nous les avons créées
nous-même), on utilise la commande `ls` sous le type d'objets `image` : nous-même), on utilise la commande `ls` sous le type d'objets `image` :
<div lang="en-US">
``` ```
docker image ls docker image ls
``` ```
</div>
Vous devriez constater la présence de plusieurs images « Ubuntu », mais chacune Vous devriez constater la présence de plusieurs images « Ubuntu », mais chacune
a un *TAG* différent. En effet, souvent, il existe plusieurs versions d'une même a un *TAG* différent. En effet, souvent, il existe plusieurs versions d'une même
@ -79,9 +87,11 @@ La commande `run` de Docker prend comme derniers arguments le programme à
lancer dans le conteneur ainsi que ses éventuels arguments. Essayons d'afficher lancer dans le conteneur ainsi que ses éventuels arguments. Essayons d'afficher
un Hello World : un Hello World :
<div lang="en-US">
``` ```
docker container run ubuntu /bin/echo "Hello World" docker container run ubuntu /bin/echo "Hello World"
``` ```
</div>
Dans notre exemple, c'est bien le `/bin/echo` présent dans le conteneur qui est Dans notre exemple, c'est bien le `/bin/echo` présent dans le conteneur qui est
appelé. Ce n'est pas le programme `/bin/echo` de la machine hôte qui a été appelé. Ce n'est pas le programme `/bin/echo` de la machine hôte qui a été
@ -92,9 +102,11 @@ pas présent sur notre machine, mais bien uniquement dans le conteneur. Si vous
n'utilisez pas [Alpine Linux](https://www.alpine-linux.org), vous pourriez n'utilisez pas [Alpine Linux](https://www.alpine-linux.org), vous pourriez
tenter d'utiliser son gestionnaire de paquet `apk`, via : tenter d'utiliser son gestionnaire de paquet `apk`, via :
<div lang="en-US">
``` ```
docker container run alpine /sbin/apk stats docker container run alpine /sbin/apk stats
``` ```
</div>
## Modifier une image ## Modifier une image
@ -125,24 +137,30 @@ créer une nouvelle image à partir de ce conteneur.
Pour créer une image, commençons par entrer dans un nouveau conteneur : Pour créer une image, commençons par entrer dans un nouveau conteneur :
<div lang="en-US">
``` ```
docker container run -it ubuntu /bin/bash docker container run -it ubuntu /bin/bash
``` ```
</div>
Vous avez remarqué l'utilisation des options `--tty` et `--interactive` ? Avant Vous avez remarqué l'utilisation des options `--tty` et `--interactive` ? Avant
le nom de l'image, elles sont gérées par Docker pour modifier le comportement le nom de l'image, elles sont gérées par Docker pour modifier le comportement
du `run`. En fait, tout comme `git(1)` et ses sous-commandes, chaque niveau de du `run`. En fait, tout comme `git(1)` et ses sous-commandes, chaque niveau de
commande peut prendre des paramètres : commande peut prendre des paramètres :
<div lang="en-US">
``` ```
docker DOCKER_PARAMS container run RUN_OPTS image IMAGE_CMD IMAGE_ARGS ... docker DOCKER_PARAMS container run RUN_OPTS image IMAGE_CMD IMAGE_ARGS ...
``` ```
</div>
Par exemple : Par exemple :
<div lang="en-US">
``` ```
docker -H unix:///var/run/docker.sock container run -it alpine /bin/ash -c "echo foo" docker -H unix:///var/run/docker.sock container run -it alpine /bin/ash -c "echo foo"
``` ```
</div>
Ici, l'option `-H` sera traitée par le client Docker (pour définir Ici, l'option `-H` sera traitée par le client Docker (pour définir
l'emplacement du point de communication avec le daemon), tandis que les options l'emplacement du point de communication avec le daemon), tandis que les options
@ -157,12 +175,14 @@ sans quoi `bash` ne se lancera pas en mode interractif[^bashnointer].
[^bashnointer]: Mais il sera possible de l'utiliser sans allouer de TTY, comme [^bashnointer]: Mais il sera possible de l'utiliser sans allouer de TTY, comme
par exemple en faisant : par exemple en faisant :
<div lang="en-US">
``` ```
42sh$ cat cmd 42sh$ cat cmd
echo foo echo foo
42sh$ cat cmd | docker run -i busybox 42sh$ cat cmd | docker run -i busybox
foo foo
``` ```
</div>
L'option `-i` reste néanmoins nécessaire pour que l'entrée standard soit L'option `-i` reste néanmoins nécessaire pour que l'entrée standard soit
transmise au conteneur. transmise au conteneur.

View File

@ -16,15 +16,19 @@ c'est sur cette dernière que Docker pourra être exploité à son plein potenti
Avant de continuer, assurez-vous que votre machine a bien démarré sur un noyau Avant de continuer, assurez-vous que votre machine a bien démarré sur un noyau
64 bits. Le retour de la commande `uname -m` doit vous indiquer : 64 bits. Le retour de la commande `uname -m` doit vous indiquer :
<div lang="en-US">
``` ```
x86_64 x86_64
``` ```
</div>
Assurez-vous également d'avoir un noyau récent, avec la commande `uname -r` : Assurez-vous également d'avoir un noyau récent, avec la commande `uname -r` :
<div lang="en-US">
``` ```
4.13.4-gentoo 4.13.4-gentoo
``` ```
</div>
Vous ne pourrez pas utiliser Docker avec un noyau antérieur à la version 3.10. Vous ne pourrez pas utiliser Docker avec un noyau antérieur à la version 3.10.
@ -73,12 +77,15 @@ un bac à sable dans lequel vous pourrez commencer à faire ce TP.
Vous devriez maintenant être capable de lancer la commande suivante : Vous devriez maintenant être capable de lancer la commande suivante :
<div lang="en-US">
``` ```
docker version docker version
``` ```
</div>
Une sortie similaire au bloc suivant devrait apparaître sur votre écran : Une sortie similaire au bloc suivant devrait apparaître sur votre écran :
<div lang="en-US">
``` ```
Client: Client:
Version: 17.09.0-ce Version: 17.09.0-ce
@ -97,15 +104,18 @@ Server:
OS/Arch: linux/amd64 OS/Arch: linux/amd64
Experimental: false Experimental: false
``` ```
</div>
### `no such file or directory`? ### `no such file or directory`?
Si vous avez cette erreur : `dial unix /var/run/docker.sock: no such file or Si vous avez cette erreur : `dial unix /var/run/docker.sock: no such file or
directory.`, le deamon n'est sans doute pas lancé. Lancez-le : directory.`, le deamon n'est sans doute pas lancé. Lancez-le :
<div lang="en-US">
``` ```
sudo service docker restart sudo service docker restart
``` ```
</div>
### `permission denied`? ### `permission denied`?
@ -114,9 +124,11 @@ Si vous avez cette erreur : `dial unix /var/run/docker.sock: permission
denied.`, ajoutez votre utilisateur au groupe `docker` et **relancer votre denied.`, ajoutez votre utilisateur au groupe `docker` et **relancer votre
session** : session** :
<div lang="en-US">
``` ```
sudo gpasswd -a $USER docker sudo gpasswd -a $USER docker
``` ```
</div>
**Attention :** cette action n'est pas anodine d'un point de vue sécurité : **Attention :** cette action n'est pas anodine d'un point de vue sécurité :
<https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface> <https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface>

View File

@ -21,6 +21,7 @@ Docker propose de base trois pilotes (*drivers*) pour « gérer » cela :
Ces trois *drivers* sont instanciés de base dans Docker avec le même nom que Ces trois *drivers* sont instanciés de base dans Docker avec le même nom que
leur pilote. Pour consulter la liste de réseaux utilisables, lancez : leur pilote. Pour consulter la liste de réseaux utilisables, lancez :
<div lang="en-US">
``` ```
42sh$ docker network ls 42sh$ docker network ls
NETWORK ID NAME DRIVER SCOPE NETWORK ID NAME DRIVER SCOPE
@ -28,6 +29,7 @@ NETWORK ID NAME DRIVER SCOPE
d5d907add6e2 host host local d5d907add6e2 host host local
16b702ed01a0 none null local 16b702ed01a0 none null local
``` ```
</div>
Par défaut, c'est le réseau `bridge` (de type `bridge`) qui est employé : ce Par défaut, c'est le réseau `bridge` (de type `bridge`) qui est employé : ce
réseau utilise le pont `docker0` que vous pouvez voir dans vos interfaces réseau utilise le pont `docker0` que vous pouvez voir dans vos interfaces
@ -55,17 +57,21 @@ est recommandé de créer des réseaux utilisateur.
La création d'un réseau se fait tout simplement au travers des sous-commandes La création d'un réseau se fait tout simplement au travers des sous-commandes
relatives aux objets Docker `network` : relatives aux objets Docker `network` :
<div lang="en-US">
``` ```
docker network create --driver bridge my_network docker network create --driver bridge my_network
``` ```
</div>
C'est ensuite ce nom de réseau que vous passerez à l'option `--network` de vos C'est ensuite ce nom de réseau que vous passerez à l'option `--network` de vos
`run`, ou vous pouvez également faire rejoindre un conteneur déjà lancé à un `run`, ou vous pouvez également faire rejoindre un conteneur déjà lancé à un
réseau : réseau :
<div lang="en-US">
``` ```
docker network connect NETWORK CONTAINER docker network connect NETWORK CONTAINER
``` ```
</div>
Lorsque plusieurs conteneurs ont rejoints un réseau utilisateur, ils peuvent Lorsque plusieurs conteneurs ont rejoints un réseau utilisateur, ils peuvent
mutuellement se découvrir grâce à un système de résolution de nom basé sur leur mutuellement se découvrir grâce à un système de résolution de nom basé sur leur
@ -76,18 +82,22 @@ nom de conteneur.
Lancez votre serveur web avec : Lancez votre serveur web avec :
<div lang="en-US">
``` ```
docker container run --name helloapp -d my_webserver docker container run --name helloapp -d my_webserver
``` ```
</div>
Puis créez un réseau utilisateur, rejoignez-le et lancez un conteneur dans le Puis créez un réseau utilisateur, rejoignez-le et lancez un conteneur dans le
même réseau utilisateur. Vous devriez être capable de lancer dans ce conteneur même réseau utilisateur. Vous devriez être capable de lancer dans ce conteneur
les commandes : les commandes :
<div lang="en-US">
``` ```
ping helloapp ping helloapp
curl http://helloapp/ curl http://helloapp/
``` ```
</div>
## Liaison à l'ancienne ## Liaison à l'ancienne
@ -108,9 +118,11 @@ moins le mot de passe à utiliser via la variable d'environnement
disponible sur la page dédiée à l'image sur le *store* : disponible sur la page dédiée à l'image sur le *store* :
<https://store.docker.com/images/postgres> <https://store.docker.com/images/postgres>
<div lang="en-US">
``` ```
docker container run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres docker container run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
``` ```
</div>
Le lien permet de fournir à n'importe quel autre conteneur les mêmes variables Le lien permet de fournir à n'importe quel autre conteneur les mêmes variables
d'environnement. Cela évite d'avoir à recopier le mot de passe pour lancer un d'environnement. Cela évite d'avoir à recopier le mot de passe pour lancer un
@ -119,6 +131,8 @@ doit se connecter à une base de données : l'application doit être configurée
pour utiliser le mot de passe défini au lancement du conteneur de base de pour utiliser le mot de passe défini au lancement du conteneur de base de
données : données :
<div lang="en-US">
``` ```
docker run -it --rm --link some-postgres:postgres postgres psql -h postgres -U postgres docker run -it --rm --link some-postgres:postgres postgres psql -h postgres -U postgres
``` ```
</div>

View File

@ -56,6 +56,7 @@ placer dans une tarball (pas d'archive ZIP, RAR, ...).
Voici une arborescence type: Voici une arborescence type:
<div lang="en-US">
``` ```
login_x-TP1/webserver login_x-TP1/webserver
login_x-TP1/webserver/Dockerfile login_x-TP1/webserver/Dockerfile
@ -63,6 +64,7 @@ login_x-TP1/webserver/index.html
login_x-TP1/mycloud login_x-TP1/mycloud
login_x-TP1/mycloud/mycloud-run.sh login_x-TP1/mycloud/mycloud-run.sh
``` ```
</div>
## Signature du rendu ## Signature du rendu
@ -94,6 +96,7 @@ signature.
Si vous recevez un rapport avec l'erreur suivante : Si vous recevez un rapport avec l'erreur suivante :
<div lang="en-US">
``` ```
[FAIL] Bad signature. Here is the gnupg output: [FAIL] Bad signature. Here is the gnupg output:
@ -102,6 +105,7 @@ gpg: using RSA key 842807A84573CC96
gpg: requesting key E2CCD99DD37BD32E from hkp server pool.sks-keyservers.net gpg: requesting key E2CCD99DD37BD32E from hkp server pool.sks-keyservers.net
gpg: Can't check signature: No public key gpg: Can't check signature: No public key
``` ```
</div>
C'est que votre clef publique n'est pas dans mon trousseau et que les méthodes C'est que votre clef publique n'est pas dans mon trousseau et que les méthodes
de récupération automatique n'ont pas permis de la trouver. Uploadez votre de récupération automatique n'ont pas permis de la trouver. Uploadez votre
@ -114,9 +118,11 @@ de retenter votre rendu.
Si vous recevez un rapport avec l'erreur suivante : Si vous recevez un rapport avec l'erreur suivante :
<div lang="en-US">
``` ```
[FAIL] The username of your key is not explicit, I can't find you. [FAIL] The username of your key is not explicit, I can't find you.
``` ```
</div>
Votre clef ne contient sans doute pas vos noms et prénoms ou l'adresse Votre clef ne contient sans doute pas vos noms et prénoms ou l'adresse
électronique associée à la clef n'est pas celle que j'ai dans ma base de électronique associée à la clef n'est pas celle que j'ai dans ma base de
@ -127,9 +133,11 @@ données.
Si vous recevez un rapport concluant ainsi : Si vous recevez un rapport concluant ainsi :
<div lang="en-US">
``` ```
After analyzing your e-mail, I've decided to SKIP it. After analyzing your e-mail, I've decided to SKIP it.
``` ```
</div>
Cela signifie que la lecture de votre courriel qui a été préférée n'est pas Cela signifie que la lecture de votre courriel qui a été préférée n'est pas
celle d'un rendu. Vérifiez que vous n'envoyez pas votre clef publique avec celle d'un rendu. Vérifiez que vous n'envoyez pas votre clef publique avec

View File

@ -27,9 +27,11 @@ exemple si vous voulez partager des fichiers avec votre voisin, en passant par
le protocole HTTP, mais sans se casser la tête à installer et configurer un le protocole HTTP, mais sans se casser la tête à installer et configurer un
serveur web : serveur web :
<div lang="en-US">
``` ```
docker container run --rm -p 80:80 -v ~/Downloads:/usr/share/nginx/html:ro -d nginx docker container run --rm -p 80:80 -v ~/Downloads:/usr/share/nginx/html:ro -d nginx
``` ```
</div>
Une fois cette commande lancée, votre voisin pourra accéder à votre dossier Une fois cette commande lancée, votre voisin pourra accéder à votre dossier
Downloads en renseignant l'IP de votre machine dans son navigateur favori ! Downloads en renseignant l'IP de votre machine dans son navigateur favori !
@ -45,16 +47,20 @@ soucier de leur réel emplacement.
Comme il s'agit d'un objet, la première chose à faire va être de créer notre Comme il s'agit d'un objet, la première chose à faire va être de créer notre
volume : volume :
<div lang="en-US">
``` ```
docker volume create prod_db docker volume create prod_db
``` ```
</div>
Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple : Ensuite, nous pouvons démarrer un conteneur utilisant, par exemple :
<div lang="en-US">
``` ```
docker container run --name mydb --mount source=prod_db,target=/var/lib/mysql \ docker container run --name mydb --mount source=prod_db,target=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
``` ```
</div>
Lorsque le volume est vide, si des données sont présentes à l'endroit du point Lorsque le volume est vide, si des données sont présentes à l'endroit du point
de montage, celles-ci sont recopiées dans le volume. de montage, celles-ci sont recopiées dans le volume.
@ -62,9 +68,11 @@ de montage, celles-ci sont recopiées dans le volume.
Si plus tard, vous souhaitez créer un conteneur chargé de faire des Si plus tard, vous souhaitez créer un conteneur chargé de faire des
sauvegardes, vous pourriez le lancer comme ceci : sauvegardes, vous pourriez le lancer comme ceci :
<div lang="en-US">
``` ```
docker container run -it --volume-from mydb busybox /bin/bash docker container run -it --volume-from mydb busybox /bin/bash
``` ```
</div>
## Volumes temporaires ## Volumes temporaires

View File

@ -10,6 +10,7 @@ allons définir à la racine de notre projet un fichier `docker-compose.yml` qui
contiendra les paramètres d'exécution (et éventuellement les méthodes de contiendra les paramètres d'exécution (et éventuellement les méthodes de
construction). construction).
<div lang="en-US">
```yaml ```yaml
version: '3' version: '3'
services: services:
@ -25,6 +26,7 @@ services:
links: links:
- influxdb - influxdb
``` ```
</div>
Ce fichier est un condensé des options que nous passons habituellement au Ce fichier est un condensé des options que nous passons habituellement au
`docker container run`. `docker container run`.
@ -57,15 +59,18 @@ Cette section est le pendant de la commandes `docker volume`.
On déclare les volumes simplement en leur donnant un nom et un driver comme On déclare les volumes simplement en leur donnant un nom et un driver comme
suit : suit :
<div lang="en-US">
```yaml ```yaml
volumes: volumes:
mysql-data: mysql-data:
driver: local driver: local
``` ```
</div>
Pour les utiliser avec un conteneur, on référence le nom ainsi que Pour les utiliser avec un conteneur, on référence le nom ainsi que
l'emplacement à partager : l'emplacement à partager :
<div lang="en-US">
```yaml ```yaml
[...] [...]
mysql: mysql:
@ -73,6 +78,7 @@ l'emplacement à partager :
volumes: volumes:
- mysql-data:/var/lib/mysql - mysql-data:/var/lib/mysql
``` ```
</div>
### `network` ### `network`
@ -86,11 +92,13 @@ possible !
De la même manière que pour les `volumes`, cette section déclare les réseaux De la même manière que pour les `volumes`, cette section déclare les réseaux
qui pourront être utilisés par les `services`. On pourrait donc avoir : qui pourront être utilisés par les `services`. On pourrait donc avoir :
<div lang="en-US">
```yaml ```yaml
networks: networks:
knotdns-slave-net: knotdns-slave-net:
driver: bridge driver: bridge
``` ```
</div>
#### Driver `host` #### Driver `host`
@ -136,9 +144,11 @@ listés dans le fichier.
Une fois le build terminé, nous pouvons lancer la commande suivante et admirer Une fois le build terminé, nous pouvons lancer la commande suivante et admirer
le résultat : le résultat :
<div lang="en-US">
```shell ```shell
docker-compose up docker-compose up
``` ```
</div>
Encore une fois, testez la bonne connexion entre chronograf (accessible sur Encore une fois, testez la bonne connexion entre chronograf (accessible sur
<http://localhost:8888>) et influxdb. <http://localhost:8888>) et influxdb.

View File

@ -42,9 +42,11 @@ Pour créer une nouvelle machine, nous allons utiliser la commande
donner à cette machine (les machines ne sont pas considérées comme jetables, donner à cette machine (les machines ne sont pas considérées comme jetables,
leur nom vous permettra par exemple de relancer une machine plus tard) : leur nom vous permettra par exemple de relancer une machine plus tard) :
<div lang="en-US">
```shell ```shell
docker-machine create --driver virtualbox echinoidea docker-machine create --driver virtualbox echinoidea
``` ```
</div>
Consultez la section suivante, réservée aux gens qui ne peuvent pas passer par Consultez la section suivante, réservée aux gens qui ne peuvent pas passer par
`docker-machine` si vous souhaitez avoir plus d'information sur ce que fait `docker-machine` si vous souhaitez avoir plus d'information sur ce que fait
@ -66,6 +68,7 @@ pouvait ne pas se trouver sur la même machine que le client `docker`. Eh bien
avec `docker-machine` cela prend tout son sens, car vous pouvez très facilement avec `docker-machine` cela prend tout son sens, car vous pouvez très facilement
changer de daamon/machine avec une simple commande : changer de daamon/machine avec une simple commande :
<div lang="en-US">
```shell ```shell
$ docker container ls $ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS CONTAINER ID IMAGE COMMAND CREATED STATUS
@ -75,6 +78,7 @@ CONTAINER ID IMAGE COMMAND CREATED
a814293b9f45 armbuild/busybox "/bin/sh" 18 seconds ago Up 10 minutes a814293b9f45 armbuild/busybox "/bin/sh" 18 seconds ago Up 10 minutes
0caddeed5037 armbuild/alpine "/bin/sh" 2 weeks ago Created 0caddeed5037 armbuild/alpine "/bin/sh" 2 weeks ago Created
``` ```
</div>
On remarque que le client Docker est influencé par l'exécution de notre On remarque que le client Docker est influencé par l'exécution de notre
commande `docker-machine env`. En effet, cette commande va modifier commande `docker-machine env`. En effet, cette commande va modifier
@ -124,19 +128,23 @@ virtuelles. Néanmoins, cela ne coûte rien de voir les procédures mise en œuv
Commençons par voir sur quel port le daemon `dockerd` de notre machine Commençons par voir sur quel port le daemon `dockerd` de notre machine
virtuelle écoute : virtuelle écoute :
<div lang="en-US">
```shell ```shell
(virt1) 42sh$ netstat -tpln | grep dockerd (virt1) 42sh$ netstat -tpln | grep dockerd
Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
tcp 0 0 :::2376 :::* 980/dockerd tcp 0 0 :::2376 :::* 980/dockerd
``` ```
</div>
Essayons de renseigner simplement cette configuration à notre client Docker : Essayons de renseigner simplement cette configuration à notre client Docker :
<div lang="en-US">
```shell ```shell
(main) 42sh$ docker -H tcp://$VM1_IP:2376/ info (main) 42sh$ docker -H tcp://$VM1_IP:2376/ info
Get http://$VM1_IP:2376/v1.32/info: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02". Get http://$VM1_IP:2376/v1.32/info: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS? * Are you trying to connect to a TLS-enabled daemon without TLS?
``` ```
</div>
En effet, Docker met tout en œuvre pour rendre compliqué l'utilisation En effet, Docker met tout en œuvre pour rendre compliqué l'utilisation
non-sécurisée de la plate-forme. Mais ils font également en sorte que la non-sécurisée de la plate-forme. Mais ils font également en sorte que la
@ -152,6 +160,7 @@ connexion TLS classique.
Tout le nécessaire est déjà configuré au sein de `boot2docker`, pour nos tests, Tout le nécessaire est déjà configuré au sein de `boot2docker`, pour nos tests,
nous n'avons qu'à recopier la clef et les certificats en place. nous n'avons qu'à recopier la clef et les certificats en place.
<div lang="en-US">
```shell ```shell
(main) 42sh$ mkdir remote/virt1 (main) 42sh$ mkdir remote/virt1
(main) 42sh$ scp "docker@$VM1_IP:.docker/*" remote/virt1 (main) 42sh$ scp "docker@$VM1_IP:.docker/*" remote/virt1
@ -159,11 +168,14 @@ ca.pem
cert.pem cert.pem
key.pem key.pem
``` ```
</div>
Tentons maintenant de nous connecter au daemon distant en utilisant ces éléments : Tentons maintenant de nous connecter au daemon distant en utilisant ces éléments :
<div lang="en-US">
```shell ```shell
42sh$ DOCKER_CERT_PATH=remote/virt1/ docker -H tcp://$VM1_IP:2376/ --tlsverify info 42sh$ DOCKER_CERT_PATH=remote/virt1/ docker -H tcp://$VM1_IP:2376/ --tlsverify info
``` ```
</div>
Vous pouvez effectuer la même opération pour la seconde VM. Vous pouvez effectuer la même opération pour la seconde VM.

View File

@ -24,22 +24,27 @@ Afin d'interagir avec les données, InfluxDB expose une
sur le port 8086. Pour éviter d'avoir plus de configuration à réaliser, nous sur le port 8086. Pour éviter d'avoir plus de configuration à réaliser, nous
allons tâcher d'utiliser ce même port pour tester localement : allons tâcher d'utiliser ce même port pour tester localement :
<div lang="en-US">
``` ```
docker container run -p 8086:8086 -d --name mytsdb influxdb docker container run -p 8086:8086 -d --name mytsdb influxdb
``` ```
</div>
Comme il s'agit d'une API REST, nous pouvons vérifier le bon fonctionnement de Comme il s'agit d'une API REST, nous pouvons vérifier le bon fonctionnement de
notre base de données en appelant : notre base de données en appelant :
<div lang="en-US">
``` ```
42sh$ curl -f http://localhost:8086/ping 42sh$ curl -f http://localhost:8086/ping
42sh$ echo $? 42sh$ echo $?
0 0
``` ```
</div>
Si votre influxdb répond, vous pouvez vous y connecter en utilisant directement Si votre influxdb répond, vous pouvez vous y connecter en utilisant directement
le client fourni : le client fourni :
<div lang="en-US">
``` ```
42sh$ docker container run --rm -it --link mytsdb:influxdb \ 42sh$ docker container run --rm -it --link mytsdb:influxdb \
--entrypoint "/usr/bin/influx" influxdb -host influxdb --entrypoint "/usr/bin/influx" influxdb -host influxdb
@ -52,6 +57,7 @@ name: databases
name name
_internal _internal
``` ```
</div>
Si vous aussi vous voyez la table `_internal`, bravo ! vous pouvez passer à la Si vous aussi vous voyez la table `_internal`, bravo ! vous pouvez passer à la
suite. suite.
@ -60,9 +66,11 @@ Notez que comme nous avons lancé le conteneur en mode détaché (option `-d`),
nous ne voyons pas les logs qui sont écrits par le daemon. Pour les voir, il nous ne voyons pas les logs qui sont écrits par le daemon. Pour les voir, il
faut utiliser la commande `docker container logs` : faut utiliser la commande `docker container logs` :
<div lang="en-US">
``` ```
docker container logs mytsdb docker container logs mytsdb
``` ```
</div>
\hspace{2em}**Exercice :** Ajoutez à la ligne de commande de lancement du \hspace{2em}**Exercice :** Ajoutez à la ligne de commande de lancement du
@ -76,17 +84,21 @@ d'influxDB si nous devions redémarrer le conteneur.
Tentons maintenant de remplir notre base de données avec les métriques du Tentons maintenant de remplir notre base de données avec les métriques du
système. Pour cela, on commence par télécharger *Telegraf* : système. Pour cela, on commence par télécharger *Telegraf* :
<div lang="en-US">
```shell ```shell
curl https://dl.influxdata.com/telegraf/releases/telegraf-1.4.2-static_linux_amd64.tar.gz | \ curl https://dl.influxdata.com/telegraf/releases/telegraf-1.4.2-static_linux_amd64.tar.gz | \
tar xzv -C /tmp tar xzv -C /tmp
``` ```
</div>
Puis, lançons *Telegraf* : Puis, lançons *Telegraf* :
<div lang="en-US">
```shell ```shell
cd /tmp/telegraf cd /tmp/telegraf
./telegraf --config telegraf.conf ./telegraf --config telegraf.conf
``` ```
</div>
**Remarque :** La configuration par défaut va collecter les données de la **Remarque :** La configuration par défaut va collecter les données de la
machine locale et les envoyer sur le serveur situé à machine locale et les envoyer sur le serveur situé à
@ -96,6 +108,7 @@ sorte de redirigé le port de notre conteneur sur notre machine locale (option
Et observons ensuite : Et observons ensuite :
<div lang="en-US">
```shell ```shell
42sh$ docker container run --rm -it --link mytsdb:influxdb \ 42sh$ docker container run --rm -it --link mytsdb:influxdb \
--entrypoint "/usr/bin/influx" influxdb -host influxdb --entrypoint "/usr/bin/influx" influxdb -host influxdb
@ -125,6 +138,7 @@ processes
swap swap
system system
``` ```
</div>
La nouvelle base a donc bien été créé et tant que nous laissons *Telegraf* La nouvelle base a donc bien été créé et tant que nous laissons *Telegraf*
lancé, celui-ci va régulièrement envoyer des métriques de cette machine. lancé, celui-ci va régulièrement envoyer des métriques de cette machine.

View File

@ -30,6 +30,7 @@ placer à la racine de votre rendu.
Voici une arborescence type: Voici une arborescence type:
<div lang="en-US">
``` ```
login_x-TP2/influxdb login_x-TP2/influxdb
login_x-TP2/influxdb/Dockerfile login_x-TP2/influxdb/Dockerfile
@ -42,3 +43,4 @@ login_x-TP2/fic-server/Dockerfile-admin
login_x-TP2/fic-server/Dockerfile-backend login_x-TP2/fic-server/Dockerfile-backend
login_x-TP2/fic-server/Dockerfile-frontend login_x-TP2/fic-server/Dockerfile-frontend
``` ```
</div>

View File

@ -31,11 +31,13 @@ L'équipe en charge de `docker-machine` met à disposition un exécutable compil
pour bon nombres d'environnements. Nous pouvons l'installer en suivant la pour bon nombres d'environnements. Nous pouvons l'installer en suivant la
procédure suivante : procédure suivante :
<div lang="en-US">
```shell ```shell
curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-Linux-x86_64 \ curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-Linux-x86_64 \
> /usr/bin/docker-machine > /usr/bin/docker-machine
chmod +x /usr/bin/docker-machine chmod +x /usr/bin/docker-machine
``` ```
</div>
Si vous êtes dans un environnement différent, jetez un œil à Si vous êtes dans un environnement différent, jetez un œil à
[la documentation d'installation](https://docs.docker.com/machine/install-machine/). [la documentation d'installation](https://docs.docker.com/machine/install-machine/).
@ -60,10 +62,12 @@ n'aurez qu'à suivre les instructions du
Comme avec Docker, nous pouvons vérifier le bon fonctionnement de Comme avec Docker, nous pouvons vérifier le bon fonctionnement de
`docker-machine` en exécutant la commande : `docker-machine` en exécutant la commande :
<div lang="en-US">
``` ```
42sh$ docker-machine version 42sh$ docker-machine version
docker-machine version 0.12.2, build 9371605 docker-machine version 0.12.2, build 9371605
``` ```
</div>
## `docker-compose` ## `docker-compose`
@ -88,11 +92,13 @@ fonctionnera avec la version de Docker qu'ils fournissent.
L'équipe en charge de Docker compose met à disposition un exécutable contenant L'équipe en charge de Docker compose met à disposition un exécutable contenant
tous les scripts. Nous pouvons l'installer en suivant la procédure suivante : tous les scripts. Nous pouvons l'installer en suivant la procédure suivante :
<div lang="en-US">
```shell ```shell
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-Linux-x86_64 \ curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-Linux-x86_64 \
> /usr/bin/docker-compose > /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose chmod +x /usr/bin/docker-compose
``` ```
</div>
### `pip` ### `pip`
@ -106,10 +112,12 @@ votre version de Docker.
Comme avec Docker, nous pouvons vérifier le bon fonctionnement de Comme avec Docker, nous pouvons vérifier le bon fonctionnement de
`docker-compose` en exécutant la commande : `docker-compose` en exécutant la commande :
<div lang="en-US">
``` ```
42sh$ docker-compose --version 42sh$ docker-compose --version
docker-compose version: 1.16.1 docker-compose version: 1.16.1
``` ```
</div>
Si vous obtenez une réponse similaire, c'est que vous êtes prêt à commencer le Si vous obtenez une réponse similaire, c'est que vous êtes prêt à commencer le
TP ! Alors n'attendons pas, partons à l'aventure ! TP ! Alors n'attendons pas, partons à l'aventure !

View File

@ -10,12 +10,14 @@ de commits. Docker dispose d'un mécanisme permettant d'automatiser la
construction de nouvelles images. Vous pouvez arriver au même résultat que ce construction de nouvelles images. Vous pouvez arriver au même résultat que ce
que l'on a réussi à faire précédemment en utilisant le `Dockerfile` suivant : que l'on a réussi à faire précédemment en utilisant le `Dockerfile` suivant :
<div lang="en-US">
``` ```
FROM ubuntu:latest FROM ubuntu:latest
RUN apt-get update RUN apt-get update
RUN apt-get install -y nano RUN apt-get install -y nano
``` ```
</div>
La syntaxe d'un `Dockerfile` est simple, le premier mot de chaque ligne est La syntaxe d'un `Dockerfile` est simple, le premier mot de chaque ligne est
l'intitulé d'une instruction (que l'on écrit généralement en majuscule), elle l'intitulé d'une instruction (que l'on écrit généralement en majuscule), elle
@ -29,16 +31,20 @@ Pour lancer la construction de la nouvelle image, créer un nouveau dossier ne
contenant que votre fichier `Dockerfile`, placez-vous dedans, puis utilisez la contenant que votre fichier `Dockerfile`, placez-vous dedans, puis utilisez la
commande `build` : commande `build` :
<div lang="en-US">
``` ```
docker image build --tag=my_editor . docker image build --tag=my_editor .
``` ```
</div>
Une fois la construction de l'image terminée, vous pouvez la lancer et Une fois la construction de l'image terminée, vous pouvez la lancer et
constater l'existence de notre éditeur favori : constater l'existence de notre éditeur favori :
<div lang="en-US">
``` ```
docker container run -it my_editor /bin/bash docker container run -it my_editor /bin/bash
``` ```
</div>
## `RUN` dans le `Dockerfile` ## `RUN` dans le `Dockerfile`
@ -48,11 +54,13 @@ correspondra à une nouvelle couche de notre image.
Cela signifie que l'exemple suivant **ne fonctionne pas** : Cela signifie que l'exemple suivant **ne fonctionne pas** :
<div lang="en-US">
``` ```
COPY db.sql /db.sql COPY db.sql /db.sql
RUN service mysqld start RUN service mysqld start
RUN mysql -u root -p toor virli < /db.sql RUN mysql -u root -p toor virli < /db.sql
``` ```
</div>
Cet exemple ne fonctionne pas car le serveur MySQL qui est lancé dans le Cet exemple ne fonctionne pas car le serveur MySQL qui est lancé dans le
premier `RUN`, n'est plus lancé au moment du deuxième `RUN`. En effet, chaque premier `RUN`, n'est plus lancé au moment du deuxième `RUN`. En effet, chaque
@ -60,10 +68,12 @@ commande du `Dockerfile` a pour but de modifier le système de fichiers.
Pour avoir le résultat escompté, il faut exécuter les commandes ensemble : Pour avoir le résultat escompté, il faut exécuter les commandes ensemble :
<div lang="en-US">
``` ```
COPY db.sql /db.sql COPY db.sql /db.sql
RUN service mysqld start && mysql -u root -p toor virli < /db.sql RUN service mysqld start && mysql -u root -p toor virli < /db.sql
``` ```
</div>
Après le `RUN`, MySQL sera de nouveau arrêté, si on veut l'utiliser dans le Après le `RUN`, MySQL sera de nouveau arrêté, si on veut l'utiliser dans le
conteneur, il ne faudra pas oublier de lancer le processus. conteneur, il ne faudra pas oublier de lancer le processus.
@ -73,6 +83,7 @@ conteneur, il ne faudra pas oublier de lancer le processus.
Construisons maintenant un conteneur avec un serveur web : Construisons maintenant un conteneur avec un serveur web :
<div lang="en-US">
``` ```
FROM my_editor FROM my_editor
@ -81,6 +92,7 @@ RUN apt-get install -y nginx
EXPOSE 80 EXPOSE 80
``` ```
</div>
L'instruction `EXPOSE` sera traitée plus tard par le client Docker (équivalent L'instruction `EXPOSE` sera traitée plus tard par le client Docker (équivalent
à l'argument `--expose`). Il s'agit de préciser les ports sur lesquels votre à l'argument `--expose`). Il s'agit de préciser les ports sur lesquels votre
@ -89,11 +101,13 @@ image écoute.
En utilisant l'option `-P` du `run`, vous allez pouvoir assigner une En utilisant l'option `-P` du `run`, vous allez pouvoir assigner une
redirection de port aléatoire sur la machine hôte vers votre conteneur : redirection de port aléatoire sur la machine hôte vers votre conteneur :
<div lang="en-US">
``` ```
docker image build --tag=my_webserver . docker image build --tag=my_webserver .
docker container run -it -P my_webserver /bin/bash docker container run -it -P my_webserver /bin/bash
service nginx start service nginx start
``` ```
</div>
Dans un autre terminal, lancer un `docker ps` et consulter la colonne *PORTS* Dans un autre terminal, lancer un `docker ps` et consulter la colonne *PORTS*
pour connaître le port choisi par Docker pour effectuer la redirection. pour connaître le port choisi par Docker pour effectuer la redirection.
@ -109,14 +123,18 @@ Rendez-vous ensuite dans votre navigateur sur <http://localhost:49153/>.
Vous pouvez placer dans un `Dockerfile` une instruction `CMD` qui sera exécutée 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 : si aucune commande n'est passée lors du `run`, par exemple :
<div lang="en-US">
``` ```
CMD nginx -g "daemon off;" CMD nginx -g "daemon off;"
``` ```
</div>
<div lang="en-US">
``` ```
docker image build --tag=my_nginx . docker image build --tag=my_nginx .
docker container run -d -P my_nginx docker container run -d -P my_nginx
``` ```
</div>
L'option `-d` passée au `run` lance le conteneur en tâche de fond. Si vous L'option `-d` passée au `run` lance le conteneur en tâche de fond. Si vous
constatez via un `docker container ls` que le conteneur s'arrête directement, constatez via un `docker container ls` que le conteneur s'arrête directement,

View File

@ -11,9 +11,11 @@ l'ip de notre conteneur Docker dans la table `data_source` :
Petit indice, les requêtes SQL sont les suivantes : Petit indice, les requêtes SQL sont les suivantes :
<div lang="en-US">
``` ```
DELETE FROM "data_source"; DELETE FROM "data_source";
INSERT INTO "data_source" VALUES(1,1,0,'influxdb','influx','direct','http://${}:8086/','user','pass','metrics',0,'','',0,'null','2015-10-29 09:00:00','2015-10-29 09:05:00'); INSERT INTO "data_source" VALUES(1,1,0,'influxdb','influx','direct','http://${}:8086/','user','pass','metrics',0,'','',0,'null','2015-10-29 09:00:00','2015-10-29 09:05:00');
``` ```
</div>
La base se trouve dans `/var/lib/grafana/grafana.db`. La base se trouve dans `/var/lib/grafana/grafana.db`.

View File

@ -100,23 +100,27 @@ InfluxDB. Nous allons installer `telegraf` sur notre machine à l'aide de la
Ces quelques lignes devraient suffir à lancer la collecte, à condition que Ces quelques lignes devraient suffir à lancer la collecte, à condition que
votre InfluxDB écoute sur le port 8086 local : votre InfluxDB écoute sur le port 8086 local :
<div lang="en-US">
```bash ```bash
TELEGRAF_VERSION=1.0.0 TELEGRAF_VERSION=1.0.0
wget https://dl.influxdata.com/telegraf/releases/telegraf-${TELEGRAF_VERSION}_linux_amd64.tar.gz wget https://dl.influxdata.com/telegraf/releases/telegraf-${TELEGRAF_VERSION}_linux_amd64.tar.gz
tar xf telegraf-${TELEGRAF_VERSION}_linux_amd64.tar.gz tar xf telegraf-${TELEGRAF_VERSION}_linux_amd64.tar.gz
TELEGRAF_CONFIG_PATH=./telegraf/etc/telegraf/telegraf.conf ./telegraf/usr/bin/telegraf TELEGRAF_CONFIG_PATH=./telegraf/etc/telegraf/telegraf.conf ./telegraf/usr/bin/telegraf
``` ```
</div>
Rendez-vous ensuite dans [l'interface d'InfluxDB](http://localhost:8083/) pour Rendez-vous ensuite dans [l'interface d'InfluxDB](http://localhost:8083/) pour
voir si la collecte se passe bien. voir si la collecte se passe bien.
Dans l'interface sélectionnez la base `telegraf` puis explorez les valeurs : Dans l'interface sélectionnez la base `telegraf` puis explorez les valeurs :
<div lang="en-US">
```sql ```sql
SHOW MEASUREMENTS SHOW MEASUREMENTS
SHOW FIELD KEYS SHOW FIELD KEYS
SELECT usage_idle FROM cpu WHERE cpu = 'cpu-total' ORDER BY time DESC LIMIT 5 SELECT usage_idle FROM cpu WHERE cpu = 'cpu-total' ORDER BY time DESC LIMIT 5
``` ```
</div>
Laissons tourner `telegraf` afin de constituer un petit historique de valeurs. Laissons tourner `telegraf` afin de constituer un petit historique de valeurs.

View File

@ -54,11 +54,13 @@ vous codez.
Lorsqu'une ligne devient complexe, allez à la ligne : Lorsqu'une ligne devient complexe, allez à la ligne :
<div lang="en-US">
``` ```
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
nginx \ nginx \
php5-fpm php5-fpm
``` ```
</div>
Notez les backslashs à la fin des lignes, indiquant qu'elle n'est pas terminée. Notez les backslashs à la fin des lignes, indiquant qu'elle n'est pas terminée.
@ -67,6 +69,7 @@ Notez les backslashs à la fin des lignes, indiquant qu'elle n'est pas terminée
Lorsque c'est possible, ordonnez vos lignes suivant un ordre logique. Par Lorsque c'est possible, ordonnez vos lignes suivant un ordre logique. Par
exemple : exemple :
<div lang="en-US">
``` ```
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
bzr \ bzr \
@ -75,6 +78,7 @@ RUN apt-get update && apt-get install -y \
mercurial \ mercurial \
subversion subversion
``` ```
</div>
## Profitez du système de cache ## Profitez du système de cache
@ -149,16 +153,19 @@ L'entrypoint peut être utilisé de deux manières différentes :
après le nom de l'image, corresponde aux arguments attendu par le programme après le nom de l'image, corresponde aux arguments attendu par le programme
indiqué dans l'entrypoint. Par exemple pour nginx : indiqué dans l'entrypoint. Par exemple pour nginx :
<div lang="en-US">
``` ```
ENTRYPOINT ["nginx"] ENTRYPOINT ["nginx"]
CMD ["-g daemon off;"] CMD ["-g daemon off;"]
``` ```
</div>
- Vous pouvez aussi utiliser un script qui servira à faire les initialisations - Vous pouvez aussi utiliser un script qui servira à faire les initialisations
ou les configurations nécessaire au bon fonctionnement du conteneur ou les configurations nécessaire au bon fonctionnement du conteneur
(rappelez-vous, il doit être éphémère !). Par exemple, le `Dockerfile` pour (rappelez-vous, il doit être éphémère !). Par exemple, le `Dockerfile` pour
l'image de PostgreSQL possède cet entrypoint : l'image de PostgreSQL possède cet entrypoint :
<div lang="en-US">
```shell ```shell
#!/bin/bash #!/bin/bash
set -e set -e
@ -175,6 +182,7 @@ fi
exec "$@" exec "$@"
``` ```
</div>
## `[""]`, `'` et sans `[]` ## `[""]`, `'` et sans `[]`

View File

@ -10,9 +10,11 @@ La première chose à faire est de télécharger la liste des paquets. En effet,
afin de ne pas livrer de superflu, la liste des paquets et son cache ne sont afin de ne pas livrer de superflu, la liste des paquets et son cache ne sont
pas incluses dans le conteneur. pas incluses dans le conteneur.
<div lang="en-US">
``` ```
apt-get update apt-get update
``` ```
</div>
Il peut arriver que des paquets présents dans l'image ne soient pas à Il peut arriver que des paquets présents dans l'image ne soient pas à
jour. Afin de garder un environnement cohérent, il est recommandé de ne pas jour. Afin de garder un environnement cohérent, il est recommandé de ne pas
@ -22,16 +24,20 @@ jour.
Installons maintenant un programme : Installons maintenant un programme :
<div lang="en-US">
``` ```
apt-get install nano apt-get install nano
``` ```
</div>
En attendant la fin de l'installation, jetons un œil à la commande dans un En attendant la fin de l'installation, jetons un œil à la commande dans un
autre terminal : autre terminal :
<div lang="en-US">
``` ```
docker container ls docker container ls
``` ```
</div>
Cette commande liste les conteneurs actifs. Notez le *Container ID* ainsi que Cette commande liste les conteneurs actifs. Notez le *Container ID* ainsi que
le *NAMES* du conteneur actuellement en cours d'installation de `nano`. le *NAMES* du conteneur actuellement en cours d'installation de `nano`.
@ -42,17 +48,21 @@ Lorsque l'installation de `nano` est terminée, quittez l'image en tapant
Sauvegardez votre image modifiée avec la commande `commit` pour pouvoir Sauvegardez votre image modifiée avec la commande `commit` pour pouvoir
commencer directement de votre image avec `nano` : commencer directement de votre image avec `nano` :
<div lang="en-US">
``` ```
docker container commit CONTAINER my_nano docker container commit CONTAINER my_nano
``` ```
</div>
en remplaçant `CONTAINER` par le nom ou l'identifiant de votre en remplaçant `CONTAINER` par le nom ou l'identifiant de votre
container. `my_nano` est le nom que vous voudrez utiliser à la place container. `my_nano` est le nom que vous voudrez utiliser à la place
d'`ubuntu` : d'`ubuntu` :
<div lang="en-US">
``` ```
docker container run -it my_nano /bin/bash docker container run -it my_nano /bin/bash
``` ```
</div>
Vous constatez cette fois que vous pouvez lancer `nano`, alors que vous ne Vous constatez cette fois que vous pouvez lancer `nano`, alors que vous ne
pouvez toujours pas le faire dans un conteneur issu d'une image `ubuntu` ! pouvez toujours pas le faire dans un conteneur issu d'une image `ubuntu` !

View File

@ -29,9 +29,11 @@ Pour tester la bonne marche de vos conteneurs, vous pouvez le lancer votre
conteneur chronograf avec la commande suivante (en considérant que votre conteneur chronograf avec la commande suivante (en considérant que votre
conteneur influxdb de la première partie est toujours lancé). conteneur influxdb de la première partie est toujours lancé).
<div lang="en-US">
```shell ```shell
docker run --rm --link YOUR_INFLUX_CNTR_NAME:influxdb chronograf docker run --rm --link YOUR_INFLUX_CNTR_NAME:influxdb chronograf
``` ```
</div>
Remplacez `YOUR_INFLUX_CNTR_NAME` par le nom du conteneur qui fait tourner Remplacez `YOUR_INFLUX_CNTR_NAME` par le nom du conteneur qui fait tourner
votre influxdb. En créant ce lien, `chronograf` sera capable de contacter une votre influxdb. En créant ce lien, `chronograf` sera capable de contacter une
@ -48,7 +50,9 @@ Après avoir ajouté le serveur (en remplaçant `localhost` proposé par défaut
`influxdb` issue du *link*), ajouter deux visualisations avec les requêtes `influxdb` issue du *link*), ajouter deux visualisations avec les requêtes
suivantes : suivantes :
<div lang="en-US">
```sql ```sql
SELECT used, available, cached FROM mem WHERE tmpltime() SELECT used, available, cached FROM mem WHERE tmpltime()
SELECT mean(usage_idle) FROM cpu WHERE tmpltime() GROUP BY time(20s), cpu SELECT mean(usage_idle) FROM cpu WHERE tmpltime() GROUP BY time(20s), cpu
``` ```
</div>

View File

@ -39,9 +39,11 @@ lance puis attend que les deux deamons aient terminés de s'exécuter.
Pour vérifier que votre conteneur fonctionne correctement, vous pouvez le Pour vérifier que votre conteneur fonctionne correctement, vous pouvez le
lancer : lancer :
<div lang="en-US">
```shell ```shell
docker run --rm -p 10000:10000 mymonitoring docker run --rm -p 10000:10000 mymonitoring
``` ```
</div>
Puis accéder à chronograf : <http://localhost:10000/>. Donnez un nom à votre Puis accéder à chronograf : <http://localhost:10000/>. Donnez un nom à votre
configuration, puis cliquez sur *Add*. Les paramètres préremplis dans le configuration, puis cliquez sur *Add*. Les paramètres préremplis dans le
@ -60,9 +62,11 @@ conteneur qui délivre des pages web), il va être possible de redémarrer le
conteneur automatiquement grâce à la *restart policy* que l'on peut définir au conteneur automatiquement grâce à la *restart policy* que l'on peut définir au
moment du `docker run` : moment du `docker run` :
<div lang="en-US">
```shell ```shell
docker run -d -p 80:80 --restart=on-failure nginx docker run -d -p 80:80 --restart=on-failure nginx
``` ```
</div>
Il existe trois règles de redémarrage différentes : Il existe trois règles de redémarrage différentes :