Aller au contenu

Créer son environnement avec Docker (partie 2)

Dans un précédent article, on a vu le principe de Docker, on a fait nos premiers pas dessus… C’était mignon 🙂 On est grand maintenant, et les choses sérieuses commencent enfin !

Conteneur PHP/Apache

On va créer notre conteneur Apache avec PHP intégré. Pour cela, on pourrait partir d’une image Ubuntu, installer apache, puis sauvegarder l’image. Mais comme on découvre, on va pas s’emmerder, on va utiliser une image d’un contributeur, qui est surement plus expérimenté que nous.
En voilà une qui fait l’affaire : eboraas/apache-php.

Au niveau des options, on précise la redirection de ports (-p 80:80) et l’image qu’on veut utiliser (-d eboraas/apache-php). Maintenant, tu peux y accéder en allant sur 127.0.0.1. C’était pas compliqué n’est-ce pas ?

– Euh, c’est cool, mais mes projets, j’y accède comment ?

On procède comme pour une machine virtuelle; on va pointer notre dossier « www » vers celui du conteneur.
On va d’abord partager notre disque avec Docker. Il suffit de cliquer sur la baleine blanche en bas à droite, d’aller dans « Settings », puis l’onglet « Shared Drives ». Cochez votre disque, puis « Apply ».
Une fois confirmé, on relance un conteneur mais cette fois ci :

Vas sur 127.0.0.1:8080. Cette fois, on pointe bien vers nos projets !

On remarque deux choses :

  • On utilise désormais le port 8080, alors que la première fois on utilisait le port 80
  • On est sur un PHP5.6 au lieu de PHP7.0

Si on est sur un PHP5.6, c’est tout simplement parce qu’on a utilisé l’image d’une autre personne, et il a installé cette version là. Pour l’instant on va s’en contenter.
Pour l’histoire du port, c’est pour te montrer quelque chose. Fais un coup de « docker ps » :

Deux conteneurs ! En effet, on n’a pas stoppé la précédente. Au moins tu vois qu’on peut en lancer plusieurs sans problème. Et si tu fais « docker ps -a » tu verras tous les conteneurs que tu as sur ta machine. Pour le moment on va juste les stopper, on fera le ménage plus tard :

– Donc pour mon environnement, je dois, à chaque fois, lancer pleins de lignes de commandes, avec un tas de paramètres ?

On pourrait faire comme ça, mais on arriverait à des lignes de commandes interminables… Et on est fainéant, donc on va utiliser une technique plus simple : Docker-compose !

Docker-compose

On l’a vu dans l’article précédent, que docker-compose permet de lancer plusieurs conteneurs. Le principe est simple : On crée un fichier YML « docker-compose.yml », et on va y mettre notre configuration. Pour notre serveur, ça sera :

Puis on se met au même niveau, et on fait :

Faisons un premier point sur le fichier « docker-compose.yml » :

  • apache : C’est le nom que portera notre conteneur. Auparavant il était généré par Docker.
  • image : C’est l’image qu’on utilise, ici on reprend la même qu’avant.
  • ports : La liste des ports qu’on souhaite rediriger. On peut en ajouter plusieurs.
  • volumes : Les répertoires qu’on partage, ici le fameux « www ».
  • environment : Les variables d’environnement qu’on défini à Apache.

Ensuite, la commande « docker-compose up » utilise ce fichier pour créer le ou les conteneurs, avec leurs paramètres. Attention, nos conteneurs sont actifs tant qu’on ne quitte pas la console. Si on voulait lancer la commande en détachant la console, il faut faire :

– Et les autres conteneurs alors ?

J’allais y venir. Je vais accélérer un peu les choses, et te donner directement le docker-compose à faire :

Puis comme d’habitude :

On ajoute simplement un conteneur MySQL. Tu peux remarquer que cette fois, on a utilisé le paramètre « volumes_from ». Ca sert à monter directement les répertoires des conteneurs ciblés. Il peut être utile dans plusieurs cas, dont la factorisation de code (chose que l’on fera plus tard).

Une autre subtilité ici, c’est le paramètre « links » qu’on a ajouté au conteneur « web ». Ca signifie qu’on relie le conteneur « web » à « mysql », et qu’on le surnomme « db ». Ajoute un PMA dans votre « www », et si tu essayes de l’utiliser, tu auras une jolie erreur :

