Utilisation de Docker

Voici le cinquième d’une série d’articles consacrée à l'utilisation conjointe de Docker et Azure, qui je l’espère vous permettra d’accélérer votre découverte de ces environnements :
Docker : les fondamentaux
Mise en place de l’environnement Docker : Installation du moteur et du client Docker
Docker et la virtualisation par container sous Windows
Mise en place de l’environnement Docker : Provisioning d’un host Docker dans Azure
Utilisation de Docker
Clusters de containers Docker

Une fois le hôte Docker déployé sur la plateforme Azure, il devient alors possible, depuis le client Docker, d’utiliser les différentes commandes et outils permettant de créer des images, de les publier, et d’exécuter des containers ayant ces images pour source…

Premier pas avec Docker

Les commandes qui permettent l’interaction avec le moteur Docker Hub sont extrêmement simples.
La recherche d’une image dans le référentiel Docker Hub se fait avec la commande search : docker search nginx

search

Les images « Automated » sont automatiquement créées par les clusters de serveurs de Build de DockerHub, à partir de la spécification d’un Dockerfile (que nous verrons dans la suite de cet article) ou depuis un contexte GitHub ou BitBucket.

Le téléchargement d’une image depuis le référentiel Docker Hub se fait par avec la commande pull : docker pull nginx

pull

Le téléchargement d’une image se fait par avec la commande push : docker push yourname/newimage
Pour lancer un container, il suffit d'exécuter une commande comme : docker run ubuntu:14.10 /bin/echo 'Hello Azure'

Cette commande spécifie l'image qui va être la source du container d'exécution. Ici, il s'agit de monter de système d'exploitation Ubuntu 14.10. Si l'hôte Docker ne dispose pas déjà de cette image, il la télécharge depuis le référentiel Docker Hub. Une fois l'image déployée, Docker peut lancer un nouvel environnement Ubuntu 14.10 et y exécuter la commande.

run

Il est également possible de démarrer un container de façon interactive, si on le lance avec les flags « t » (terminal) et « i » (interactif via la capture du STDIN du container) avec la commande « /bin/bash » : docker run -t -i ubuntu:14.04 /bin/bash

Cette commande est un cas particulier de la commande suivante : docker run -ti ubuntu:14.04 --entrypoint /bin/bash

Le « entrypoint » par défaut est « /bin/sh -c » que l’on peut personnaliser dans un document texte baptisé Dockerfile.

Dockerfile

Un Dockerfile contient toutes les commandes requises qu’il faudrait exécuter manuellement pour parvenir à la construction d’une image de Docker.
L’équivalent d’un Dockerfile pour une application Console affichant l’universel « Hello World » pourrait être le suivant :

FROM busybox

ENTRYPOINT ["echo"]

CMD ["hello world"]

Le fichier suivant permet de décrire l’image d’une application node.js bâtie sur l’image node:0.10-onbuild disponible dans le référentiel Docker Hub.

FROM node:0.10-onbuild

EXPOSE 8888

COPY . /app

RUN cd /app; npm install

CMD ["node", "/app/server.js"]

En appelant la commande docker build, Docker construit l’image cible étape par étape, en exécutant les instructions successivement.

docker build --tag=nodejs nodejs

build

Une fois déployés les pré-requis liés à la construction de l’image, la même commande s’exécute beaucoup plus rapidement.
build2

On peut alors lancer le container hébergeant l’application, en lui précisant une redirection de port, puisque dans cet exemple, il s’agit d’une application Web hébergée dans un container s’exécutant dans une VM déployée sur Azure (et pour laquelle il faut également ajouter un endpoint pour exposer le port http permettant de requêter cette application Web…)

docker run -d -t -p 8080:8888 -name node-app nodejs

run-nodejs

Signalons qu’il existe aussi un moyen de passer des commandes à un container déjà lancé (par exemple pour se retrouver dans son contexte d’exécution : très pratique pour debugger un Dockerfile) avec la commande docker exec – en spécifiant l’identifiant du container lancé (dans notre exemple : 6a4e9745f0ba ou son nom (le nom généré « loving_bardeen »).

docker exec -ti 6a4e9745f0ba bash

exec

Compose

Compose est un outil Docker permettant de définir dans un seul fichier des applications multi-containers et de les déployer ou de les exécuter avec des commandes ayant une portée sur le cycle de vie de l’ensemble des composantes de ces applications :
• Démarrage, arrêt et reconstruction des services
• Affiche du statut de l'exécution des services
• Capture du flux d’information issu du journal de l'exécution de services
• Exécution d’une commande ponctuelle sur un service
L’utilisation de Compose est un processus en trois étapes.
Tout d'abord, il faut définir l’environnement de l’application avec un Dockerfile.

FROM python:2.7

WORKDIR /code

ADD requirements.txt /code/

RUN pip install -r requirements.txt

ADD . /code

CMD python app.py

Il faut ensuite configurer la liste des services qui constituent l’application avec le fichier docker-compose.yml de façon à établir leur association au sein d’un environnement isolé :

web:

build: .

links:

- db

ports:

- "8000:8000"

db:

image: postgres

Enfin, la commande docker-compose up permet de lancer l’application et ses composants.

compose

Après cette exploration de l’utilisation des commandes de Docker, nous voici prêts à aborder la clusterisation des containers. Ce sera l’objet de mon prochain article…