Dans cette série d'articles, nous allons démystifier docker (v 1.10.3 retenue et testée en particulier sous Windows). En attendant le support natif de docker dans Windows, nous présentons ici docker sous Windows reposant sur VirtualBox.
Nous nous attardons pas sur les concepts car, il me semble, que l'on en trouve suffisamment à ce propos sur le net. Ce que l'on trouve moins, c'est un tutoriel clair et complet sur docker pour Windows qui présente toutes les étapes nécessaires à la prise en main sans connaissance préalable.
Nous avons donc tenté de rassembler, dans cette série d'articles, l'ensemble des commandes utiles pour appréhender le monde docker.
Docker c'est quoi?
Docker est un container ou isolateur reposant sur des systèmes LXC afin de limiter et cloisonner l'utilisation des ressources (proc,mémoire, disque..). Docker est une plateforme composée de deux éléments essentiels: l'Engine et le Hub.
- L'engine sert à faire tourner les conteneurs (isolateurs).
- Le Hub offre plein de services dont principalement l'hébergement des images docker (voir plus loin).
Docker pourquoi?
Le but de docker est de permettre de déployer absolument tout (phrase extraite et adaptée la conférence de J. Petazzoni) de manière fiable et consistante.
Absolument tout (webapps, backends, bdd,..) peut être déployé dans un container docker.
Tout! N'importe où (tout ce qui est possible de déployer sur un serveur linux. Pour Windows ce n'est pas encore du natif pour le moment).
SOMMAIRE
Dans la première partie, nous commençons par chercher une image docker, la récupérer (pull) puis exécuter le container docker.
Dans la seconde partie nous attaquons les commandes avancées de docker : Entre autres, interagir avec un container docker, créer notre propre image pour la pousser (push) dans le hub.docker public.
Nous enchaînons, dans la troisième partie, par démystifier la commande docker-compose permettant, comme son nom le laisse deviner, de composer plusieurs images.
Nous poursuivons par la réalisation d'un docker-compose pour l'intégration continue avec Jenkins, Sonar, Nexus, Selenium!
Beau programme, non?
Pré-requis:
a) Installer GIT: https://git-scm.com/. On désignera par [GIT_HOME] son répertoire d'instal.
b) Installer Docker Toolbox: https://www.docker.com/products/docker-toolbox pour Windows. On note le répertoire d'instal [DOCKERTOOLBOX_HOME]
c) Ajouter dans le path la commande bash.exe dans [Git_HOME]\bin.
Nous adoptons ces règles pour faciliter le suivi de cette présentation.
Lorsqu’une commande est pour linux, elle est précédée de $ (ou # si autre shell ou shell fils).
COMMANDES WINDOWS
Une fois Docker Toolbox installé, un raccourci nommé "Docker Quickstart Terminal" s'affiche sur le bureau. Si ce n'est pas le cas, ouvrez une console DOS (oui console DOS!) et tapez la commande suivante :
cd [DOCKERTOOLBOX_HOME] && bash.exe --login -i start.sh
Attention c'est bien start.sh (ne me demandez pas pourquoi:-))
L'écran qui s'affiche est une nouvelle console docker. Commençons simplement par taper la cmd:
$ pwd
pour voir le chemin qui pointe sur un montage du disque Windows.
NOTE. Il existe un outil graphique nommé Kitematic (en version alpha) permettant de faire pas mal de choses sans saisir les commandes.
POUR MIEUX APPRÉHENDER LES NOTIONS DOCKER, nous terminons cette première partie avec ce scénario qui consiste à :
- Procurer une première image depuis le hub docker (au passage, nous prenons une image bien notée! La mienne pourquoi pas?),
- Lancer le container docker,
- Monter un disque au lancement du container,
- Interagir avec le container afin d'exécuter notre application java,
- Configurer le container pour qu'il exécute automatiquement notre application au lancement,
- Ouvrir à l'écoute (avec mapping) un port spécifique du container pour notre application web,
- Saisir dans le browser de la machine hôte l'url de notre application web.
Mais avant cela, commençons simplement.
PREMIERS PAS AVEC DOCKER
Vérifions l'installation de docker avec cette commande à saisir dans la console docker via "Docker Quickstart terminal" ou via la console comme indiqué précédemment.
Docker run (first one)
$ docker run hello-world
Docker info
Un aperçu global de l'état de docker (nb images, nb containers lancés, stoppés,...) peut être obtenu grâce à la cmd :
$ docker info
Lister les images docker
La commande suivante liste les images docker sur la machine hôte:
$ docker images
Elle affiche, par exemple, ceci :
REPOSITORY TAG IMAGE ID CREATED SIZE
achine/jenkins v1.0.0 834022f2f85c 2 hours ago 729.9 MB
hello-world latest 690ed74de00f 5 months ago 960 B
java openjdk-8u45-jdk 6c8bf95a6d6c 8 months ago 816.4 MB
En principe à ce stade, vous ne devrez pas avoir d'images!
Nous allons faire récupérer (pull) notre première image docker et faire le "build" dans les sections ci-dessous.
Pour se faire, nous partons du hub docker (public): https://hub.docker.com/
Une première image docker
Nous procédons en deux étapes: rechercher une image bien notée puis la récupérer.
- Recherche$ docker search --stars 1 achine/testLa cmd affiche ceci :NAME DESCRIPTION STARS OFFICIAL AUTOMATED
odarriba/timemachine Lastest Netatalk with configurable user/pa... 15 [OK]
achine/test image docker with spring-boot & java 8 app... 1
Vous pouvez découvrir les détails de cette commande en tapant : docker search --help - Pull image$ docker pull achine/testLa commande récupère l'image (ou simplement les layers nécessaires pour construire l'image).
Vous pouvez lancer la cmd suivante pour inspecter l'image docker.
$ docker inspect achine/test
RUN DOCKER (premier pas)
Voici la commande pour lancer le container docker à partir de l'image 'achine/test'
$ docker run achine/test
Elle affiche cette capture:
Afficher les id des containers lancés
$ docker ps
Elle affiche cette capture :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61ac3d7ff5c6 achine/test:latest .... focused_snyder
NOTE. Vous pouvez également utiliser l'option -a comme suit:
$ docker ps -a
Le container_id affiché peut être également utilisé avec docker stop.
Arrêter un container docker
$ docker stop [container_id]
Par exemple,
$ docker stop 61ac3d7ff5c6
Pour toute la suite, le focus est mis sur comment créer notre propre image docker, l'exécuter, l'enrichir en interagissant avec.
Et aussi comment ajouter notre programme java qui sera exécuté au lancement du container docker.
Attachez vos ceintures ça va vibrer [docker]!
La clé de compréhension de la création de notre propre image est le fichier Dockerfile (attention D majuscule).
Nous aborderons cette notion dans la prochaine partie bientôt.