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
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
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.
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
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.
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
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
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.
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…