Aller au contenu

Démarrer avec Docker (partie 1)

 

Mon Macbook Pro a rendu l’âme après 6 ans de bons et loyaux services et pour cette raison, j’ai dû changer de machine. J’ai craqué pour un notebook Windows, car Apple a bien changé depuis l’époque où j’ai acquéri mon Mac. Mais bon ce n’est pas le sujet de cet article.

Ici, je veux me mettre au gout du jour et donc avoir un environnement de développement digne des temps modernes. Adieu MAMP (ou WAMP) et bonjour Docker !

Si tu ne connais pas (encore) Docker, commençons par la définition de Wikipédia :

Docker est un logiciel libre qui automatise le déploiement d’applications dans des conteneurs logiciels. Selon la firme de recherche sur l’industrie 451 Research, « Docker est un outil qui peut empaqueter une application et ses dépendances dans un conteneur isolé, qui pourra être exécuté sur n’importe quel serveur Linux ».

– C’est bien beau mais ça veut dire quoi ?

Prenons mon cas, sous OSX; pour développer une app sous PHP, j’installais sur ma machine MAMP, qui intégrait une version de PHP, Apache, MySQL, et PhpMyAdmin. Sauf que j’ai 6 ans de projets, et certains de mes projets ont été développés sous PHP5.3, ce qui rend certains bouts de code obsolètes sous PHP7.0. Et réciproquement, les projets sous PHP7.0 ne fonctionnent pas sous PHP5.3. A tout ça s’ajoute le problème des dépendances à certaines librairies, les projets sous les autres langages, autres bases de données, l’écart entre la configuration en dev et en prod…

Donc comment faire pour pouvoir travailler sur tous ces projets là, sans tout casser à chaque fois ? En utilisant Docker voyons !

– Comment ça marche ?

Grossièrement, Docker crée des conteneurs, qui sont des environnements isolés. On peut voir ça comme une machine virtuelle, mais attention, ça n’en est pas une. A la différence d’une VM, qui va devoir installer un OS entièrement à chaque fois, Docker va plutôt utiliser les ressources du système hôte afin de faire fonctionner ces conteneurs. Nos conteneurs contiendront donc uniquement les composants qui le concerne, et les partagera avec les autres conteneurs.

– Donc au lieu d’installer WAMP, on crée un conteneur qui aura Apache, PHP, MySQL et PHPMyAdmin ?

On pourrait, mais on perd l’utilité de Docker qui est de changer de composant rapidement. Au lieu de faire un conteneur avec tous les composants, on va faire différents conteneurs avec chacun des composants. Par exemple, on pourra passer de PHP5.3 à PHP7.0 facilement, ou encore remplacer notre bon vieux Apache par Nginx. D’ailleurs on verra comment faire cela.

– Docker est adapté à Windows ?

Oui, depuis peu. Docker a été développé pour fonctionner essentiellement sur Linux. Mais depuis la build 10586 de Windows 10 x64, il est désormais possible d’utiliser Docker nativement sur Windows, via « Docker for Windows ». Si on veut l’utiliser sur un Windows ne disposant pas de cette mise à jour (Windows 7 par exemple), il faudra passer par une VM, avec « Docker Toolbox ». Ne t’inquiète pas, Docker s’occupe de tout, et la VM est très légère.
Disposant d’un Windows à jour, je vais l’utiliser de manière native.

Maintenant que les présentations sont faites, on se lance !

On commence par télécharger et installer « Docker for Windows«  via leur site officiel. Suivez la procédure d’installation, il n’y a rien de bien compliqué. Une fois terminé, tu auras une baleine en bas à droite, te permettant d’accéder à Docker.

Une fois Docker installé, on ouvre l’invite de commandes et on vérifie que tout fonctionne bien :

On distingue 3 outils :

  • docker : l’outil principal de docker, qui nous permettra de jouer avec les images et conteneurs.
  • docker-compose : un outil qui va nous simplifier la vie dans la création de conteneurs multiples.
  • docker-machine : un outil qui permet d’installer docker sur une machine distante (AWS, DigitalOcean…). Il était aussi utile quand on l’utilisait avec une VM, ce qui n’est pas notre cas ici.

Regardons les conteneurs qu’on a :

On en a aucun, ce qui est logique car on vient de l’installer. Lançons notre premier conteneur :

Ici, « docker run » sert à démarrer un nouveau conteneur, les options « -it » à attacher notre console à celle du conteneur, ainsi qu’à dialoguer avec lui. Ensuite, on veut un conteneur basé sur l’image d’Ubuntu, en démarrant avec la commande « bash ».

– Mais comment il fait pour utiliser Ubuntu?

Eh bien Docker à son propre repository, qui contient un gros paquet d’images déjà existantes. D’ailleurs, vous pouvez même stocker les vôtres, ou utiliser les images d’autres contributeurs. Tout se passe sur le Docker Hub.
Comme notre Docker ne trouve pas d’image Ubuntu sur notre machine, il s’occupe d’aller la télécharger sur le hub. Quand on voudra lancer d’autres conteneurs basé sur ubuntu, il utilisera directement celle qu’on a.

On peut voir qu’on est désormais en root sur le conteneur 3b0c700275b0. Faites un petit « ls -alh » et vous verrez que ça marche 🙂 Amusez vous un petit peu, puis faites un « exit », et faites à nouveau un « docker ps » :

– Hey ! Mon conteneur n’est plus là !

Pas exactement. « docker ps » permet de voir les conteneurs en service. Ici il n’y en a pas, car on vient de sortir (et donc de stopper) notre conteneur. Pour voir tous nos conteneurs, il faut faire :

Sachez qu’en stoppant un conteneur, vous ne le supprimez pas. Il est simplement arrêté à l’état où vous l’avez quitté.

Pour le redémarrer, il suffit de l’appeler soit par son « name », soit par son « conteneur ID » (ou par le début) :

– C’est bien sympa tout ça, mais si je travaille dans mon conteneur, et qu’après je veux changer de version, je dois tout refaire ?

Si tu bosses à partir de ton conteneur, et que tu veux en refaire un avec la même configuration, alors oui. C’est pour ça qu’on ne va pas la faire 😉 On va plutôt créer des conteneurs à partir d’une image, en lui envoyant nos fichiers de config. Comme ça, quand on changera de conteneur, on pourra utiliser la même config, et éviter de tout se retaper.

On fait une petite pause, pour te laisser digérer tout ça. En attendant tu peux aller jeter un oeil aux commandes disponibles de Docker, ça sera utile pour la suite. On verra dans le prochain article comment créer et lier plusieurs conteneurs ensemble, et arriver à nos fins 🙂

 

Sources :