Le Blog de C-quad

Docker – Une petite révolution pour moi

Docker est une application open source qui se base sur les conteneurs. Elle permet de faire la même chose qu’avec de la virtualisation (uniquement si l’os de la machine virtualisée est basée sur du Linux) mais en économisant la virtualisation.  Extrait de wikipedia :

Contrairement aux machines virtuelles traditionnelles, un conteneur Docker n’inclut pas de système d’exploitation, à la place il s’appuie sur les fonctionnalités du système d’exploitation fourni par l’infrastructure sous-jacente

Cela permet donc d’avoir des environnements léger et peu consommateur de ressources. Docker permet aussi d’automatiser le déploiement. Avant d’aborder le déploiement, commençons par le début et voyons comment l’utiliser.

Débuter avec Docker

Pour l’installer sous Fedora, un simple appel à yum permet de l’installer :

yum install docker

Pour ceux qui veulent pouvoir en profiter sous Windows, il existe boot2docker, qui lui par contre fonctionne à base d’une machine virtuelle Linux qui hébergera docker.

Lancement simple

Docker permet de lancer des applications dans un conteneur via la commande docker run

Par exemple :

$ docker run fedora:20 echo "Hello World"
Hello World

docker run lance un conteneur, ensuite nous lui avons passé en argument une image fedora version 20. docker cherche l’image en premier lieu en local et si elle n’est pas présente, il va chercher sur le repository dockerHub.

Ensuite docker lance la commande echo « Hello World » dans le conteneur. Par contre dès que la commande est terminée le conteneur est terminé.

Lancement interactif

Lançons maintenant :

$ docker run -t -i fedora:20 /bin/bash
bash-4.2# 

Nous avons lancé la même image (fedora:20) sauf que cette fois ci nous avons demandé un terminal tty avec l’option -t dans le conteneur et l’option -i permet d’interagir avec ce terminal.
Nous avons lancé un shell avec /bin/bash qui va nous permettre de lancer des commandes dans le conteneur.

Pour quitter, de la même façon que le conteneur est stoppé quand le echo « Hello World » a terminé, le conteneur sera fermé quand le process /bin/bash sera terminé. Il suffit donc de le quitter avec un exit.

bash-4.2# exit
exit
$

Lancement d’un daemon (en tâche de fond)

Nous avons vu comment lancer une commande dans un conteneur, comment interagir avec un conteneur, mais il peut aussi être utile de pouvoir lancer un processus en tache de fond.

$ docker run -d fedora:20 sh -c "while true; do echo hello world; sleep 1; done"
5b1507abe7ed9094e0ef15bf4f90c86764c1b38fced6feb2d699e4dae5eaa79d

L’option -d nous permet de lancer le conteneur en tache de fond. Par contre, comme vous pouvez le constater par de traces de nos « hello world » toutes les secondes…
Quand on lance un conteneur en tache de fond, docker retourne un identifiant dans notre cas : 5b1507abe7ed9094e0ef15bf4f90c86764c1b38fced6feb2d699e4dae5eaa79d

On peut via la commande docker ps voir la liste des conteneurs en cours d’executions :

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
5b1507abe7ed        fedora:20           "sh -c 'while true;    5 minutes ago       Up 5 minutes                            jolly_leakey        

On retrouve bien notre conteneur avec un nom défini aléatoirement par docker jolly_leakey.

Si on veut voir la sortie du conteneur, on utilise docker logs avec le nom du conteneur:

$ docker logs jolly_leakey
hello world
hello world
hello world

Nous allons maintenant arreter le conteneur avec la commande docker stop :

$ docker stop jolly_leakey
jolly_leakey
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Notre conteneur est bien terminé.

Lancement d’un daemon sur le réseau

Nous allons maintenant lancer une application web qui tourne avec python Flask :

$ docker run -d -P training/webapp python app.py

L’option -P permet de pouvoir accéder à l’ensemble des ports ouverts à l’intérieur du conteneur à l’exterieur. L’application python Flask tourne sur le port 5000, mais ce n’est pas ce port qui sera utilisé en local pour accéder au conteneur. Pour connaitre l’association, nous lancons :

$ docker ps -l
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES
d749f39a560b        training/webapp:latest   "python app.py"     9 seconds ago       Up 7 seconds        0.0.0.0:49153->5000/tcp   boring_albattani    

Notre application est disponible sur le port 49153. Si on veut que le port local soit le même que le port interne 5000 dans notre cas, il faut lancer la commande suivante :

$ docker run -d -p 5000:5000 training/webapp python app.py
$ docker ps -l
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                    NAMES
522394e84c05        training/webapp:latest   "python app.py"     5 seconds ago       Up 3 seconds        0.0.0.0:5000->5000/tcp   pensive_fermi    

Pour connaitre le port local sans faire appel à docker ps -l il existe une commande qui nous donne directement le mapping : docker port conteneur_name 5000

$ docker run -d -P training/webapp python app.py
26b92cf6f4aec2d59232dd664e5508423155426a487010b3c61d201ab2b80400
$ docker port 26b92 5000
0.0.0.0:49154

Vous constaterez qu’à la place du nom du conteneur, il est possible de passer les 4 premiers caractères de l’identifiant retourné au moment du lancement.

Relancer un conteneur arretté

Nous avons vu qu’a chaque fois que nous lancions docker run un nouveau conteneur est créé. Nous allons voir ici comment reprendre un conteneur qui a déjà été lancé.

$ docker start pensive_fermi
pensive_fermi
$ docker ps
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                    NAMES
522394e84c05        training/webapp:latest   "python app.py"     About an hour ago   Up 18 seconds       0.0.0.0:5000->5000/tcp   pensive_fermi       

Suppression d’un conteneur

Une fois que l’on a fini avec un conteneur et que le décide de le supprimer, un simple docker rm permettra de la supprimer. Mais attention, la suppression est définitive.

$ docker stop pensive_fermi 
pensive_fermi
$ docker rm pensive_fermi 
pensive_fermi
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

Une réponse à to “Docker – Une petite révolution pour moi”

  • C’est clair que docker est un truc super ! Au passage bravo pour tes conteneurs Jeedom ! Je pense passer dessus maintenant que j’ai changé mon NAS pour un HP G1610t avec OpenMediaVault dessus (pour lequel j’ai fais un plugin docker 😛 !

Laisser une réponse à slobberbone