diff --git a/tutorial/2/installation.md b/tutorial/2/installation.md deleted file mode 100644 index 0a216ae..0000000 --- a/tutorial/2/installation.md +++ /dev/null @@ -1,50 +0,0 @@ -\newpage - -Installation -============ - -## `docker-compose` - -Pour ce TP, nous allons avoir besoin de `docker-compose`. - -Ce projet ne bénéficie pas d'une intégration au sein du projet Docker et doit -être téléchargé séparément, car originellement, le projet était développé par -une équipe indépendante. S'étant révélé primordiale, ils ont trouvé une place -au sein du projet Docker, mais l'incompatibilité des langages utilisés fait que -`docker-compose` n'est toujours pas intégré dans docker. - -### 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 - -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 : - -```shell -curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-Linux-x86_64 \ - > /usr/bin/docker-compose -chmod +x /usr/bin/docker-compose -``` - -### `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 - -Comme avec Docker, nous pouvons vérifier le bon fonctionnement de -`docker-compose` en exécutant la commande : - -``` -42sh$ docker-compose --version -docker-compose version: 1.8.0 -``` - -Si vous obtenez une réponse similaire, c'est que vous êtes prêt à commencer le -TP ! Alors n'attendons pas, partons à l'aventure ! diff --git a/tutorial/1/Makefile b/tutorial/docker-basis/Makefile similarity index 91% rename from tutorial/1/Makefile rename to tutorial/docker-basis/Makefile index c5c255c..dad9e57 100644 --- a/tutorial/1/Makefile +++ b/tutorial/docker-basis/Makefile @@ -1,4 +1,4 @@ -SOURCES = tutorial.md installation.md what.md first.md cleaning.md dockerfile.md volumes.md linking.md rendu.md +SOURCES = tutorial.md installation.md what.md first.md cleaning.md volumes.md linking.md rendu.md PANDOCOPTS = --latex-engine=xelatex \ --standalone \ --normalize \ diff --git a/tutorial/1/cleaning.md b/tutorial/docker-basis/cleaning.md similarity index 100% rename from tutorial/1/cleaning.md rename to tutorial/docker-basis/cleaning.md diff --git a/tutorial/1/first.md b/tutorial/docker-basis/first.md similarity index 78% rename from tutorial/1/first.md rename to tutorial/docker-basis/first.md index c6e661e..9ea9b37 100644 --- a/tutorial/1/first.md +++ b/tutorial/docker-basis/first.md @@ -166,61 +166,3 @@ sans quoi `bash` ne se lancera pas en mode interractif[^bashnointer]. L'option `-i` reste néanmoins nécessaire pour que l'entrée standard soit transmise au conteneur. - - -### Modification interactive - -Nous voilà maintenant dans le conteneur ! Il est assez épuré, il n'y a rien de -superflu : même pas d'éditeur de texte : ni vim, ni emacs, même pas `vi` ! - -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 -pas inclues dans le conteneur. - -``` -apt-get update -``` - -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ésent de -base, mais plutôt de contacter le mainteneur de l'image pour qu'il la mette à -jour. - -Installons maintenant un programme : - -``` -apt-get install nano -``` - -En attendant la fin de l'installation, jetons un œil à la commande dans un -autre terminal : - -``` -docker container ls -``` - -Cette commande liste les conteneurs actifs. Notez le *Container ID* ainsi que -le *NAMES* du conteneur du conteneur actuellement en cours d'installation de -`nano`. - -Lorsque l'installation de `nano` est terminée, quittez l'image en tapant -`exit`. - -Sauvegardez votre image modifiée avec la commande `commit` pour pouvoir -commencer directement de votre image avec `nano` : - -``` -docker container commit CONTAINER my_nano -``` - -En remplaçant `CONTAINER` par le nom ou l'identifiant de votre -container. `my_nano` est le nom que vous voudrez utiliser à la place -d'`ubuntu` : - -``` -docker container run -it my_nano /bin/bash -``` - -Vous constatez cette fois que vous pouvez lancer `nano`, alors que vous ne -pouvez toujours pas le faire dans un conteneur issue d'une image `ubuntu` ! diff --git a/tutorial/1/img-vs-cntr.png b/tutorial/docker-basis/img-vs-cntr.png similarity index 100% rename from tutorial/1/img-vs-cntr.png rename to tutorial/docker-basis/img-vs-cntr.png diff --git a/tutorial/1/installation.md b/tutorial/docker-basis/installation.md similarity index 100% rename from tutorial/1/installation.md rename to tutorial/docker-basis/installation.md diff --git a/tutorial/1/linking.md b/tutorial/docker-basis/linking.md similarity index 100% rename from tutorial/1/linking.md rename to tutorial/docker-basis/linking.md diff --git a/tutorial/1/misc/Dockerfile b/tutorial/docker-basis/misc/Dockerfile similarity index 100% rename from tutorial/1/misc/Dockerfile rename to tutorial/docker-basis/misc/Dockerfile diff --git a/tutorial/1/misc/count_layers.sh b/tutorial/docker-basis/misc/count_layers.sh similarity index 100% rename from tutorial/1/misc/count_layers.sh rename to tutorial/docker-basis/misc/count_layers.sh diff --git a/tutorial/1/misc/docker-entrypoint.sh b/tutorial/docker-basis/misc/docker-entrypoint.sh similarity index 100% rename from tutorial/1/misc/docker-entrypoint.sh rename to tutorial/docker-basis/misc/docker-entrypoint.sh diff --git a/tutorial/1/misc/tumsoul_0.3.3.py b/tutorial/docker-basis/misc/tumsoul_0.3.3.py similarity index 100% rename from tutorial/1/misc/tumsoul_0.3.3.py rename to tutorial/docker-basis/misc/tumsoul_0.3.3.py diff --git a/tutorial/1/rendu.md b/tutorial/docker-basis/rendu.md similarity index 100% rename from tutorial/1/rendu.md rename to tutorial/docker-basis/rendu.md diff --git a/tutorial/1/todo.org b/tutorial/docker-basis/todo.org similarity index 100% rename from tutorial/1/todo.org rename to tutorial/docker-basis/todo.org diff --git a/tutorial/1/tutorial.md b/tutorial/docker-basis/tutorial.md similarity index 100% rename from tutorial/1/tutorial.md rename to tutorial/docker-basis/tutorial.md diff --git a/tutorial/1/volumes.md b/tutorial/docker-basis/volumes.md similarity index 100% rename from tutorial/1/volumes.md rename to tutorial/docker-basis/volumes.md diff --git a/tutorial/1/what.md b/tutorial/docker-basis/what.md similarity index 100% rename from tutorial/1/what.md rename to tutorial/docker-basis/what.md diff --git a/tutorial/2/Makefile b/tutorial/docker-orchestration/Makefile similarity index 80% rename from tutorial/2/Makefile rename to tutorial/docker-orchestration/Makefile index f244b37..9f3bf17 100644 --- a/tutorial/2/Makefile +++ b/tutorial/docker-orchestration/Makefile @@ -1,4 +1,4 @@ -SOURCES = tutorial.md installation.md what.md first.md supervisor.md goodpractices.md compose.md project.md +SOURCES = tutorial.md setup.md what.md manual.md compose.md project.md PANDOCOPTS = --latex-engine=xelatex \ --standalone \ --normalize \ diff --git a/tutorial/docker-orchestration/check.sh b/tutorial/docker-orchestration/check.sh new file mode 100755 index 0000000..26a3171 --- /dev/null +++ b/tutorial/docker-orchestration/check.sh @@ -0,0 +1,141 @@ +#!/bin/sh + +note_init() { + NOTE=0 + echo -n $@ +} + +note() { + NOTE=$(($NOTE + $1)) + echo -n ,$@ +} + +for LOGIN in $@ +do + note_init $LOGIN + pushd $LOGIN > /dev/null + + # Questions + + if grep -i "go" questions.txt 2> /dev/null > /dev/null; then + note 1 + else + note 0 + fi + + if grep -E -i "(linkage|static|statique|liaison)" questions.txt 2> /dev/null > /dev/null; then + note 1 + else + note 0 + fi + + + # Exercice InfluxDB + + DOCKERFILE_influxdb="influxdb/Dockerfile" + if ! [ -f "${DOCKERFILE_influxdb}" ] && [ -f "influxdb/dockerfile" ]; then + DOCKERFILE_influxdb="influxdb/dockerfile" + fi + + NBRUN=$(grep -E -i ^RUN "${DOCKERFILE_influxdb}" 2> /dev/null | wc -l) + if [ $NBRUN -le 2 ] && [ $NBRUN -gt 0 ]; then + note 1 + else + note 0 + fi + + if grep -E -i '^EXPOSE.*8083' "${DOCKERFILE_influxdb}" 2> /dev/null > /dev/null && grep -E -i '^EXPOSE.*8086' "${DOCKERFILE_influxdb}" 2> /dev/null > /dev/null && \ + grep -i ^EXPOSE "${DOCKERFILE_influxdb}" 2> /dev/null | sed "s/ 8083//g;s/ 8086//g" | grep -E '^EXPOSE[[:space:]]*$' > /dev/null; then + note 1 + else + note 0 + fi + + if grep -E -i '^MAINTAINER[[:space:]]' "${DOCKERFILE_influxdb}" 2> /dev/null > /dev/null; then + note 1 + else + note 0 + fi + + if grep -E -i '^(ADD|COPY)[[:space:]]' "${DOCKERFILE_influxdb}" 2> /dev/null > /dev/null; then + CONFIGFILE=$(grep -E -i '^(ADD|COPY)[[:space:]]' "${DOCKERFILE_influxdb}" | sed -r 's/^(COPY|ADD)[[:space:]]+([^[:space:]]*).*$/\2/') + if [ -f "influxdb/${CONFIGFILE}" ]; then + note 1 + else + note 0 + fi + else + note 0 + fi + + + # Exercice mymonitoring + + DOCKERFILE_mymonitoring="mymonitoring/Dockerfile" + if grep -E -i '^FROM[[:space:]]' "${DOCKERFILE_mymonitoring}" 2> /dev/null > /dev/null; then + note 1 + else + note 0 + fi + + if grep -E -i '^ENV[[:space:]]' "${DOCKERFILE_mymonitoring}" 2> /dev/null > /dev/null; then + note 1 + else + note 0 + fi + + CONFIGFILE=$(grep -E -i '^(ADD|COPY)[[:space:]]' "${DOCKERFILE_mymonitoring}" 2> /dev/null | grep -vi "influx" | grep -vi "chrono" | sed -r 's/^(COPY|ADD)[[:space:]]+([^[:space:]]*).*$/\2/') + if ! [ -f "mymonitoring/${CONFIGFILE}" ]; then + CONFIGFILE="mymonitoring/supervisor.conf" + fi + if [ -f "mymonitoring/${CONFIGFILE}" ]; then + ERRS=0 + + if grep -E -i "command=.*service.*start" "mymonitoring/${CONFIGFILE}" > /dev/null; then + ERRS=$(($ERRS + 1)) + fi + + note $((2 - $ERRS)) + else + note 0 + fi + + + # Exercice docker-compose + + DOCKERCOMPOSE="docker-compose.yml" + + NBBUILD=$(grep -E -i "build[[:space:]]*:" "${DOCKERCOMPOSE}" 2> /dev/null | wc -l) + if [ $NBBUILD -ge 2 ]; then + note 2 + elif [ $NBBUILD -ge 1 ]; then + note 1 + else + note 0 + fi + + NBVOLS=$(grep -E -i "volumes[[:space:]]*:" "${DOCKERCOMPOSE}" 2> /dev/null | wc -l) + if [ $NBVOLS -ge 2 ]; then + note 2 + elif [ $NBVOLS -ge 1 ]; then + note 1 + else + note 0 + fi + + NBNET=$(grep -E -i "networks[[:space:]]*:" "${DOCKERCOMPOSE}" 2> /dev/null | wc -l) + NBLINK=$(grep -E -i "networks[[:space:]]*:" "${DOCKERCOMPOSE}" 2> /dev/null | wc -l) + if [ $NBNET -ge 2 ]; then + note 2 + elif [ $NBNET -ge 1 ]; then + note 1 + elif [ $NBLINK -ge 1 ]; then + note 2 + else + note 0 + fi + + + echo #" = $NOTE" + popd > /dev/null +done diff --git a/tutorial/2/chronograf.png b/tutorial/docker-orchestration/chronograf.png similarity index 100% rename from tutorial/2/chronograf.png rename to tutorial/docker-orchestration/chronograf.png diff --git a/tutorial/2/compose.md b/tutorial/docker-orchestration/compose.md similarity index 68% rename from tutorial/2/compose.md rename to tutorial/docker-orchestration/compose.md index 623c6ba..30b7c63 100644 --- a/tutorial/2/compose.md +++ b/tutorial/docker-orchestration/compose.md @@ -1,57 +1,7 @@ \newpage -# Compose - -Avec notre conteneur utilisant `supervisor`, nous ne respectons pas -cette dernière bonne pratique d'un seul processus par conteneur :-( - -L'intérêt est de permettre à chaque conteneur d'effectuer une tâche -simple et générique, de manière à pouvoir être réutilisé pour d'autres -projets dans le futur. Par exemple, notre conteneur InfluxDB pourra -être utilisé pour stocker des relevés de métriques d'autres systèmes -ou des logs. Chronograf peut être connecté à d'autres serveurs afin -de corréler les métriques, ... - - -## Séparer le `Dockerfile` - -Commençons par séparer notre `Dockerfile` en deux : dans une partie -nous allons garder la partie InfluxDB, de l'autre la partie Chronograf. - -Il va vous falloir créer deux dossiers distincts, il en faut un par -`Dockerfile` : réutilisez l'image `influxdb` créée précédemment et créez le -dossier pour l'image `chronograf`. - -\vspace{1em} - -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 influxdb de la première partie est toujours lancé). - -```shell -docker run --rm --link YOUR_INFLUX_CNTR_NAME:influxdb chronograf -``` - -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 -machine nommée `influxdb` (indiqué par la partie du lien après les `:`). - - -### Visualiser les données dans `chronograf` - -Avant d'arrêter `telegraf` et nos conteneurs pour passer à une nouvelle étape, -prenez le temps d'afficher les données que vous avez collecté depuis le début -du TP. - -Après avoir ajouté le serveur (en remplaçant `localhost` proposé par défaut par -`influxdb` issue du *link*), ajouter deux visualisations avec les requêtes -suivantes : - -```sql -SELECT used, available, cached FROM mem WHERE tmpltime() -SELECT mean(usage_idle) FROM cpu WHERE tmpltime() GROUP BY time(20s), cpu -``` - +Compose +======= ## Automatiser la construction et le lancement diff --git a/tutorial/docker-orchestration/manual.md b/tutorial/docker-orchestration/manual.md new file mode 100644 index 0000000..6354d2a --- /dev/null +++ b/tutorial/docker-orchestration/manual.md @@ -0,0 +1,6 @@ +\newpage + +Lier des conteneurs entre-eux +============================= + +TODO diff --git a/tutorial/2/project.md b/tutorial/docker-orchestration/project.md similarity index 100% rename from tutorial/2/project.md rename to tutorial/docker-orchestration/project.md diff --git a/tutorial/docker-orchestration/setup.md b/tutorial/docker-orchestration/setup.md new file mode 100644 index 0000000..8974aa2 --- /dev/null +++ b/tutorial/docker-orchestration/setup.md @@ -0,0 +1,123 @@ +\newpage + +Mise en place +============= + +Durant le premier TP, nous avons installé l'environnement Docker principal, qui +inclut le client, le daemon et toute sa machinerie. Mais le projet Docker +propose de nombreuses autres ressources, souvent directement trouvée dans les +usages de la communauté, et parfois même approprié par Docker. + + +## `docker-machine` + +Pour ce TP, nous allons avoir besoin de `docker-machine`, installez-le sur +votre machine hôte, même si ce n'est pas un Linux : le but va être de lancer +plusieurs machines virtuelles Docker pour simuler un cluster. + +Ce programme permet de simplifier la gestion du multiples environnements +Docker, comme par exemple lorsque l'on souhaite gérer un cluster de machines +pour un projet. + +Ainsi, il est possible de provisionner et gérer des machines hôtes sur les +plates-formes de cloud habituelles. C'est également ce projet qui est à la base +de *Docker for Mac* et *Docker for Windows*, en permettant de lancer via, +respectivement, VirtualBox et Hyper-V, un environnement Linux prêt à être +utilisé avec Docker. + +### Par la distribution binaire + +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 +procédure suivante : + +```shell +curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-Linux-x86_64 \ + > /usr/bin/docker-machine +chmod +x /usr/bin/docker-machine +``` + +Si vous êtes dans un environnement différent, jetez un œil à +[la documentation d'installation](https://docs.docker.com/machine/install-machine/). + + +### Support de KVM + +Le programme support de base de nombreux environnement, dont VirtualBox et +Hyper-V. Bien d'autres environnements peuvent être supportés, au moyen de +plug-ins. + +Si vous utilisez KVM comme hyperviseur, vous allez avoir besoin d'installer le +plugins +[`docker-machine-kvm`](https://github.com/dhiltgen/docker-machine-kvm). Vous +n'aurez qu'à suivre les instructions du +[`README`](https://github.com/dhiltgen/docker-machine-kvm/blob/master/README.md) +! + + +### Vérification du fonctionnement + +Comme avec Docker, nous pouvons vérifier le bon fonctionnement de +`docker-machine` en exécutant la commande : + +``` +42sh$ docker-machine version +docker-machine version 0.12.2, build 9371605 +``` + + +## `docker-compose` + +Pour ce TP, nous allons également avoir besoin de `docker-compose`. + +Ce projet ne bénéficie pas d'une intégration au sein du projet Docker et doit +être téléchargé séparément, car originellement, le projet était développé par +une équipe indépendante[^fig]. Il constitue aujourd'hui une brique de +l'écosystème Docker, presque indispensable ! + +[^fig]: Le site du projet initial est toujours en ligne : + . + +### 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 + +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 : + +```shell +curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-Linux-x86_64 \ + > /usr/bin/docker-compose +chmod +x /usr/bin/docker-compose +``` + +### `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 + +Comme avec Docker, nous pouvons vérifier le bon fonctionnement de +`docker-compose` en exécutant la commande : + +``` +42sh$ docker-compose --version +docker-compose version: 1.16.1 +``` + +Si vous obtenez une réponse similaire, c'est que vous êtes prêt à commencer le +TP ! Alors n'attendons pas, partons à l'aventure ! + + +## Play With Docker + +Tout comme pour le TP précédent, si vous avez des difficultés pour réaliser les +exercices sur vos machines, vous pouvez utiliser le projet +[Play With Docker](https://play-with-docker.com/) qui vous donnera accès à un +bac à sable avec lequel vous pourrez réaliser tous les exercices de ce TP. diff --git a/tutorial/2/tutorial.md b/tutorial/docker-orchestration/tutorial.md similarity index 72% rename from tutorial/2/tutorial.md rename to tutorial/docker-orchestration/tutorial.md index 7332a2c..9cf41ce 100644 --- a/tutorial/2/tutorial.md +++ b/tutorial/docker-orchestration/tutorial.md @@ -3,13 +3,13 @@ title: Virtualisation légère -- TP n^o^ 2 subtitle: Aller plus loin avec Docker author: Pierre-Olivier *Nemunaire* Mercier institute: EPITA -date: Jeudi 15 septembre 2016 +date: Jeudi 19 octobre 2017 ... Durant ce deuxième TP, nous allons approfondir l'utilisation de Docker ! -Tous les éléments de ce TP (exercices et questions) sont à rendre à - au plus tard le jeudi 6 octobre 2016 à 8 h 42. Consultez la +Tous les éléments de ce TP (exercices et projet) sont à rendre à + au plus tard le jeudi 26 octobre 2017 à 8 h 42. Consultez la dernière section de chaque partie pour plus d'information sur les éléments à rendre. @@ -18,8 +18,6 @@ vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à [me](http://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire signer votre clef et n'hésitez pas à [faire signer votre clef](http://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/). -Vous pouvez utiliser l'adresse pour savoir si vous vous -y prenez correctement. \hypersetup{linkcolor=black} \tableofcontents diff --git a/tutorial/2/what.md b/tutorial/docker-orchestration/what.md similarity index 69% rename from tutorial/2/what.md rename to tutorial/docker-orchestration/what.md index da52ef1..f6e6d34 100644 --- a/tutorial/2/what.md +++ b/tutorial/docker-orchestration/what.md @@ -3,10 +3,12 @@ But du TP ========= -Aujourd'hui, nous allons réaliser un système de monitoring. +Aujourd'hui, nous allons réaliser un système de monitoring, prêt à +être déployé chez un fournisseur de cloud. Le résultat attendu d'ici la fin du TP, est un groupe de conteneurs -indépendants les uns des autres, réutilisables en fonction des besoins. +indépendants les uns des autres, réutilisables en fonction de besoins +génériques et pouvant facilement être mis à l'échelle. Nous collecterons les données d'utilisation de votre machine avec [Telegraf](https://www.influxdata.com/time-series-platform/telegraf/). Ces diff --git a/tutorial/dockerfiles/Makefile b/tutorial/dockerfiles/Makefile new file mode 100644 index 0000000..04828b3 --- /dev/null +++ b/tutorial/dockerfiles/Makefile @@ -0,0 +1,22 @@ +SOURCES = tutorial.md interactive.md dockerfile.md first.md supervisor.md goodpractices.md split.md entrypoint.md multistaged.md +PANDOCOPTS = --latex-engine=xelatex \ + --standalone \ + --normalize \ + --number-sections \ + --smart \ + -M lang=french \ + -M fontsize=12pt \ + -M papersize=a4paper \ + -M mainfont="Linux Libertine O" \ + -M monofont="FantasqueSansMono-Regular" \ + -M sansfont="Linux Biolinum O" \ + --include-in-header=../header.tex + + +all: tutorial.pdf + +tutorial.pdf: ${SOURCES} + pandoc ${PANDOCOPTS} -o $@ $+ + +clean:: + rm tutorial.pdf diff --git a/tutorial/2/chronograf_setup.png b/tutorial/dockerfiles/chronograf_setup.png similarity index 100% rename from tutorial/2/chronograf_setup.png rename to tutorial/dockerfiles/chronograf_setup.png diff --git a/tutorial/1/dockerfile.md b/tutorial/dockerfiles/dockerfile.md similarity index 98% rename from tutorial/1/dockerfile.md rename to tutorial/dockerfiles/dockerfile.md index d774c75..4bc1fc3 100644 --- a/tutorial/1/dockerfile.md +++ b/tutorial/dockerfiles/dockerfile.md @@ -3,7 +3,7 @@ `Dockerfile` ============ -## Mon premier conteneur ... par `Dockerfile` +## Ma première image ... par `Dockerfile` Pour construire une image, nous ne sommes pas obligés de passer par une série de commits. Docker dispose d'un mécanisme permettant d'automatiser la diff --git a/tutorial/2/entrypoint.md b/tutorial/dockerfiles/entrypoint.md similarity index 96% rename from tutorial/2/entrypoint.md rename to tutorial/dockerfiles/entrypoint.md index e5d5dc2..86c10b7 100644 --- a/tutorial/2/entrypoint.md +++ b/tutorial/dockerfiles/entrypoint.md @@ -1,6 +1,7 @@ \newpage -# Entrypoint +Entrypoint +========== Jusque là, à chaque redémarrage d'InfluxDB, il est nécessaire de reconfigurer Grafana pour lui indiquer la nouvelle IP du conteneur. En effet, le data diff --git a/tutorial/2/first.md b/tutorial/dockerfiles/first.md similarity index 73% rename from tutorial/2/first.md rename to tutorial/dockerfiles/first.md index d5f7850..26a4e83 100644 --- a/tutorial/2/first.md +++ b/tutorial/dockerfiles/first.md @@ -5,7 +5,7 @@ Premières étapes Dans un premier temps, nous allons créer une image Docker comme si l'on réalisait une installation sur une machine classique : en suivant une recette, -sans trop se préoccuper des fonctionnalitées que propose Docker. +sans trop se préoccuper des fonctionnalités que propose Docker. La machine (notre première image Docker) contiendra tout le nécessaire pour faire fonctionner notre service de monitoring. @@ -13,11 +13,15 @@ faire fonctionner notre service de monitoring. ## Les caches -Nous avons vu que chaque instruction de notre `Dockerfile` génère une -couche. Chaque couche sert de cache d'une construction d'image à -l'autre. Ainsi, lorsque vous modifiez une instruction dans votre `Dockerfile`, -les instructions précédentes ne sont pas réexécutées mais sont ressorties du -cache. +Nous avons vu que chaque instruction de notre `Dockerfile` est exécutée dans un +conteneur, qui génère ensuite une image intermédiaire. Cette image +intermédiaire sert ensuite d'image de base pour l'instruction suivante. + +Lorsque l'on lance la reconstruction du même `Dockerfile`, les images +intermédiaires sont utilisées comme un cache d'instructions, permettant ainsi +de gagner du temps sur les étapes qui n'ont pas changées. Ainsi, lorsque vous +modifiez une instruction dans votre `Dockerfile`, les instructions précédentes +ne sont pas réexécutées mais sont ressorties du cache. Le cache se base principalement sur le contenu de chaque instruction du `Dockerfile` (pour les `COPY` et `ADD`, il va aussi regarder la date de @@ -25,20 +29,22 @@ dernière modification de fichier à copier ou à ajouter). Donc tant qu'une instruction n'est pas modifiée dans le `Dockerfile`, le cache sera utilisé. Il est possible de ne pas utiliser le cache et de relancer toutes les étapes du -`Dockerfile` en ajoutant l'option `--no-cache` au moment du `docker build`. +`Dockerfile` en ajoutant l'option `--no-cache` au moment du `docker image +build`. -Les couches du cache peuvent être partagées entre plusieurs conteneur, -c'est ainsi que vous pouvez partager facilement une plus grosse partie -du système de fichiers. +Les couches du cache peuvent être partagées entre plusieurs conteneur, c'est +ainsi que vous pouvez partager facilement une plus grosse partie du système de +fichiers. Pour profiter du cache, on va placer de préférences les étapes les plus génériques (qui seraient les plus susceptibles d'apparaître dans d'autres images), en haut du `Dockerfile`. Commençons donc notre `Dockerfile` : choisissez une image de base pour remplir -votre `FROM`, et indiquez votre nom avec l'instruction `MAINTAINER` (pour -indiquez que c'est vous qui maintenez ce conteneur, si des utilisateurs ont besoin -de vous avertir pour le mettre à jour par exemple). +votre `FROM`, et indiquez votre nom avec l'instruction `LABEL maintainer` (pour +indiquer que c'est vous qui maintenez cette image, si des utilisateurs ont +besoin de vous avertir pour le mettre à jour ou s'ils rencontrent des +difficultés par exemple). ## `RUN` ou script ? @@ -46,10 +52,13 @@ de vous avertir pour le mettre à jour par exemple). ### InfluxDB Ensuite vient la suite d'instructions pour installer d'InfluxDB. Le paquet -n'est pas disponible dans les dépôts. La -[procédure décrite du site](https://docs.influxdata.com/influxdb/v1.0/introduction/installation/#ubuntu-debian) -incite à télécharger le paquet mis à disposition puis à l'installer via `dpkg --i`. +n'est pas disponible dans les dépôts[^debrepos]. La +[procédure décrite du site](https://portal.influxdata.com/downloads) incite à +télécharger le paquet mis à disposition puis à l'installer via `dpkg -i`. + +[^debrepos]: Le projet met à disposition des dépôts, si vous préférez cette + méthode, consultez la + [documentation d'installation](https://docs.influxdata.com/influxdb/v1.3/introduction/installation/#ubuntu-debian). Deux solutions s'offrent à nous : diff --git a/tutorial/2/goodpractices.md b/tutorial/dockerfiles/goodpractices.md similarity index 100% rename from tutorial/2/goodpractices.md rename to tutorial/dockerfiles/goodpractices.md diff --git a/tutorial/dockerfiles/interactive.md b/tutorial/dockerfiles/interactive.md new file mode 100644 index 0000000..ab79a1b --- /dev/null +++ b/tutorial/dockerfiles/interactive.md @@ -0,0 +1,59 @@ +\newpage + +Modification interactive +======================== + +Nous voilà maintenant dans le conteneur ! Il est assez épuré, il n'y a rien de +superflu : même pas d'éditeur de texte : ni vim, ni emacs, même pas `vi` ! + +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 +pas inclues dans le conteneur. + +``` +apt-get update +``` + +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ésent de +base, mais plutôt de contacter le mainteneur de l'image pour qu'il la mette à +jour. + +Installons maintenant un programme : + +``` +apt-get install nano +``` + +En attendant la fin de l'installation, jetons un œil à la commande dans un +autre terminal : + +``` +docker container ls +``` + +Cette commande liste les conteneurs actifs. Notez le *Container ID* ainsi que +le *NAMES* du conteneur du conteneur actuellement en cours d'installation de +`nano`. + +Lorsque l'installation de `nano` est terminée, quittez l'image en tapant +`exit`. + +Sauvegardez votre image modifiée avec la commande `commit` pour pouvoir +commencer directement de votre image avec `nano` : + +``` +docker container commit CONTAINER my_nano +``` + +En remplaçant `CONTAINER` par le nom ou l'identifiant de votre +container. `my_nano` est le nom que vous voudrez utiliser à la place +d'`ubuntu` : + +``` +docker container run -it my_nano /bin/bash +``` + +Vous constatez cette fois que vous pouvez lancer `nano`, alors que vous ne +pouvez toujours pas le faire dans un conteneur issue d'une image `ubuntu` ! diff --git a/tutorial/dockerfiles/multistaged.md b/tutorial/dockerfiles/multistaged.md new file mode 100644 index 0000000..55d144e --- /dev/null +++ b/tutorial/dockerfiles/multistaged.md @@ -0,0 +1,6 @@ +\newpage + +Multi-stage build +================= + +TODO diff --git a/tutorial/dockerfiles/split.md b/tutorial/dockerfiles/split.md new file mode 100644 index 0000000..7bbf93c --- /dev/null +++ b/tutorial/dockerfiles/split.md @@ -0,0 +1,54 @@ +\newpage + +Une application par conteneur +============================= + +Avec notre conteneur utilisant `supervisor`, nous ne respectons pas +cette dernière bonne pratique d'un seul processus par conteneur :-( + +L'intérêt est de permettre à chaque conteneur d'effectuer une tâche +simple et générique, de manière à pouvoir être réutilisé pour d'autres +projets dans le futur. Par exemple, notre conteneur InfluxDB pourra +être utilisé pour stocker des relevés de métriques d'autres systèmes +ou des logs. Chronograf peut être connecté à d'autres serveurs afin +de corréler les métriques, ... + + +## Séparer le `Dockerfile` + +Commençons par séparer notre `Dockerfile` en deux : dans une partie +nous allons garder la partie InfluxDB, de l'autre la partie Chronograf. + +Il va vous falloir créer deux dossiers distincts, il en faut un par +`Dockerfile` : réutilisez l'image `influxdb` créée précédemment et créez le +dossier pour l'image `chronograf`. + +\vspace{1em} + +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 influxdb de la première partie est toujours lancé). + +```shell +docker run --rm --link YOUR_INFLUX_CNTR_NAME:influxdb chronograf +``` + +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 +machine nommée `influxdb` (indiqué par la partie du lien après les `:`). + + +### Visualiser les données dans `chronograf` + +Avant d'arrêter `telegraf` et nos conteneurs pour passer à une nouvelle étape, +prenez le temps d'afficher les données que vous avez collecté depuis le début +du TP. + +Après avoir ajouté le serveur (en remplaçant `localhost` proposé par défaut par +`influxdb` issue du *link*), ajouter deux visualisations avec les requêtes +suivantes : + +```sql +SELECT used, available, cached FROM mem WHERE tmpltime() +SELECT mean(usage_idle) FROM cpu WHERE tmpltime() GROUP BY time(20s), cpu +``` diff --git a/tutorial/2/supervisor.md b/tutorial/dockerfiles/supervisor.md similarity index 99% rename from tutorial/2/supervisor.md rename to tutorial/dockerfiles/supervisor.md index dd2b0a4..f22cad8 100644 --- a/tutorial/2/supervisor.md +++ b/tutorial/dockerfiles/supervisor.md @@ -79,6 +79,9 @@ cela. Mais plein de gens ont cette problématique et l'application `supervisor` répond parfaitement à notre problématique ! +## `HEALTHCHECK` + + ## `supervisor` Première étape : installer `supervisor`, le paquet se trouve dans les dépôts. diff --git a/tutorial/dockerfiles/tutorial.md b/tutorial/dockerfiles/tutorial.md new file mode 100644 index 0000000..7e43d3e --- /dev/null +++ b/tutorial/dockerfiles/tutorial.md @@ -0,0 +1,23 @@ +--- +title: Virtualisation légère -- TP n^o^ 3 +subtitle: Construire des images Docker +author: Pierre-Olivier *Nemunaire* Mercier +institute: EPITA +date: Jeudi 11 octobre 2018 +... + +Durant ce troisième TP, nous allons voir comment créer nos propres images ! + +Tous les éléments de ce TP (exercices et projet) sont à rendre à + au plus tard le jeudi 18 octobre 2018 à 8 h 42. Consultez la +dernière section de chaque partie pour plus d'information sur les éléments à +rendre. + +En tant que personnes sensibilisées à la sécurité des échanges électroniques, +vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à +[me](http://pgp.mit.edu/pks/lookup?op=vindex&search=0x842807A84573CC96) faire +signer votre clef et n'hésitez pas à +[faire signer votre clef](http://www.meetup.com/fr/Paris-certification-de-cles-PGP-et-CAcert/). + +\hypersetup{linkcolor=black} +\tableofcontents