Il faut aller dans « config.inc.php » de ton PMA et utiliser « db » en hôte, car notre conteneur « web » le connait à travers ce nom :

Une fois fait, tu peux t’y connecter :

– Et Nginx ?

On a vu qu’on pouvait lancer plusieurs conteneurs en même temps, donc tu peux soit remplacer le conteneur Apache par un Nginx, soit faire fonctionner les deux ensemble. On aime les défis, donc on va faire la deuxième possibilité :

On crée deux conteneurs supplémentaires : un nginx et un autre php. On utilise Nginx sur le port 8080, pour faire cohabiter Apache avec. On ajoute nos fichiers de configuration dans le répertoire « conf.d » : pour le moment il contiendra seulement un fichier : « nginx.dev.conf ». Bien entendu, tu peux organiser/nommer tes fichiers comme tu veux, ici c’est la manière dont j’aime le faire.
On le relie à notre conteneur « php », qui va se baser sur l’image php, dans la release « 7-fpm ». Quant au conteneur « php », on le relie à « mysql » afin d’établir la connexion à la base de données.
Ces deux conteneurs vont utiliser le même répertoire : « www ». On fait les choses bien, et on ajoute un conteneur de données « www » et on l’associe avec le paramètre « volumes_from ».

On va s’occuper de « nginx.dev.conf » :

Si tu es déjà habitué à configurer et utiliser Nginx, rien ne devrait te surprendre ici. On remarque juste que pour « fastcgi_pass » on appelle le conteneur « php », car c’est lui qui va interpréter notre code PHP.
J’ai ajouté un « server_name » perso, mais ce n’est pas obligatoire. Si tu veux quand même le faire, penses à modifier ton fichier hosts.

On relance le tout :

Et là tu as Apache qui fonctionne sur le port 80 avec PHP5.6, et Nginx sur le port 8080 avec PHP7.

 – Ca y est tout fonctionne !?

Oui… Et non 🙂 On a bien Nginx qui fonctionne avec PHP, mais notre conteneur PHP est vierge de toute extension. Essayes de lancer PMA via Nginx (sur le port 8080 donc !) et tu vas tomber sur cette erreur :

On va donc personnaliser la création du conteneur PHP afin d’avoir nos extensions.

Dockerfile

Pour avoir un conteneur PHP sur mesure, on va utiliser un Dockerfile. Ce fichier servira à Docker pour lui donner quelques détails supplémentaires lors de la création du conteneur : quel image utiliser, les commandes à exécuter…

On va créer un fichier « Dockerfile » dans le dossier « php ». Voilà ce qu’il doit contenir :

Deux choses ici :

  • FROM : on lui indique sur quelle image se baser
  • RUN : la ou les commandes à exécuter. Ici il y en a deux, un simple apt-get update puis un « docker-php-ext-install ». Il s’agit ici de scripts créés pour l’occasion, pour nous simplifier le boulot. On install les extensions qu’on a besoin, c’est à dire mysqli et pdo_mysql.

Au niveau de notre docker-compose, on modifie le conteneur php comme suit :

On a donc remplacé « image » par « build » en lui indiquant où se trouvait notre Dockerfile. On relance la bête :

Tu peux enfin accéder à PMA avec Nginx.

– Mais pourquoi on n’a pas fait un conteneur phpMyAdmin ?

On aurait très bien pu le faire, d’ailleurs je t’encourage à l’ajouter à la config et à le faire marcher 🙂 Je voulais surtout expliquer la création et la personnalisation des conteneurs, et t’aider dans les problèmes que tu peux rencontrer.

Voilà en gros ce qu’on peut faire avec Docker : lancer des conteneurs spécifiques, les faire fonctionner ensemble, les adapter à nos besoins, passer d’une techno à une autre… Tu commences à voir l’utilité de Docker ? Moi aussi 😉

Tu peux retrouver les fichiers de cet article sur mon GitHub. N’hésite pas à y jeter un coup d’oeil, ils sont susceptibles d’évoluer par rapport à l’article.

C’est bien beau de lancer des conteneurs qui font un peu tout, mais il serait intéressant de créer nos propres conteneurs presque from scratch, pour répondre exactement à nos besoins. On verra ça dans le prochain article 🙂

 

Sources :