diff --git a/tutorial/2/chronograf.png b/tutorial/2/chronograf.png new file mode 100644 index 0000000..4400901 Binary files /dev/null and b/tutorial/2/chronograf.png differ diff --git a/tutorial/2/chronograf_setup.png b/tutorial/2/chronograf_setup.png new file mode 100644 index 0000000..25d005a Binary files /dev/null and b/tutorial/2/chronograf_setup.png differ diff --git a/tutorial/2/compose.md b/tutorial/2/compose.md index 582f76e..ec4540d 100644 --- a/tutorial/2/compose.md +++ b/tutorial/2/compose.md @@ -10,21 +10,52 @@ L'intérêt est de permettre à chaque conteneur d'effectuer une tâche 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 systèmes ou des logs. -Grafana peut également afficher davantage d'informations ou combiner -les informations de plusieurs bases distinctes. +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 Grafana. +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`. +`Dockerfile` : réutilisez l'image `influxdb` créée précédemment et créez le +dossier pour l'image `chronograf`. Profitez en pour rajouter les Data Volume Container, si vous ne l'avez pas fait dans la partie précédente ! +\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é). + +``` +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 `influxdb` (la partie 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 : + +``` +SELECT used, available, cached FROM mem WHERE tmpltime() +SELECT mean(usage_idle) FROM cpu WHERE tmpltime() GROUP BY time(20s), cpu +``` + ## Automatiser la construction et le lancement @@ -37,33 +68,50 @@ conteneurs, définissez à la racine de votre projet un fichier les paramètres d'exécution. ``` -influxdb: - ... -grafana: - build: grafana/ - image: nginx - ports: - - "3000:3000" - volumes: - - ./:/tmp/toto - links: - - influxdb +version: '2' +services: + influxdb: + ... + chronograf: + build: grafana/ + image: nginx + ports: + - "3000:3000" + volumes: + - ./:/tmp/toto + links: + - influxdb ``` Ce fichier est un condensé des options que vous passez habituellement au `docker run`. L'exemple ci-dessus est à adapter largement, consultez - pour une liste exhaustive des + pour une liste exhaustive des options que vous pouvez utiliser. +Notez 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 +docker-compose qui sera utilisé. Sans indication de version, la version +originale sera utilisée. + Une fois que votre `docker-compose.yml` sera prêt, lancez tout d'abord `docker-compose build` pour commencer la phase de build de tous les conteneurs listés dans le fichier. -Une fois le build terminé, vous pouvez lancer la commande suivante pour admirer le résultat : +Une fois le build terminé, vous pouvez lancer la commande suivante et admirer +le résultat : ``` docker-compose up ``` + +Encore une fois, testez la bonne connexion entre chronograf (accessible sur +) et influxdb. + + +## Rendu + +Pour cette partie, vous devrez rendre la dernière itération de votre +`docker-compose.yml`. diff --git a/tutorial/2/first.md b/tutorial/2/first.md index 83c48c9..c86257c 100644 --- a/tutorial/2/first.md +++ b/tutorial/2/first.md @@ -1,12 +1,12 @@ \newpage -# Premiers pas +Premières étapes +================ Dans un premier temps, nous allons créer une image Docker comme si l'on -réalisait l'installation sur une machine classique : en suivant les méthodes -habituelles, mais tout en écrivant notre recette dans le `Dockerfile`. La -machine (notre première image Docker) contiendra tout le nécessaire pour faire -fonctionner notre service. +réalisait une installation sur une machine classique : en suivant une +recette. La machine (notre première image Docker) contiendra tout le nécessaire +pour faire fonctionner notre service. ## Les caches @@ -25,10 +25,9 @@ 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`. -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 (afin de profiter du cache du système de fichiers au moment de -l'exécution du conteneur). +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. \vspace{1.5em} @@ -36,10 +35,10 @@ Pour profiter du cache, il faut donc placer les étapes les plus génériques (q seraient susceptibles d'apparaître dans plusieurs conteneur), en haut du `Dockerfile`. -Commençons donc notre `Dockerfile` : choisissez une image de base pour votre -`FROM`, et indiquez votre nom avec l'instruction `MAINTAINER`, pour indiquez -que c'est vous qui maintenez ce conteneur (si d'autres gens ont besoin qu'il -faut le mettre à jour par exemple). +Commençons donc notre `Dockerfile` : choisissez une image de base pour +votre `FROM`, et indiquez votre nom avec l'instruction `MAINTAINER`, +pour indiquez que c'est vous qui maintenez ce conteneur (si d'autres +gens ont besoin de vous avertir pour le mettre à jour par exemple). ## `RUN` ou script ? @@ -48,20 +47,24 @@ faut le mettre à jour par exemple). Ensuite vient l'installation d'InfluxDB. Le paquet n'est pas disponible dans les dépôts. La -[procédure décrite sur le site](https://influxdb.com/docs/v0.9/introduction/installation.html) -incite à télécharger le paquet mis à disposition puis à l'installer via `dpkg --i`. +[https://docs.influxdata.com/influxdb/v1.0/introduction/installation/#ubuntu-debian](procédure +décrite sur le site) incite à télécharger le paquet mis à disposition puis à +l'installer via `dpkg -i`. -Deux solutions s'offrent à nous : télécharger le paquet hors du conteneur, le -copier, puis l'installer. Ou faire un `RUN` avec toutes ces opérations (sans -oublier l'installation de `wget`/`curl`). +Deux solutions s'offrent à nous : + +* télécharger le paquet hors du conteneur, le copier, puis l'installer. +* faire un `RUN` avec toutes ces opérations (sans oublier l'installation + préalable de `wget`/`curl`). La copie étant définitive (supprimer le fichier ne le supprimera pas des -couches où il a pu exister), donc la seconde solution semble préférable (mais -`wget` restera en déchet). +couches où il a pu exister), on préférera la seconde méthode, malgré que `wget` +restera en déchet. La première méthode aura plus sa place dans un dépôt où les +binaires auront été préalablement compilés, il ne restera plus qu'à les copier +dans le conteneur au bon emplacement. -Écrivez une commande `RUN` qui va télécharger la dernière version d'InfluxDB, -qui va l'installer et supprimer le fichier. +Écrivons une commande `RUN` qui va télécharger la dernière version +d'InfluxDB, qui va l'installer et supprimer le fichier. \vspace{1em} @@ -69,17 +72,46 @@ qui va l'installer et supprimer le fichier. bien utilisable : `EXPOSE`, `CMD`, ... Il est possible que vous ayez à écraser le fichier de configuration via un -`COPY` (ou de manière plus maline en utilisant `--volume` au moment du `docker -run`, cela fonctionne pas qu'avec les dossiers). Garder la ligne qui vous -permet de lancer votre serveur web dans un coin, en attendant la partie -suivante. +`COPY` (ou de manière plus maligne en utilisant `--volume` au moment du `docker +run`, cela fonctionne pas qu'avec les dossiers). Ou peut-être ferez-vous un +`ENTRYPOINT` ? -### Grafana +### Telegraf -Une fois InfluxDB configuré, nous allons avoir la même réflexion avec Grafana. +Telegraf est un programme qui permet de collecter des métriques systèmes. Il +travaille de paire avec InfluxDB pour stocker les valeurs. -De la même manière, téléchargez, installez et supprimez le paquet. +Vous pouvez monitorer les métriques de n'importe quelle machine, simplement en +installant *Telegraf* et en lui indiquant l'emplacement de son serveur +InfluxDB. Nous allons installer *telegraf* sur notre machine à l'aide de la +[https://docs.influxdata.com/telegraf/v1.0/introduction/installation/](documentation). -Lors de vos tests, sachez que vous pouvez vous connecter sur grafana avec -l'utilisateur *admin*, mot de passe *admin*. +Ces quelques lignes devraient suffir à lancer la collecte, à condition que +votre InfluxDB écoute sur le port 8086 local : + +```bash +TELEGRAF_VERSION=1.0.0 +wget https://dl.influxdata.com/telegraf/releases/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 +``` + +Rendez-vous ensuite dans [http://localhost:8083/](l'interface d'InfluxDB) pour +voir si la collecte se passe bien. + +Dans l'interface sélectionnez la base *telegraf* puis explorez les valeurs : + +```sql +SHOW MEASUREMENTS +SHOW FIELD KEYS +SELECT usage_idle FROM cpu WHERE cpu = 'cpu-total' ORDER BY time DESC LIMIT 5 +``` + +Laissons tourner `telegraf` afin de constituer un petit historique de valeurs. + + +## Rendu + +Avant de passer à la suite, placez votre `Dockerfile` dans un dossier +`influxdb` (pour le moment il ne contient rien d'autre !). diff --git a/tutorial/2/goodpractices.md b/tutorial/2/goodpractices.md index cf6e1a1..e7bd87d 100644 --- a/tutorial/2/goodpractices.md +++ b/tutorial/2/goodpractices.md @@ -1,6 +1,7 @@ \newpage -# Retour sur les bonnes pratiques +Retour sur les bonnes pratiques +=============================== Pour chacune des bonnes pratiques ci-dessous, vérifiez que vous les respectez bien, faites les modifications nécessaires. @@ -39,9 +40,7 @@ En plus, cela réduira le temps de build et la taille des images produites ! Vous devez trouver l'équilibre idéal entre la lisibilité de votre `Dockerfile` (qui assure la maintenabilité sur le long-terme) et le nombre de couches -créées. Le nombre de couches idéal devrait être égal au nombre de branches -distincte partant d'une image de base, afin d'utiliser au mieux le cache du -système de fichiers. +créées. ## Ordonnez vos lignes de commandes complexes @@ -105,7 +104,7 @@ Il y a un certain nombre de règles à connaître pour bien utiliser ce mécanis ## Concevez des conteneur éphémères -Les conteneurs que vous générez doivent aussi éphémères que possible : ils +Les conteneurs que vous générez doivent être aussi éphémères que possible : ils devraient pouvoir être arrêtés, détruits et recréés sans nécessiter d'étape de reconfiguration. La configuration devrait se faire au lancement du conteneur ou lors de sa construction. diff --git a/tutorial/2/installation.md b/tutorial/2/installation.md index 81f9d06..17cb977 100644 --- a/tutorial/2/installation.md +++ b/tutorial/2/installation.md @@ -2,17 +2,62 @@ # Installation +## Docker + +Ce TP requiert la dernière version de Docker (1.12). Commencez par vérifier que +vous avez bien cette version : + +``` +42sh$ docker version +Client: + Version: 1.12.1 + API version: 1.24 + Go version: go1.7 + Git commit: 23cf638 + Built: + OS/Arch: linux/amd64 + +Server: + Version: 1.12.1 + API version: 1.24 + Go version: go1.7 + Git commit: 23cf638 + Built: + OS/Arch: linux/amd64 +``` + +Si vous n'avez pas une version assez récente, consultez le premier TP pour +savoir comment installer Docker. + + ## `docker-compose` -L'équipe en charge de Docker compose met à disposition un binaire contenant +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. 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 : ``` -curl -L https://github.com/docker/compose/releases/download/1.3.3/docker-compose-Linux-x86_64 \ +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. @@ -25,7 +70,7 @@ Comme avec Docker, nous pouvons vérifier le bon fonctionnement de ``` 42sh$ docker-compose --version -docker-compose version: 1.3.3 +docker-compose version: 1.8.0 ``` Si vous obtenez une réponse similaire, c'est que vous êtes prêt à commencer le diff --git a/tutorial/2/project.md b/tutorial/2/project.md index e91ab97..4b64926 100644 --- a/tutorial/2/project.md +++ b/tutorial/2/project.md @@ -1,73 +1,50 @@ \newpage -# Rendu - -## Avis - -Dans le courriel que vous enverrez, je serais ravi de connaître votre avis sur -ce cours : aussi bien les choses que vous avez apprécié que celles que vous -n'avez pas aimés. - -Cela ne rentrera pas en compte dans la notation, mais permettra d'améliorer ce -cours. - - -## TP - -Rendez le contenu de votre dossier à la dernière étape du TP : avec le -`docker-compose.yml`, ainsi que vos `Dockerfile` et les éventuels fichiers -annexes. - +Rendu +===== ## Projet -De la même manière que nous avons réaliser un groupe de conteneurs utilisant -`grafana` et `InfluxDB`, qui permet d'afficher facilement des métriques sous -forme de graphiques, vous allez réaliser, à l'aide des images Docker présentent -sur le hub, une interface web de recherche et de visualisation de logs, -utilisant -[Kibana](https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04). +Amusez-vous à la piscine, il n'y a pas de projet en plus des exercices fait en +TP ! -Toutes la chaîne d'image Docker est déjà présente sur le hub : -[logstash](https://hub.docker.com/_/logstash/), -[elasticsearch](https://hub.docker.com/_/kibana/), -[kibana](https://hub.docker.com/_/kibana/). +En complément de ce TP, vous pouvez jetez un œil à +[https://docs.docker.com/engine/swarm](Docker Swarm) ! -Le but du projet est donc de réaliser un `docker-compose.yml` permettant -d'avoir un système de centralisation de logs fonctionnels. Vous aurez sans -doute à faire quelques adaptations au niveau des images Docker, au moins pour -des fichiers de configuration, donc il n'y aura sans doute pas que ce fichier à -rendre. -Vous pouvez utiliser comme source de logs les conteneurs du TP, grâce aux -options `log-driver=gelf` et `log-opt=gelf-address=udp://host:port`, passées -aux `docker run` (ou dans le `docker-compose`). +## Modalité de rendu -Côté `logstash`, votre configuration devrait ressembler à ça : +Un service automatique s'occupe de réceptionner vos rendus, de faire les +vérifications nécessaires et de vous envoyer un accusé de réception (ou de +rejet). + +Ce service écoute sur l'adresse , c'est donc à cette adresse +et exclusivement à celle-ci que vous devez envoyer vos rendus. Tout rendu +envoyé à une autre adresse et/ou non signé ne sera pas pris en compte. + + +## Tarball + +Tous les fichiers identifiés comme étant à rendre pour ce TP sont à +placer dans une tarball (pas d'archive ZIP, RAR, ...). + +Les réponses aux questions sont à regrouper dans un fichier `questions.txt` à +placer à la racine de votre rendu. + +Voici une arborescence type: ``` -input { - tcp { - port => 4242 - } - udp { - port => 4242 - } -} - -output { - elasticsearch { } -} +login_x-TP2/questions.txt +login_x-TP2/docker-compose.yml +login_x-TP2/influxdb +login_x-TP2/influxdb/Dockerfile +login_x-TP2/influxdb/influxdb.conf +login_x-TP2/chronograf +login_x-TP2/chronograf/Dockerfile +login_x-TP2/chronograf/chronograf.conf +login_x-TP2/mymonitoring +login_x-TP2/mymonitoring/Dockerfile +login_x-TP2/mymonitoring/chronograf.conf +login_x-TP2/mymonitoring/influxdb.conf +login_x-TP2/mymonitoring/supervisor.conf ``` - -Vous pourrez ainsi envoyez les logs de Docker sur le port 4242. Ou directement -vos logs syslog : - -``` -netcat localhost 4242 < /var/log/syslog -``` - -N'oubliez pas de lire les README associés aux images Docker du hub, ils vous -indiqueront comment utiliser les images et comment leur passer des paramètres. - -Bon courage ! diff --git a/tutorial/2/supervisor.md b/tutorial/2/supervisor.md index 2dc13bc..d628ba0 100644 --- a/tutorial/2/supervisor.md +++ b/tutorial/2/supervisor.md @@ -1,15 +1,56 @@ \newpage -# Plusieurs daemons dans un conteneur +Plusieurs daemons dans un conteneur +=================================== + +Notre système de monitoring commence enfin à ressembler à quelque chose. Mais +ce serait tellement plus pratique de voir tous ces tableaux de nombres sous +forme de graphiques ! + +Nous allons pour cela ajouter `chronograf` dans notre conteneur. + +Avant de modifier votre `Dockerfile`, créez un nouveau dossier de rendu : +`mymonitoring`, dans lequel vous recopierez l'état actuel de notre image +`influxdb`. + + +## Chronograf + +Commençons par compléter la commande d'installation existante pour `influxdb`, +afin d'installer simultanément `chronograf`. + +La documentation de la procédure est disponible +[https://docs.influxdata.com/chronograf/v1.0/introduction/installation/](à +cette adresse). + ## Script d'init Lors du dernier TP, nous avons vu que les conteneurs étaient détruits dès que le premier processus du conteneur (celui qui a le PID 1, à la place d'`init`) -terminer son exécution, quelque soit le statut de ses éventuels fils. +terminait son exécution, quelque soit le statut de ses éventuels fils. -Pour lancer tous nos daemon, nous allons donc besoin d'écrire un script qui -lance puis attend que les deux deamons aient terminés de s'exécuter +Pour lancer tous nos daemons, nous avons donc besoin d'écrire un script qui +lance puis attend que les deux deamons aient terminés de s'exécuter. + +Écrivons ce script. Hints : `wait(1)`. + +\vspace{1em} + +Pour vérifier que votre conteneur fonctionne correctement, vous pouvez le +lancer : + +``` +docker run --rm -p 10000:10000 mymonitoring +``` + +Puis accéder à chronograf : . Donnez un nom à votre +configuration, puis cliquez sur *Add*. Les paramètres préremplis dans le +formulaire sont corrects. + +Vous devriez obtenir l'écran suivant (notez la partie `Status: Online, v1.0.0`) : + +![Chronograf configuré](chronograf_setup.png) ## Autorestart @@ -45,14 +86,16 @@ Première étape : installer `supervisor`, le paquet se trouve dans les dépôts L'étape suivante consiste à remplir puis copier le fichier de configuration dans le conteneur. Vous allez devoir écraser dans votre conteneur le fichier -`/etc/supervisord.conf` pour démarrer à la fois `grafana` et `influxdb`. +`/etc/supervisord.conf` pour démarrer à la fois `chronograf` et `influxdb`. Vous pouvez vous aider de la documentation disponible à : -## C'est parti ! +La même procédure de test que précédemment peut être suivie. -Votre conteneur doit maintenant être parfaitement fonctionnel : vous devriez -pouvoir lancer votre script de monitoring et voir apparaître vos données dans -Grafana ! + +## Rendu + +Nous ne toucherons plus à cette image, placez-la dans un dossier +`mymonitoring`. diff --git a/tutorial/2/tutorial.md b/tutorial/2/tutorial.md index 7503130..7332a2c 100644 --- a/tutorial/2/tutorial.md +++ b/tutorial/2/tutorial.md @@ -1,20 +1,25 @@ -% Virtualisation légère -- TP n^o^3 -% Pierre-Olivier *Nemunaire* Mercier -% Jeudi 29 octobre 2015 +--- +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 +... -Durant ce troisième TP, nous allons approfondir l'utilisation de Docker ! +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 12 novembre 2015 à 23 h 42. Consultez la + au plus tard le jeudi 6 octobre 2016 à 8 h 42. Consultez la dernière section de chaque partie pour plus d'information sur les éléments à -rendre. Vous pouvez placer les réponses aux questions dans le corps du courriel -ou dans un fichier joint. +rendre. En tant que personnes sensibilisées à la sécurité des échanges électroniques, -vous devriez m'envoyer vos rendus signés avec votre clef PGP. Pensez à +vous devrez m'envoyer vos rendus signés avec votre clef PGP. Pensez à [me](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/2/what.md index 628e55a..7a37556 100644 --- a/tutorial/2/what.md +++ b/tutorial/2/what.md @@ -1,11 +1,16 @@ -# But du TP +But du TP +========= -Aujourd'hui, nous allons terminer notre système de monitoring commencé lors du -premier TP. +Aujourd'hui, nous allons réaliser un système de monitoring. 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. -Les données collectées seront envoyés vers -[InfluxDB](https://influxdb.com/), puis elles seront affichées sous -forme de graphique dans [Grafana](http://grafana.org/). +Nous collecterons les données d'utilisation de votre machine avec +[https://www.influxdata.com/time-series-platform/telegraf/](Telegraf). Ces +données seront envoyés vers +[https://www.influxdata.com/time-series-platform/influxdb/](InfluxDB), puis +elles seront affichées sous forme de graphique dans +[https://www.influxdata.com/time-series-platform/chronograf/](Chronograf). + +![Dashboard de l'utilisation CPU et mémoire sur Chronograf](chronograf.png)