tutorial: Reorder chapters for better grouping

This commit is contained in:
nemunaire 2021-09-21 11:44:12 +02:00
parent c9a08c6125
commit 0093949c4d
12 changed files with 110 additions and 73 deletions

View File

@ -1,8 +1,11 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md \
../docker-basis/installation.md ../docker-basis/what.md ../docker-basis/first.md ../docker-basis/cleaning.md ../docker-basis/ex-flask.md ../docker-basis/volumes.md ../docker-basis/linking.md \
../docker-advanced/setup.md ../docker-advanced/what.md ../docker-advanced/manual.md ../docker-advanced/compose.md ../docker-advanced/security.md \
../docker-basis/discover.md ../docker-basis/installation.md ../docker-basis/what.md ../docker-basis/first.md ../docker-basis/cleaning.md ../docker-basis/ex-flask.md \
../docker-basis/volumes.md \
../docker-basis/linking.md \
../docker-advanced/what.md ../docker-advanced/setup.md ../docker-advanced/manual.md ../docker-advanced/compose.md \
../docker-advanced/security.md \
rendu.md

View File

@ -1,9 +1,9 @@
\newpage
Composition de conteneurs
=========================
-------------------------
## Automatiser le lancement de conteneurs
### Automatiser le lancement de conteneurs
Au lieu de faire un script pour construire et lancer tous vos conteneurs, nous
allons définir à la racine de notre projet un fichier `docker-compose.yml` qui
@ -30,7 +30,7 @@ services:
Ce fichier est un condensé des options que nous passons habituellement au
`docker container run`.
### `version`
#### `version`
Notons toutefois la présence d'une ligne `version` ; il ne s'agit pas de la
version de vos conteneurs, mais de la version du format de fichier
@ -39,7 +39,7 @@ originale sera utilisée, ne vous permettant pas d'utiliser les dernières
fonctionnalités de Docker.
### `services`
#### `services`
Cette section énumère la liste des services (ou conteneurs) qui seront gérés
par `docker-compose`.
@ -52,7 +52,7 @@ Les autres fils sont les paramètres classiques que l'on va passer à `docker
run`.
### `volumes`
#### `volumes`
Cette section est le pendant de la commandes `docker volume`.
@ -81,7 +81,7 @@ l'emplacement à partager :
</div>
### `network`
#### `network`
Cette section est le pendant de la commandes `docker network`.
@ -101,7 +101,7 @@ networks:
</div>
#### Driver `host`
##### Driver `host`
Le driver `host` réutilise la pile réseau de la machine hôte. Le conteneur
pourra donc directement accéder au réseau, sans NAT et sans redirection de
@ -109,7 +109,7 @@ port. Les ports alloués par le conteneur ne devront pas entrer en conflit avec
les ports ouverts par la machine hôte.
#### Driver `null`
##### Driver `null`
Avec le driver `null`, la pile réseau est recréée et aucune interface (autre
que l'interface de loopback) n'est présente. Le conteneur ne peut donc pas
@ -120,7 +120,7 @@ le driver à utiliser. Par exemple pour un conteneur dont le but est de vérifie
un backup de base de données.
#### Driver `bridge`
##### Driver `bridge`
Le driver `bridge` crée un nouveau bridge qui sera partagé entre tous les
conteneurs qui la référencent.
@ -131,7 +131,7 @@ fonctionnalité de `link` au moment du `run`, il est possible de se retrouvé
lié, même après que l'on ait démarré. La résolution se fera dynamiquement.
### Utiliser le `docker-compose.yml`
#### Utiliser le `docker-compose.yml`
Consultez
[la documentation](https://docs.docker.com/compose/compose-file/) pour

View File

@ -1,15 +1,17 @@
\newpage
Lier des conteneurs
===================
-------------------
Avant de voir des méthodes plus automatiques pour déployer toute notre pile
logicielle TICK, nous allons commencer par mettre en place et lier les
conteneurs manuellement, de la même manière que nous avons pu le faire avec
l'interface d'administration du FIC et MySQL.
l'interface d'administration du FIC et MySQL. Cela nous permettra de voir les
subtilités de chaque image, ce qui nous fera gagner du temps pour ensuite
en faire la description.
## Conteneur central: la base de données
### Conteneur central: la base de données
Le premier conteneur qui doit être lancé est la base de données orientée séries
temporelles:
@ -123,7 +125,7 @@ redémarrer le conteneur. Aidez-vous pour cela de la [documentation du
conteneur](https://hub.docker.com/_/influxdb).
## Collecter les données locales
### Collecter les données locales
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*:
@ -186,7 +188,7 @@ La nouvelle base a donc bien été créée et tant que nous laissons *Telegraf*
lancé, celui-ci va régulièrement envoyer des métriques de cette machine.
## Afficher les données collectées
### Afficher les données collectées
#### Exercice: {-}

View File

@ -1,18 +1,21 @@
\newpage
Limiter les ressources
======================
Contenir les applications pour éviter les fuites
================================================
Lorsque l'on gère un environnement de production, on souhaite bien
évidemment éviter tout déni de service autant que possible. Ou
parfois, contenir un programme métier avec une fuite mémoire, dans
certaines limites : il vaut parfois mieux le tuer et le relancer
automatiquement, plutôt que d'attendre que potentiellement un autre
processus se fasse tuer à sa place.
évidemment éviter tout déni de service. Ou parfois, contenir un
programme métier avec une fuite mémoire, dans certaines limites : il
vaut parfois mieux le tuer et le relancer automatiquement, plutôt que
d'attendre que potentiellement un autre processus se fasse tuer à sa
place.
Pour cela, Docker expose tout un arsenal, reposant sur les cgroups du
noyau Linux, que l'on verra plus en détail dans un prochain cours.
## Limiter l'utilisaation des ressources
### Mémoire
Comme on peut s'y attendre, il est possible de limiter la mémoire que

View File

@ -1,7 +1,7 @@
\newpage
Mise en place
=============
-------------
Dans la première partie du TP, nous avons installé l'environnement Docker
principal, qui inclut le client, le daemon et toute sa machinerie. Mais le
@ -10,7 +10,7 @@ trouvées dans les usages de la communauté, et parfois même appropriées par
Docker.
## `docker-compose`
### `docker-compose`
Dans cette partie, nous allons avoir besoin de `docker-compose`.
@ -19,12 +19,12 @@ Ce projet ne bénéficie pas d'une intégration au sein du projet Docker et doit
une équipe indépendante. Il constitue aujourd'hui une brique de l'écosystème
Docker, presque indispensable !
### Par le gestionnaire de paquets
#### Par le gestionnaire de paquets
Les distributions à jour vous proposeront un paquet `docker-compose` qui
fonctionnera avec la version de Docker qu'ils fournissent.
### Par la distribution binaire
#### Par la distribution binaire
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 :
@ -37,14 +37,14 @@ chmod +x /usr/bin/docker-compose
```
</div>
### `pip`
#### `pip`
Le projet étant écrit en Python, il est également disponible via `pip`, si vous
préférez cette méthode. N'oubliez pas de préciser une version compatible avec
votre version de Docker.
### Vérification du fonctionnement
#### Vérification du fonctionnement
Comme avec Docker, nous pouvons vérifier le bon fonctionnement de
`docker-compose` en exécutant la commande :
@ -60,7 +60,7 @@ Si vous obtenez une réponse similaire, c'est que vous êtes prêt à commencer
TP ! Alors n'attendons pas, partons à l'aventure !
## Play With Docker
### Play With Docker
Tout comme pour la partie précédente, si vous avez des difficultés pour
réaliser les exercices sur vos machines, vous pouvez utiliser le projet [Play

View File

@ -1,12 +1,31 @@
\newpage
But du TP
=========
Orchestrer un groupe de conteneurs
==================================
Nous allons réaliser un système de monitoring, prêt à être déployé
chez un fournisseur de cloud.
Maintenant que nous savons démarrer individuellement des conteneurs et les lier
entre-eux, nous allons voir une première manière d'automatiser cela.
Le résultat attendu d'ici la fin du TP, est un groupe de conteneurs
Plutôt que de lancer les commandes `docker` comme nous l'avons fait jusque là :
soit directement dans un terminal, soit via un script, nous allons décrire
l'état que nous souhaitons atteindre : quels images lancer, quels volumes
créer, quels réseaux, etc. Cette description peut s'utiliser pour lancer un
conteneur seul, mais elle prend tout son sens lorsqu'il faut démarrer tout un
groupe de conteneurs qui fonctionnent de concert, parfois avec des dépendances
(un serveur applicatif peut nécessiter d'avoir une base de données prête pour
démarrer).
On parle d'orchestration, car nous allons utiliser Docker comme un chef
d'orchestre : il va ordonner les créations des différents objets (volumes,
réseaux, conteneurs, ...) afin d'arriver au résultat attendu, puis il va faire
en sorte de maintenir ce résultat selon les événements qui pourront survenir.
---
Notre fil rouge dans cette partie sera la réalisation d'un système de
monitoring, tel que nous pourrions le déployer chez un fournisseur de cloud.
Le résultat attendu d'ici la fin de l'exercice, est un groupe de conteneurs
indépendants les uns des autres, réutilisables en fonction de besoins
génériques et pouvant facilement être mis à l'échelle.

