Le Blog de C-quad

Docker – Les images et comment faire communiquer deux conteneurs

Nous avons vu comment utiliser les conteneurs dans docker dans l’article « Docker – une petite révolution pour moi », nous allons maintenant voir comment gérer les images qui servent à construire notre conteneur.

Voir les images présentes en local

Dès que l’on crée un conteneur à partir d’une image, celle ci est stockée en local et peut être ré-utilisée. Pour voir la liste des images disponibles en local :

$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
training/webapp             latest              31fa814ba25a        3 months ago        278.6 MB

Si l’on désire télécharger une image :

$ docker pull centos

Créer ses propres images

Pour créer ses propres images, deux solutions sont possibles :

  • Partir d’une conteneur existant
  • Créer un Dockerfile

En partant d’un conteneur existant :

$ docker run -i -t centos /bin/bash
bash-4.2# yum install mysql
bash-4.2# exit
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
1c97b8bd7df9        centos:centos7      "/bin/bash"         5 minutes ago       Exited (0) 8 seconds ago                     drunk_perlman 
$ docker commit -m "Ajout de mysql" -a="Cedric OLIVIER" 1c97b8bd7df9 cquad/centos:mysql
64b17daafd4bfbf2f4af84efbb2d551c4565470a1c4e6d0150af6deb8d4735da

En partant d’un DockerFile :

Il s’agit dans ce cas de créer un fichier qui décrit ce que l’on veut et l’on construit ensuite le conteneur à partir de ce fichier.
Dans notre cas cela donne le Dockerfile suivant :

# Fichier Dockerfile à partir de l'image Centos, on ajoute mysql
FROM centos
MAINTAINER Cédric OLIVIER <mail@exemple.com>
RUN yum install -y mysql

On lance ensuite la construction à partir du fichier Dockerfile ci dessus :

$ docker build -t="cquad/centos:mysql" .
Sending build context to Docker daemon  2.56 kB
Sending build context to Docker daemon 
Step 0 : FROM centos
 ---> 70214e5d0a90
Step 1 : MAINTAINER Cédric OLIVIER <mail@exemple.com>
 ---> Running in 539bff6918b2
 ---> 3cfce923bb60
Removing intermediate container 539bff6918b2
Step 2 : RUN yum install -y mysql
 ---> Running in a7e711864bfc
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: centos.mirror.fr.planethoster.net
 * extras: centos.mirror.fr.planethoster.net
 * updates: centos.quelquesmots.fr
Resolving Dependencies
--> Running transaction check
...
Complete!
 ---> 8d3d8442cb55
Removing intermediate container a7e711864bfc
Successfully built 8d3d8442cb55

Faire communiquer deux conteneurs

Une petite option qui pourra vous être bien utile, il est possible de nommer les conteneurs au lancement avec l’option --name

Nous allons ici nommer web le conteneur qui heberge notre application python Flask

$ docker run -d -P --name web training/webapp python app.py
add2f97c63b01b79f3a4a9d6ba26525b2fe8bb358569e893e54f53b4fe302d02
$ docker ps 
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
add2f97c63b0        training/webapp:latest   "python app.py"     6 minutes ago       Up 6 minutes        0.0.0.0:49154->5000/tcp   web       

Nous avons un conteneur web maintenant nous allons créer un conteneur db :

$ docker run -d --name db training/postgres

La base de données ne sera accessible que par le conteneur web, nous n’avons pas passé l’option -p pour « exposer » le conteneur au réseau.

Pour pouvoir créer le lien entre les 2 conteneurs, nous devons stopper et supprimer le conteneur web :

$ docker rm -f web
web
$ docker run -d -P --name web --link db:db training/webapp python app.py

Nous relançons le conteneur avec l’option --link pour lier les 2 conteneurs ensemble. l’option --link recoit pour argument nom:alias.
Le nom correspond au nom que l’on a donné au conteneur, l’alias permet de donner un autre nom pour le conteneur web si l’on veut.

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS                     NAMES
4bdbc71d428f        training/webapp:latest     "python app.py"        15 seconds ago      Up 13 seconds       0.0.0.0:49155->5000/tcp   web                 
02ca8208e75d        training/postgres:latest   "su postgres -c '/us   9 minutes ago       Up 9 minutes        5432/tcp                  db,web/db           

On constate dans le champs NAMES le lien entre les deux conteneurs.
 

Laisser un commentaire