Aujourd’hui, après avoir parcouru la documentation de Docker, j’ai plein d’idées d’infrastructure qui me viennent en tête 🙂
Un peu en vrac, j’aimerai monter une stack sur mon poste de développement pour une application web en PHP.
Mais avant de partir tout azimut sur quelque chose de compliquer, on va simplement prendre le temps de ce faire un petit conteneur qui fera tourner un serveur web (Apache ou NGINX, j’ai pas encore décidé ^^)
Ce qui m’intéresse de voir, c’est la manipulation du conteneur en ligne de commande, le monitoring de celui-ci, etc…
J’ai déjà vu que sur le hub de Docker, plein de conteneur faisant fonctionner un serveur web sont disponibles.
Le but étant l’apprentissage, on va partir « from scratch » 🙂
Pour commence, voici le DockerFile :
FROM ubuntu:18.04 AS bonjourdocker
RUN apt-get update -y
RUN apt-get install apache2 -y
EXPOSE 80
CMD service apache2 start
Ensuite on se positionne dans le dossier contenant le Dockerfile en ligne de commande et on lance le build :
docker build -t ajegu/bonjourdocker:1.0 .
Voici l’image construite :
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE ajegu/bonjourdocker 1.0 04ea087ad669 5 seconds ago 215MB
Maintenant, on va la démarrer dans un conteneur :
docker run -d -p 8080:80 ajegu/bonjourdocker:1.0
Aie Aie! Ca casse sévèrement ! 🙁
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1080f04847e2 ajegu/bonjourdocker:1.0 "/bin/sh -c 'service…" 5 seconds ago Exited (0) 4 seconds ago angry_goldstine
Le conteneur ne démarre pas, voyons le log :
docker logs 1080f04847e2
* Starting Apache httpd web server apache2 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message *
Apache n’arrive pas à démarrer car il ne peut pas résoudre le nom de domain du conteneur.
Pour corriger cela, il faut ajouter une entrée dans le fichier hosts du conteneur.
On peut faire cela au démarrage du conteneur : 😉
docker run -d -p 8080:80 -h bonjourdocker.domain.local ajegu/bonjourdocker:1.0
On check le log :
* Starting Apache httpd web server apache2 *
Cool :), Apache a bien démarrer !
Par contre, un autre problème apparaît, mon nouveau conteneur est toujours à l’arrêt 👿
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1ee10235ef40 ajegu/bonjourdocker:1.0 "/bin/sh -c 'service…" 7 seconds ago Exited (0) 7 seconds ago distracted_sammet 1080f04847e2 ajegu/bonjourdocker:1.0 "/bin/sh -c 'service…" 8 minutes ago Exited (0) 8 minutes ago angry_goldstine
L’histoire est la suivante:
Docker a besoin qu’un processus s’exécute au premier plan pour que le conteneur reste dans un état actif.
Pour cela, il faut exécuter Apache avec l’option -DFOREGROUND au démarrage du conteneur.
Voici le Dockerfile :
FROM ubuntu:18.04 AS bonjourdocker
RUN apt-get update -y
RUN apt-get install apache2 -y
CMD apachectl -DFOREGROUND
EXPOSE 80
On relance un build, on exécute de nouveau le conteneur à partir de la nouvelle image :
docker build -t ajegu/bonjourdocker:1.1 .
docker run -d -p 8080:80 -h bonjourdocker.domain.local ajegu/bonjourdocker:1.1
Tout est ok, on peut voir que le serveur Apache installé sur le conteneur fonctionne correctement en allant sur l’url localhost:8080
Le bilan de cette première expérience serai la suivante :
– Se méfier du réseau, Docker applique son propre système de routage et cela peut perturber les applications qui en dépendent.
– Toujours spécifier un process qui s’exécutera en premier plan pour que le conteneur reste en vie
Maintenant que le conteneur tourne, j’ai bien envi d’aller voir 2-3 trucs :
– me connecter avec shell au conteneur
– lancer un « top » pour voir les process qui tourne dessus
– voir les logs Apache
Pour se connecter au conteneur :
docker exec -it ID_CONTENEUR bash
Aie 🙁 , premier truc qui me va pas quand je fais un top, c’est que je vois le process apache2ctl qui s’exécute en root.
J’aimerai que ce soit l’utilisateur www-data qui l’exécute.
Bon après investigations, j’ai l’impression que les services doivent s’exécuter en root dans les conteneurs.
N’hésitez pas à réagir là dessus en commentaire si je me trompe.
Bon !
Cette démystification de Docker m’a conforté dans mon idée de l’utiliser pour créer une véritable stack de développement.
Je vais la détailler pas à pas dans de futurs articles mais voici ce à quoi je pense :
– Loadbalancer HAProxy pour utiliser des urls pour joindre mes applis (ex: app1.local)
– Serveur web Apache
– Serveur web NGINX
C’est bien de pouvoir faire le switch de l’un à l’autre rapidement en fonction des projets
– Plusieurs serveurs PHP (5.6, 7.0, 7.1, 7.2)
– MySQL
– PostgreSQL
– Kibana pour recevoir les logs des applis mais aussi des services nginx, apache, php, mysql, etc…
– Jenkins
– Gitlabs
– SonarQube
L’idée s’est de faire fonctionner en symbiose !
Quelques cas d’utilisation en vrac :
Pouvoir check mes logs sur Kibana, switcher de Postgre à MySQL sur une app Symfony, idem pour les version de php et de serveur web, lancer mes tests unitaires, fonctionnels avec Jenkins, contrôler la qualité du code avec Sonar, etc…