#1 Docker : Réduire le risque de bug sur ses projets

#1 Docker : Réduire le risque de bug sur ses projets
3.5 (70%) 10 votes

Conteneur Docker via Dockerfile dans VSCode

Créer un conteneur Docker facilement

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

https://stackoverflow.com/questions/35154219/rebuild-docker-image-from-specific-step/37798643#37798643

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

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 conteneurs
  • docker-compose up -d : lance tous les conteneurs en mode détaché
  • docker-compose down : arrête tous les conteneurs
  • docker-compose up|down --remove-orphans : stop les autres conteneurs en cours si ces derniers ne sont pas inscrit dans le docker-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 !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.