2 décembre 2019

Docker

Définition et avantages

Docker est un outil de virtualisation d'OS. Contrairement à VMware ou Virtualbox qui virtualisent une machine. Ainsi, comme on peut le voir dans l'image ci-dessous, un container Docker n'aura besoin que de binaires et de librairies. De plus, les ressources d'une vm sont bloqués par la vm. Contrairement à un container qui ne prend que ce dont il a besoin. L'utilisation de container permet ainsi de mieux utiliser les ressources d'un serveur.

Comparaison entre une virtualisation de machine et une virtualisation de systèmes d'exploitation

Une image Docker est composé de plusieurs couches :

  • Une image de base (par exemple Ubuntu) ou une image “avancée” (par exemple NodeJS dans un Ubuntu),
  • Puis une succession de couches (Layers). Par conséquent, il est possible de changer juste une couche d'une image (par exemple en passant de Java 7 à Java 8).

Docker est idéal pour le Dev&Test car il permet de mettre en place rapidement un environnement de développement et de test tout en permettant de changer la version d'un élément de l'environnement en peu de temps et avec simplicité.

Docker fonctionne sous la forme d'un modèle client/serveur. Ainsi toutes les communications sont effectuées sous forme d'API REST, par défaut en HTTP.


Disponibilité

Docker est disponible sous Windows, MacOS et Linux. Il prend la forme d'une application (Docker Desktop) sous Windows et MacOS, téléchargeable ici. Pour l'installer sur Linux, il faudra suivre la documentation disponible ici (en anglais).


Créer une image avec Dockerfile

Le Dockerfile est le fichier servant à décrire notre image Docker. En effet, celui-ci est utilisé pour définir comment l'image doit être construite et quels sont les actions à effectuer lors de son installation ou de son exécution. Par exemple, voici un Dockerfile basique :

FROM debian:9

RUN apt-get update -yq \
   && apt-get install curl gnupg -yq \
   && curl -sL https://deb.nodesource.com/setup_10.x | bash \
   && apt-get install nodejs -yq \
   && apt-get clean -y

ADD . /app/
WORKDIR /app
RUN npm install

EXPOSE 2368
VOLUME /app/logs

CMD npm run start

La première ligne de notre Dockerfile doit indiquer l'image de base sur laquelle se base notre image Docker. Dans notre cas, il s'agit de l'OS Debian, dans sa version 9.

Ensuite, on définit des actions à exécuter avec l'instruction RUN. Ici, on met à jour la liste des paquets disponible, on installe les paquets curl et gnupg pour ensuite pouvoir télécharger et installer NodeJs. Enfin, on effectue un nettoyage du cache pour limiter la taille de l'image.

Puis, on ajoute le dossier app contenu à côté de notre Dockerfile dans l'image Docker grâce à l'instruction ADD.

Ensuite, on se déplace dans ce nouveau dossier avec l'instruction WORKDIR, l'équivalent d'un cd en Shell.

On exécute alors une nouvelle instruction RUN pour installer toutes les dépendances npm nécessaire à notre application NodeJs.

Enfin, on ouvre le port 2368 avec l'instruction EXPOSE et on définit un dossier qui sera pérennisé pour conserver les logs avec l'instruction VOLUME.

Et pour finir, on utilise l'instruction CMD pour définir l'action a effectuer lorsque l'on lancera notre image Docker.