View File

@ -1,7 +1,7 @@
\newpage
Faire le ménage
===============
---------------
Au fur et à mesure de nos tests, la taille utilisée par les données de Docker
peut devenir conséquente et son interface peut commencer à déborder
@ -14,7 +14,7 @@ supprimera pas non plus les conteneurs qui n'auront pas été démarrés avec
l'option `--rm`.
## Conteneurs
### Conteneurs
Nous pouvons afficher l'ensemble des conteneurs, quel que soit leur état (en
cours d'exécution, arrêtés,\ ...) avec la commande suivante :
@ -46,7 +46,7 @@ docker container rm cranky_jones dreamy_gates
</div>
## Images
### Images
Les vieilles images qui n'ont plus de références sur elle (ni tag, ni conteneur
lié) sont automatiquement supprimées. Vous n'avez généralement pas à vous
@ -54,7 +54,7 @@ occuper de faire du nettoyage dans les images. Néanmoins, vous pouvez les gére
de la même manière que les conteneurs, avec les sous-commandes `docker image`.
## `prune`
### `prune`
Dans la plupart des menus permettant de gérer les objets Docker, vous trouverez
une commande `prune` qui supprimera les objets inutilisés :

View File

@ -1,7 +1,7 @@
\newpage
Mon premier webservice
======================
----------------------
C'est parti, nous allons déployer notre premier service !
@ -30,7 +30,7 @@ Non ! Car le service est contenerisé ! Il s'exécute dans son coin, sans
interférer avec son hôte.
## Redirection de ports
### Redirection de ports
Nous pouvons rediriger le port avec l'argument <span lang="en-US">`-p dst_host:src_cntr`</span> :
@ -63,7 +63,7 @@ done
</div>
## Prêt pour la production ?
### Prêt pour la production ?
Avec l'option `-i`, nous pouvons encore transmettre les signaux de terminaison
au conteneur. C'est pratique lorsque l'on développe, mais en production, notre
@ -88,7 +88,7 @@ docker container logs 0123456789abcdef
</div>
## Une autre instance ?
### Une autre instance ?
Maintenant que nous avons un clone de <https://you.p0m.fr/>, nous voulons
absolument un clone de <https://food.p0m.fr/> !
@ -111,7 +111,7 @@ voit bien que ceux-ci ne partagent pas leur système de fichiers : notre
nouvelle instance est encore immaculée.
## Paramètres de lancement
### Paramètres de lancement
`youp0m` dispose d'une interface d'administration minimaliste, pour modérer les
images soumises. Celle-ci est accessible par mot de passe (ou est désactivée si
@ -146,7 +146,7 @@ Une fois lancé, ce conteneur exposera une interface d'administration à cette
adresse : <http://localhost:8080/admin/>.
## Arrêt des conteneurs et persistance des données
### Arrêt des conteneurs et persistance des données
Lorsque l'on souhaite stopper un conteneur lancé en tâche de fond, on utilise
son identifiant dans la commande suivante :

View File

@ -1,7 +1,7 @@
\newpage
Mon premier conteneur
=====================
---------------------
Afin de tester la bonne marche de notre installation, lançons notre premier
conteneur avec la commande\ :
@ -41,7 +41,7 @@ docker image pull ubuntu
</div>
### Arguments de la ligne de commande
#### Arguments de la ligne de commande
Remarquez comment on interagit avec chaque *objet Docker* : dans la ligne de
commande, le premier mot clef est le type d'objet (`container`, `image`,
@ -68,7 +68,7 @@ docker image ls
</div>
### *Image ID*, nom, tag
#### *Image ID*, nom, tag
Chaque image est identifiable par son *Image ID* : il s'agit d'un long
identifiant unique. Chaque modification qui est apportée à l'image
@ -109,7 +109,7 @@ le tag qui est automatiquement recherché lorsque l'on ne le précise pas en
lançant l'image.
## Exécuter un programme dans un conteneur
### Exécuter un programme dans un conteneur
Maintenant que nous avons à notre disposition l'image d'un conteneur Ubuntu,
nous allons pouvoir jouer avec !
@ -140,7 +140,7 @@ docker container run alpine /sbin/apk stats
</div>
### Images vs. conteneurs
#### Images vs. conteneurs
À chaque fois que nous lançons un `run`, un nouveau conteneur est créé.
L'image fournie comme argument est utilisée comme un modèle de base pour le
@ -162,7 +162,7 @@ l'installation d'un paquet) s'applique à d'autres conteneurs, il va falloir
créer une nouvelle image à partir de ce conteneur.
### Programme par défaut
#### Programme par défaut
Chaque image vient avec un certain nombre de métadonnées, notamment le
programme à exécuter par défaut si l'on ne le précise pas dans la ligne de
@ -248,7 +248,7 @@ Rassurez-vous, on peut les abbréger en `-i` et `-t` :
</div>
### Les paramètres
#### Les paramètres
Vous avez remarqué le placement des options `--tty` et `--interactive` ? Avant
le nom de l'image, elles sont utilisées par Docker pour modifier le comportement
@ -276,7 +276,7 @@ simplement transmis au conteneur comme argument au premier `execve(2)` du
conteneur.
## Lister les conteneurs
### Lister les conteneurs
Avant de quitter notre conteneur, regardons, à l'aide d'un autre terminal,
l'état de notre conteneur. La commande suivante permet d'obtenir la liste des
@ -291,7 +291,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAME
</div>
## Sortir d'un conteneur
### Sortir d'un conteneur
Pour mettre fin à l'exécution d'un conteneur, il convient de terminer le
premier processus lancé dans celui-ci.

