\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
Owncloud et MySQL.


## 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 :
[InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/).
En effet, tous les autres conteneurs on besoin de cette base de données pour
fonctionner correctement : il serait impossible à *Chronograf* d'afficher les
données sans base de données, tout comme *Telegraf* ne pourrait écrire les
métriques dans une base de données à l'arrêt.

Afin d'interagir avec les données, InfluxDB expose une
[API REST](https://fr.wikipedia.org/wiki/Representational_state_transfer)
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 :

<div lang="en-US">
```
    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
notre base de données en appelant :

<div lang="en-US">
```
    42sh$ curl -f http://localhost:8086/ping
    42sh$ echo $?
    0
```
</div>

Si votre influxdb répond, vous pouvez vous y connecter en utilisant directement
le client fourni :

<div lang="en-US">
```
    42sh$ docker container run --rm -it --link mytsdb:influxdb \
        --entrypoint "/usr/bin/influx" influxdb -host influxdb
    Connected to http://influxdb:8086 version 1.6.3
	InfluxDB shell version: 1.6.3
	> show databases
    name: databases
    name
    ---------------
    _internal
```
</div>

Si vous aussi vous voyez la table `_internal`, bravo ! vous pouvez passer à la
suite.

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
faut utiliser la commande `docker container logs` :

<div lang="en-US">
```
    docker container logs mytsdb
```
</div>


\hspace{2em}**Exercice :** Ajoutez à la ligne de commande de lancement du
conteneur les bon(s) volume(s) qui permettront de ne pas perdre les données
d'influxDB si nous devions redémarrer le conteneur.



## 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* :

<div lang="en-US">
```shell
    curl https://dl.influxdata.com/telegraf/releases/telegraf-1.8.1-static_linux_amd64.tar.gz | \
    tar xzv -C /tmp
```
</div>

Puis, lançons *Telegraf* :

<div lang="en-US">
```shell
    cd /tmp/telegraf
    ./telegraf --config telegraf.conf
```
</div>

**Remarque :** La configuration par défaut va collecter les données de la
machine locale et les envoyer sur le serveur situé à
`http://localhost:8086`. Ici, cela fonctionne parce que l'on a fait en sorte de
rediriger le port de notre conteneur sur notre machine locale (option `-p`).

Et observons ensuite :

<div lang="en-US">
```shell
    42sh$ docker container run --rm -it --link mytsdb:influxdb \
        --entrypoint "/usr/bin/influx" influxdb -host influxdb
    Connected to http://influxdb:8086 version 1.6.3
    InfluxDB shell version: 1.6.3
    > show databases
    name: databases
    name
    ---------------
    _internal
    telegraf

    > use telegraf
    Using database telegraf

    > show measurements
    name: measurements
    name
    ------------------
    cpu
    disk
    diskio
    kernel
    mem
    processes
    swap
    system
```
</div>

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.


## Afficher les données collectées

\hspace{2em}**Exercice :** À vous de jouer pour lancer le conteneur
[*Chronograf*](https://store.docker.com/images/chronograf).

L'interface de *Chronograf* est disponible sur le port 8888.

Consultez la [documentation du conteneur](https://hub.docker.com/_/chronograf)
si besoin.


![Résultat obtenu](chronograf_latest.png)
