EA2014 Docker



= Présentation =

=Mots Clés= Conteneurs Linux, Docker, Zone Solaris, Virtualisation, Environnement d'application =Introduction=
 * Enseignants : Georges-Pierre Bonneau, Didier Donsez (EA2014)
 * Sujet : Conteneurs Linux
 * Date : 7 novembre 2014
 * Auteur : Augustin Husson 
 * Lien vers les slides de la présentation : slides

Les conteneurs : Principe
Nous connaissons tous plus ou moins bien le principe de la machine virtuelle. Notamment parce qu'elles nous permettent d'installer des OS facilement sans être obligé de faire des duals boot. De nombreux logiciels permettent cela comme VMware ou VirtualBox. Le principe de la machine virtuelle est de simuler une machine physique. Cela peut être utile par exemple pour tester des applications non stables. Mais simuler toute une machine physique pour finalement ne faire fonctionner/tester une application en particulier est particulière lourd. On aimerait donc quelques choses de plus léger, de plus flexible. C'est pourquoi nous allons parlé des Conteneurs.

Les conteneurs contrairement aux machines virtuelles ne simulent pas le matériel. Ils virtualisent un environnement d'application et ils permettent d'isoler les applications entre elle. Les images ci-dessous permettent de bien comprendre la différence décrite :

On voit donc bien qu'il n'y a pas de couche de virtualisation dans les Conteneurs, c'est donc en ce sens qu'ils sont beaucoup plus léger que les machines virtuelles. Afin de regarder concrètement comment on peut mettre en oeuvre un conteneur, j'ai choisi de prendre comme exemple les Zones Solaris qui est la solution d'Oracle et Docker qui est une solution open source.

L'intérêt des conteneurs
Dans la présentation de ce qu'est un conteneur, on a dit qu'il permettait d'isoler les applications les une des autres. Cette idée d'isoler les applications entre elle est particulièrement utile dans les serveurs.

On peut ainsi installer diverse services dans un conteneur, une base de donnée dans un autre ...etc. Lors d'une migration de machine, il suffit alors de faire migrer les conteneurs vers la machine réceptrice. Cela assure ainsi une meilleure portabilité.

Cela permet également d'optimiser les coûts en terme de ressource matériel. IL y a en effet une ré allocation dynamique des ressources dans les systèmes de gestion des conteneurs. De cette façon les ressources peuvent être ré-allouées pour d'autres conteneurs.

=La solution d'oracle : Les zones Solaris= La solution d'oracle pour mettre en oeuvre les conteneurs ne s'applique que sur son système d'exploitation Oracle Solaris qui est donc un système propriétaire.

Ici il existe deux types de conteneur : La zone globale et les zones non globales

Zone Globale
Tous les systèmes Solaris 10 et supérieur possèdent une zone globale. Elle a deux objectifs :
 * créer la couche d’interaction et d'abstraction avec l'OS
 * administrer les zones non globales. Il n'y a qu'à partir d'elle qu'on peut installer, modifier et désinstaller des zones non globales

Elle permet également d'alléger en terme de mémoire les zones non globales. En effet, ces dernières ont accès aux applications installées dans la zone globale. Il est alors juste nécessaire d'installer les applications spécifiques aux zones non globales.

Enfin seul la zone globale est démarrable à partir du hardware du serveur.

Zones non globales
C'est ici qu'on trouvera notre conteneur telle qu'on l'a décrit précédemment.

=Docker : une référence dans le genre=

Histoire
Docker est un projet open source possédant la licence Apache 2.0. C'est un logiciel qui permet d'installer une application et ses dépendances dans un conteneur virtuel. L'application ainsi empaquetée pourra être lancé sur n'importe quelle machine possédant un noyau linux.

C'est un projet assez récent puisque la première version date du 13 mars 2013. Il est l'un des projets les plus visité et forké de GitHub.

Spécificité
Une des forces de Docker est que l'on peut facilement partager son propre docker avec n'importe qui du moment qu'il possède un noyau linux sur sa machine (que ce soit en natif que par machine virtuelle). Ceci est possible essentiellement grâce à deux points : docker pull nom_du_docker Après l'avoir modifié (en installant par exemple des fonctionnalités supplémentaires au sein de ce docker), vous avez la possibilité de le sauvegarder docker commit id_Du_Conteneur nom_du_nouveau_docker Et enfin de renvoyer votre version sur le serveur docker push nom_du_docker
 * Le projet utilise le principe de git. C'est à dire qu'il met à la disposition des utilisateurs un hub afin que la communauté puisse partagée ses dockers. Il est ainsi possible de télécharger un docker

docker export id_du_docker > nginx.tgz
 * Pour ceux qui ne souhaitent pas passer par un cloud, il est possible d'exporter son docker en tar.gz :

Le projet se veut être portable. C'est à dire qu'à l'égal de git, votre docker devrait fonctionner sur n'importe quelle machine. Dans ce but, un partenariat entre Docker et Microsoft a été mis en place pour créer un moteur Docker qui tournera, en natif, sur la prochaine édition de Windows Server.

Installation sur Ubuntu
Pour ça il suffit d'aller sur le site officiel de Docker et de suivre la procédure. Toutes les commandes son détaillées et très bien expliquées.

A la fin de la procédure d'installation, pour vérifier que Docker fonctionne il vous ai demandé de rentrer la commande suivante : sudo docker run -i -t ubuntu /bin/bash

Si comme moi vous avez alors l'erreur suivante : /etc/resolv.conf file or directory not found Vous pouvez alors exécuter la commande suivante pour résoudre le problème (fonctionne sur Ubuntu 12.04): sudo dpkg-reconfigure resolvconf

Démonstration
On reprend ici l'exemple présenté par Docker sur son site officiel. À savoir, on va : docker pull learn/tutorial docker run learn/tutorial echo Hello Word docker run learn/tutorial apt-get install -y ping docker ps -l Une fois que l'id est récupéré on peut sauvegarder la modification docker commit Id_Du_Conteneur_Ou_A_été_fait_l'installation_du_ping nom_image
 * télécharger une application appelée learn/tutorial
 * faire un Hello Word avec ce docker
 * installer l'application ping au sein de ce docker et l'executer
 * commiter cette modification du docker. Pour cela nous avons besoin de savoir dans quel conteneur a été fait cette modification. La commande suivante permet de récupérer l'id en question :

Il est nécessaire de commiter vos modifications. Pour vous le prouvez vous pouvez tenter d’exécuter la commande ping dans avec l'image learn/tutorial. Vous devriez voir que cela ne fonctionne pas. Vous devez lancer la nouvelle image créée précédemment :

docker run new_image ping google.com

Vous pouvez voir que cette fois-ci la commande ping s’exécute bien.

=Notes et Références=

Docker

 * Site officiel de Docker
 * gitHub de Docker
 * Docker sur Windows serveur pour bientôt
 * Manipuler les conteneurs
 * la folie Docker

Zones Solaris

 * zones Solaris : doc oracle
 * zone solaris explication