View File

@ -1,12 +1,12 @@
\newpage
Installation
============
------------
Avant de voir de quoi il s'agit, afin de gagner du temps, nous allons commencer
par installer Docker.
## Prérequis
### Prérequis
Docker repose sur plusieurs techniques implémentées dans les récents noyaux
Linux (et plus marginalement, Windows). Nous consacrerons les prochains cours à
@ -46,7 +46,7 @@ Rassurez-vous, même si vous n'avez pas compilé le dernier noyau disponible sur
[`kernel.org`](https://www.kernel.org/), Docker s'utilise à partir de Linux 3.10.
## Par le gestionnaire de paquets
### Par le gestionnaire de paquets
En général, votre distribution mettra à votre disposition une version de Docker
plus ou moins récente. Sous Debian et ses dérivés (Ubuntu, Mint, ...) le paquet
@ -64,7 +64,7 @@ distribution :
la procédure d'installation de cette distribution.
## Windows et macOS
### Windows et macOS
Bien que les fonctionnalités de contenerisation de Docker que nous utiliserons
ne soient disponibles que sous Linux, il est possible d'utiliser Docker de
@ -88,7 +88,7 @@ reste libre, mais seulement les applications Docker Desktop.
[^DockerSubscription]: <https://www.docker.com/blog/updating-product-subscriptions/>
## Évaluation en ligne
### Évaluation en ligne
Si vous rencontrez des difficultés pour vous lancer, le projet
[Play With Docker](https://labs.play-with-docker.com/) vous donne accès à
@ -99,7 +99,7 @@ Docker](https://hub.docker.com/signup). Une fois identifié, vous pourrez créer
une nouvelle instance, et vous connecter dessus via SSH.
## Vérifier la bonne marche de l'installation
### Vérifier la bonne marche de l'installation
Vous devriez maintenant être capable de lancer la commande suivante :
@ -145,7 +145,9 @@ Server:
</div>
### `no such file or directory`?
### Problèmes courants
#### `no such file or directory`?
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 :
@ -157,7 +159,7 @@ sudo service docker restart
</div>
### `permission denied`?
#### `permission denied`?
Si vous avez cette erreur : `dial unix /var/run/docker.sock: permission
denied.`, ajoutez votre utilisateur au groupe `docker` et **relancez votre

View File

@ -1,7 +1,7 @@
\newpage
Composition de Docker
=====================
---------------------
Docker est un écosystème d'outils de haut niveau, permettant d'utiliser des
*conteneurs*.
@ -25,7 +25,7 @@ Commençons par planter le décor, en détaillant les principaux mécanismes de
Docker.
## Les images Docker
### Les images Docker
Une image Docker est un système de fichiers en lecture seule. Elle est formée
d'un ensemble de couches, agrégées selon le principe d'UnionFS.
@ -44,7 +44,7 @@ Il y a deux méthodes pour obtenir des images Docker : soit les construire avec
les outils fournis, soit les récupérer depuis un registre.
## Les registres Docker (*Docker registries*)
### Les registres Docker (*Docker registries*)
Les registres sont des plates-formes de stockage, publiques ou privées,
contenant des images. Ils permettent de récupérer des images, mais également
@ -62,7 +62,7 @@ et [GitLab](https://docs.gitlab.com/ee/user/packages/container_registry/) le
proposent également.
## Les conteneurs Docker
### Les conteneurs Docker
Alors que les images constituent la partie immuable de Docker, les conteneurs
sont sa partie vivante. Chaque conteneur est créé à partir d'une image : à

View File

@ -25,10 +25,18 @@ apt-get update
</div>
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**
utiliser le gestionnaire de paquets pour mettre à jour les paquets présents de
base, mais plutôt de contacter le mainteneur de l'image pour qu'il la mette à
jour.
jour. De manière générale, il n'est pas recommandé de faire de mises à
jour automatiques et systématiques des éléments présents dans l'image,
à l'exception des mises à jour de sécurité[^SECURITY_UPDATE]. En effet, une mise à jour
qui apporte des changements peut altérer le comportement du conteneur,
en fonction de la date à laquelle on le construit.
[^SECURITY_UPDATE]: Voir cet article :
<https://pythonspeed.com/articles/security-updates-in-docker/>
Si vous souhaitez disposez d'une nouvelle version de l'image, il est
plutôt recommandé de contacter le mainteneur de l'image pour qu'il la
mette à jour, en utilisant un nouveau tag s'il le juge nécessaire.
Installons maintenant un programme :
@ -38,10 +46,10 @@ apt-get install nano
```
</div>
Lorsque l'installation de `nano` est terminée, quittez l'image en tapant
Lorsque l'installation de `nano` est terminée, quittons l'image en tapant
`exit`.
Sauvegardez vos modifications en tant que nouvelle image Docker, avec
Sauvegardons nos modifications en tant que nouvelle image Docker, avec
la commande `commit` :
<div lang="en-US">