Rework and complete linking part

This commit is contained in:
nemunaire 2018-10-04 05:47:52 +02:00
parent fdb090a4bf
commit 0c51c5d6cf

View File

@ -3,9 +3,29 @@
Lier les conteneurs Lier les conteneurs
=================== ===================
Partager des fichiers est une chose, mais ce n'est pas une manière d'échanger Lorsque l'on gère des services un peu plus complexes qu'un simple gestionnaire
de l'information instantanément : les sockets et le réseau restent plus adaptés d'images, on a souvent besoin de faire communiquer plusieurs services
à ce genre d'échanges. entre-eux.
Notre premier service, `youp0m`, utilisais le système de fichiers pour stocker
ses données, mais la plupart des applications réclament un serveur de base de
données.
Les bonnes pratiques nous dictent de ne pas placer plus d'un service par
conteneur : en effet, on peut vouloir mettre à jour l'applicatif sans pour
autant redémarrer sa base de données, etc. Nous allons donc voir dans cette
partie comment lier deux conteneurs.
## Mise en place du webservice
Nous allons utiliser l'interface d'administration des serveurs du FIC :
[`nemunaire/fic-admin`](https://hub.docker.com/r/nemunaire/fic-admin/).
En lançant le conteneur avec les mêmes options que `youp0m`, les journaux
indiquent que le service cherche à se connecter à une base de données. Il va
donc falloir lier notre interface d'administration à un conteneur MariaDB.
## Les pilotes réseau ## Les pilotes réseau
@ -51,7 +71,7 @@ directement accessible, sans avoir à utiliser l'option `-p` du `run`.
### Créer un nouveau réseau `bridge` ### Créer un nouveau réseau `bridge`
Afin de contrôler quels échanges peuvent être réalisé entre les conteneurs, il Afin de contrôler quels échanges peuvent être réalisés entre les conteneurs, il
est recommandé de créer des réseaux utilisateur. 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
@ -59,7 +79,7 @@ relatives aux objets Docker `network` :
<div lang="en-US"> <div lang="en-US">
``` ```
docker network create --driver bridge my_network docker network create --driver bridge my_fic
``` ```
</div> </div>
@ -73,66 +93,43 @@ docker network connect NETWORK CONTAINER
``` ```
</div> </div>
Lorsque plusieurs conteneurs ont rejoints un réseau utilisateur, ils peuvent Lorsque plusieurs conteneurs ont rejoint 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
nom de conteneur. nom de conteneur.
### Exercice ## Exercice
Lancez votre serveur web avec : À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base
de données.
Ne vous embêtez pas avec les mots de passes des services, initialisez la base
de données avec le nom d'utilisateur et le mot de passe par défaut. Vous les
obtiendrez en lisant l'aide :
<div lang="en-US"> <div lang="en-US">
``` ```
docker container run --name helloapp -d my_webserver docker container run --rm -e MYSQL_HOST="tcp(mysql_cntr_name:3306)" nemunaire/fic-admin -help
``` ```
</div> </div>
Puis créez un réseau utilisateur, rejoignez-le et lancez un conteneur dans le Notez la définition de la variable d'environnement `MYSQL_HOST`[^12factors],
même réseau utilisateur. Vous devriez être capable de lancer dans ce conteneur celle-ci indique le nom du serveur vers lequel le service doit se connecter.
les commandes :
[^12factors]: Lecture intéressante : <https://12factor.net/>
Vous aurez besoin de créer un volume pour stocker la base de données, un réseau
dans lequel vous connecterez la base de données et le conteneur applicatif.
Vous devriez pouvoir déboguer le réseau, au sein d'un conteneur, par exemple en
utilisant :
<div lang="en-US"> <div lang="en-US">
``` ```
ping helloapp 42sh$ docker container exec -it ficadmin_cntr_name /bin/bash
curl http://helloapp/ (incntnr)# ping mysql_cntr_name
``` ```
</div> </div>
Une fois le service `fic-admin` lancé, vous pouvez exposer le port 8081, sur
## Liaison à l'ancienne lequel vous devriez voir l'interface d'admin : <http://localhost:8081/>.
Les réseaux utilisateurs sont la manière à privilégier lorsque l'on souhaite
que deux conteneurs puissent discuter entre-eux.
Avant que cela n'existe, une fonctionnalité de liaison existait. Moins
puissante que les réseaux et plus contraignante car elle nécessite de gérer
l'ordre dans lequel les conteneurs sont lancés, elle permet néanmoins de
partager en plus les variables d'environnements du conteneur lié.
Par exemple, pour lancer un conteneur `postgresql`, il faut lui préciser au
moins le mot de passe à utiliser via la variable d'environnement
`POSTGRES_PASSWORD`[^storepostgres] :
[^storepostgres]: l'ensemble des variables que peut prendre le conteneur est
disponible sur la page dédiée à l'image sur le *store* :
<https://store.docker.com/images/postgres>
<div lang="en-US">
```
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
d'environnement. Cela évite d'avoir à recopier le mot de passe pour lancer un
conteneur qui en dépendrait. Comme par exemple dans le cas d'un serveur web qui
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
données :
<div lang="en-US">
```
docker run -it --rm --link some-postgres:postgres postgres psql -h postgres -U postgres
```
</div>