
Docker est un émulateur de machines virtuelles un peu comme Virtualbox, sauf qu’il permet de gérer des containers d’applications.
A partir d’une seule image (Ubuntu 16 par exemple), vous pouvez créer plusieurs conteneurs, chacun étant spécifique, on peut avoir 3 containers différents pour PHP (FPM), MySQL Apache httpd. Ces conteneurs ont leurs propres fichiers, leur propre configuration, leurs propres paquets, tout en étant tous basé sur Ubuntu 16.
Les principaux avantages de Docker
Je suis encore nouveau sur Docker, mais les avantages que je lui trouve sont déjà énormes !
- Vous n’avez rien besoin d’installer sur votre ordinateur, pas besoin de l’encrasser, il reste rapide et propre ;
- Les mises à jour de l’ordinateur ne sont plus un problème… ;
- Chaque projet à sa configuration, qui peut en plus être identique à celle du serveur ;
- Vous travaillez avec un ou des ami(e)s ? Ils n’ont qu’à lancer votre Docker et tout fonctionne déjà, plus besoin de perdre de temps à configurer son environnement ;
- Docker fonctionne sur Linux, OSX et Windows ;
- Vous pouvez casse votre container en faisant des tests, pas de problème, vous n’avez qu’à le reconstruire.
Il y a sûrement bien d’autres avantages à utiliser Docker, néanmoins voici ceux que j’ai retenu, pour l’heure.
Besoin d’un Docker ?
Si vous utilisez un framework assez connu, il y a de grandes chances pour que une ou plusieurs personnes ai(ent) déjà créé des conteneurs.
Par exemple, voici un Docker personnalisé pour ceux qui comme moi, développent avec Ionic : https://hub.docker.com/r/agileek/ionic-framework/.
Les différents READMEs sur DockerHub ou sur Github vous permettront de savoir quelles commandes lancer, la plupart du temps ;-).
Les commandes utiles sur Docker
Je ne vais pas faire un tutoriel sur Docker, je ne suis pas assez expérimenté et il doit en exister une multitude sur le net. En revanche je vais vous lister ici les commandes que j’utilise le plus.
1/ Construire son conteneur
A chaque étape de la construction, Docker met en cache les éléments précédents, ce qui est très utile si vous avez une erreur à la fin de votre Dockerfile
-> vous n’avez pas à relancer le build. Mais parfois vous pourriez avoir besoin de reconstruire tout votre conteneur, l’argument --no-cache
est là pour ça.
$ docker build --no-cache . -t tak
Utiliser un tag avec -t
permet de donner un nom à votre conteneur et ainsi de le repérer/gérer plus facilement.
2/ Relancer le build à partir d’un moment donné
Si vous avez envie de relancer le build Docker à partir d’un certain moment, dans votre Dockerfile
:
RUN ...
RUN ...
ARG INCUBATOR_VER=unknown
RUN ... (à relancer)
Puis relancer la construction de votre conteneur :
$ docker build --build-arg INCUBATOR_VER=1 . -t tak
3/ Lancer son conteneur Docker
Une fois la construction terminée avec succès, vous pouvez lancer votre conteneur avec la commande suivante :
$ docker run -ti -v "/Users/alex/Documents/taking-carott/ionic/:/myApp" -p "8100:8100" tak
Ici, je mappe le port local avec le port du Docker pour y avoir accès directement avec http://localhost:8100 et surtout je monte un volume entre mon Docker et mon ordinateur hôte. De cette manière, le serveur web dans mon Docker peut se servir des fichiers que je modifie dans VS Code, en temps réel.
4/ Rentrer dans un conteneur (Linux) pour y lancer des commandes
Concrètement, on lance une commande depuis un binaire présent sur le conteneur et on en récupère la sortie.
$ docker exec -it docker_tak_1 /bin/bash
A noter que l’on rentre directement dans le conteneur avec les droits root
!
5/ Lister les conteneurs en cours
Pas forcément besoin de raison, à noter que j’utilise également l’extension Docker pour VS Code, je le mentionne car elle est extrêmement intuitive et permet de lister les différentes images et conteneurs sur la machine tout en permettant leur gestion (démarrer, arrêter, supprimer…).
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a5e6c77a1d0d docker_tak "/bin/bash" 3 hours ago Up 14 seconds 0.0.0.0:8100->8100/tcp docker_tak_1
Vous pouvez rajouter l’option -a
à cette commande pour lister tous les conteneurs créés par Docker sans que ceux-ci soient forcément démarrés.
6/ Envoie un import SQL
On peut très facilement importer un dum SQL depuis Docker.
docker exec -i docker_projectl_db_1 mysql -uroot -p database < ~/Téléchargements/database-production.sql
Si vous utilisez docker-compose
, vous pouvez aussi importer une base de données au lancement de vos dockers en montant le ficher :
volumes:
- ./dump.sql:/home/alex/backup/databases/dump.sql
7/ Stopper tous les containers
Il se peut que vos dockers s’ouvrent en même temps que d’autres, surtout avec Docker-Compose.
Voici une commande pour stopper tous les conteneurs Docker sur votre ordinateur.
$ docker stop $(docker ps -q)
6637463112b9
bb4e20e2b520
891934e9ca72
73aa262467ef
Docker-compose, rendre Docker encore plus simple
Même lorsque je n’ai qu’un seul conteneur à lancer, j’utilise docker-compose
. Il me permet d’avoir un fichier de configuration clair et efficace et surtout de ne pas avoir à me souvenir des commandes à rallonge pour lancer un docker, comme créer un point de montage, partager le réseau, les ports…
conf
+--- docker
| +--- docker-compose.yml
| +--- Dockerfile
| +--- tools
| | +--- after-install.sh
Le contenu de mon fichier docker-compose.yml
est plutôt simple :
version: '2' services: tak: build: context: './' dockerfile: ./Dockerfile ports: - '8100:8100' networks: - main volumes: - /Users/alex/Documents/taking-carott/ionic-webapp/:/myApp tty: true networks: main: driver: bridge
Pour lancer les commande ci-dessous, vous devez être dans le dossier où se trouve le fichier de configuration. Les commandes les plus utiles :
docker-compose up
: lance tous le conteneursdocker-compose up -d
: lance tous les conteneurs en mode détachédocker-compose down
: arrête tous les conteneursdocker-compose up|down --remove-orphans
: stop les autres conteneurs en cours si ces derniers ne sont pas inscrit dans ledocker-compose.yml
courant
Conclusion
Je compte utiliser Docker pour chaque nouveau projet, quitte à utiliser un conteneur pour plusieurs projets (par exemple un Docker PHP7 qui me servirait pour plusieurs applications Symfony).
L’idée d’avoir un environnement précis pour chacun projet me séduit d’autant plus que ma tâche de développeur est simplifiée pour me permettre de gagner en productivité ; car on a tous passé des heures à déboguer un projet pété à cause d’une mise à jour foireuse !