Voici le premier d’une série d’articles sur Docker. L’idée de cette série d’article est de servir de journal de bord d’installation, ainsi que, comme le nom le veut suggérer, d’exploration des possibilités qu’offrent les architectures basées sur Docker.

Vous pourrez, à défaut d’être le héros (le poste est déjà pris), participer à ces aventures ! Vous pouvez me contacter par Google+ :  DenisVALDENAIRE , sur Twitter : ValdenaireDenis , etc. (voyez en bas de page les moyens de me contacter par mail ou LinkedIn) et je ferai mon possible pour répondre à vos questions par des expérimentations, utiliser vos suggestions, etc.

Introduction

J’ai décidé d’utiliser Docker pour héberger les applications que je développe. Au moment précis où je commence, je ne sais pas du tout où je vais atterrir, bien que j’aie tout de même un but précis en tête. Pour commencer je vais donc décrire l’architecture cible de l’ensemble d’applications et comment elles devraient fonctionner de manière coopérative.

Un premier brouillon de l’architecture

Brouillon d'architecture

Les applications en question sont des applications “web”, mot fourre-tout qui signifie qu’elles s’utilisent avec un navigateur.

Il y a d’abord une base de données, qui fonctionnera sous MariaDB (une base de données qui remplace MySQL).

Les applications seront écrites en PHP; pour l’instant ce sera du MVC assez simple, par exemple avec un framework CakePHP, mais dans le futur, j’aimerai autant qu’elles soient en deux parties, une partie purement HTML/Javascript (avec React, par exemple), et une partie purement API (sans doute toujours en PHP, mais pourquoi pas en javascript, par exemple sur NodeJS avec Express ?)

Une partie commune à toutes ces applications sera un composant applicatif central qui s’occupera de gérer l’authentification, ainsi que les sessions, et sans doute d’autres services (envoyer du mail, stocker des fichiers, etc.)

D’après ce que je vois, l’accès aux applications se fera sur un serveur HTTP (à mon avis Apache, quoique NGinX ne me semble pas mal non plus, mais je le connais peu) qui portera le certificat SSL avec un nom de domaine unique.

Derrière ce premier frontal, un routeur prendra place. Il distribuera les requètes vers les applications.

Installation de Docker CE

Pour commencer, je vais installer Docker sur mon portable. Je n’ai pas une machine de course, c’est un vieux Dell Latidude E4300, avec un dual-core à 2.4GHz, et 4 Go de RAM. Espérons que ça suffira… L’OS est Debian 9, 64 bits.

Je suis donc les instructions ici :

https://docs.docker.com/engine/installation/linux/docker-ce/debian/#install-docker-ce

J’installe quelques paquets, la clé du Docker repository, le repository stable, je mets à jour la liste des paquets et j’installe docker-ce.

Ça s’installe très vite, d’où je conclue que ça n’installe pas grand chose (pour l’instant).

Je lance la commande de test :

docker run hello-world

Et ça marche !

Je passe par la page de post-installation; sur mon poste, j’aimerai autant pouvoir manipuler les trucs sans être root, on verra ensuite pour la production.

https://docs.docker.com/engine/installation/linux/linux-postinstall/

Quelques essais

Je commence direct à essayer de faire tourner une de mes applis dans un docker. Je crée un Dockerfile à la racine de mon projet, contenant:

FROM php:7.1-apache
COPY webroot/ /var/www/html/

webroot étant le répertoire qui contient les sources, bien sur.

Je lance le build:

docker build -t saas .

Note : c’est pas plus mal quand on enregistre réellement le Dockerfile…

Le build télécharge des modèles qu’il empile les uns sur les autres. C’est assez volumineux, quoique pour un runtime complet apache+php, ça reste normal.

Je tente de le lancer :

docker run -d --name running-saas saas

Il tourne. Enfin, je crois. Aucun signe. Où le joindre ? Je l’ignore.

Je le stoppe avec :

docker stop running-saas

Je crois avoir trouvé un paramètre supplémentaire à passer à l’exécution:

$ docker run -p 8080:80 -d --name running-saas saas
docker: Error response from daemon: Conflict. The container name "/running-saas"
is already in use by container "2d8ee...73d". You have to remove (or rename)
that container to be able to reuse that name.

Bon visiblement run, c’est pas la bonne commande quand le container existe déjà.

docker rm running-saas
docker run -d -p 8080:80 --name running-saas saas

Est-ce que je suis vraiment obligé de l’effacer juste pour changer un paramètre ? On dirait que oui, mais j’essaierai d’approfondir ce point plus tard.

Maintenant le container est joignable sur le port 8080 de ma machine.

Il y a des problèmes de configuration; l’adresse du serveur de session (c’est lui-même) n’est pas la bonne. D’après ce que je comprends, il va falloir que je reconstruise l’image jusqu’à arriver à un résultat.

D’autre part, il n’y a pas l’extension mysqli - et c’est tout pour l’instant.

Je vais avoir besoin de memcached. Je modifie donc le Dockerfile:

FROM php:7.1-apache
COPY webroot/ /var/www/html/
RUN apt-get update && apt-get install -y libmemcached-dev zlib1g-dev \
    && pecl install memcached-3.0.3 \
    && docker-php-ext-enable memcached
RUN apt-get install -y \
            libfreetype6-dev \
            libjpeg62-turbo-dev \
            libmcrypt-dev \
            libpng12-dev \
            libmariadbd-dev \
        && docker-php-ext-install -j$(nproc) iconv mcrypt \
        && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ \
            --with-jpeg-dir=/usr/include/ \
        && docker-php-ext-install -j$(nproc) gd \
        && docker-php-ext-install -j$(nproc) mysqli

J’arrête, j’efface le docker et l’image… et je rebuilde.

$ docker stop running-saas
$ docker rm running-saas
$ docker rmi saas
$ docker build -t saas .

C’est long, mais au final, ça fonctionne, l’extention MySQLi est activée. Par contre la configuration est toujours pas la bonne.

Pour la suite

Comment je peux modifier en mettant juste à jour un fichier de configuration ?

Je dirais qu’il faut construire d’abord un modèle avec tout ce qui va bien, et ENSUITE, construire des container avec les applications héritant de ces modèles.

Par contre, je me demande si c’est vraiment utile d’avoir apache dans le docker ? Est-ce que juste PHP ça pourrait pas suffire ?

La réponse à ces questions (ou comment ne pas se les poser) dans l’épisode 2 : Adventures with Docker - Part 2