Résumé

J’ai installé Docker sur mon portable. J’ai essayé de faire tourner un container avec une de mes applis, en lien et place d’une installation ordinaire; d’habitude l’application tourne sur le serveur apache local, se connecte sur la base de données locale, etc.

Ici l’idée, c’est de faire tourner l’application dans un container, qui est comme une sorte de VM très légère, pour en faire une sorte de brique logicielle indépendante.

Construction d’une image générique

J’ai compris à l’usage que la construction des images docker fonctionnait avec des couches successives; en gros, je devrais commencer par me baser sur des images existantes (elles sont fournies par le Docker Hub: https://hub.docker.com/ par différentes sources.) pour construire une image générique qui va contenir les dépendances dont mes applications se servent en général: dans mon cas particulier, il s’agit des librairies pour faire des images, de la classe d’accès à MariaDB/MySQL, et de l’extension MemCached.

Voilà donc mon Dockerfile :

FROM php:7.1-apache
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

Je construit l’image générique :

docker build -t generic-php-saas .
[...]
Removing intermediate container 96d995faa15a
Successfully built 4799c12f1067
Successfully tagged generic-php-saas:latest

Ce qui fait que pour construire l’image du Saas, j’ai un nouveau Dockerfile, plus simple… (et plus rapide, du coup)

FROM generic-php-saas
COPY webroot/ /var/www/html/

Le build prend deux secondes ! C’est la bonne solution.

Maintenant on va essayer de faire un fichier de configuration de l’application adapté à son nouvel environnement.

Pour ça je vais essayer la stratégie qui me semble le plus évidente: lancer le container, essayer de se connecter “dedans” (je sais pas trop si ça a un sens au moment où je formule cette tactique…) et modifier le fichier jusqu’à temps que ça fonctionne.

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

Pour se connecter “dedans” ?

docker exec -it running-saas bash

Ok, donc ya pas d’éditeur. Mais bonne nouvelle, je peux en installer un.

apt-get install vim

J’ai donc besoin de me connecter au MySQL du host, comment je fais exactement ? C’est-à-dire, comment je trouve l’adresse du host (la machine) depuis le container.

En fouinant sur SO, connect-to-mysql-on-localhost-from-docker-container je trouve la commande suivante:

ip route show | grep "default" | awk '{print $3}'

En mettant l’adresse IP résultante dans le fichier de configuration, ça fonctionne, ce qui signifie que j’ai été un peu large dans les permissions de connexion. (mais baste! c’est la dev…) Bon on verra ce point un peu plus tard.

L’adresse du host, pour les container, c’est donc la passerelle par défaut. Je ne sais pas si c’est toujours le cas, mais pour l’instant, oui.

D’autant qu’il semble que la bonne solution soit plutôt de passer par un container qui joue le rôle de MySQL. Encore un truc à voir plus tard.

Maintenant la connexion vers memcached: comme il tourne sur le host, son adresse est la même que celle de MariaDB. Note: ça n’a pas marché du premier coup, pour une raison toute simple: memcached n’écoute que sur l’adresse 127.0.0.1 du host. J’édite le fichier de conf de memcached, je relance, et voilà, c’est mieux.

J’ai encore une erreur:

Warning: Unknown: Failed to write session data using user defined save handler. 
    (session.save_path: ) in Unknown on line 0

Cette erreur se produit à un endroit bien particulier: in Unknown on line 0, cela signifie que c’est après l’exécution du programme PHP - au moment où il ferme et enregistre la session.

Il faut à tout prix que je puisse voir les logs d’erreur du container.

docker logs --follow running-saas

Je vois bien les logs du serveur Apache, mais je ne vois pas les logs de php.

Et malgré différents essais, je ne vois toujours pas de log arriver. Je me rappelle c’est ça qui m’avait arrêté, la dernière fois que j’ai essayé de me servir de Docker. L’accès aux logs est crucial pour développer, et comme j’étais pressé, je n’avais pas poursuivi.

Pour la suite

Bon, j’ai avancé. J’ai un système de stockage de session assez compliqué, en fait, ce qui complexifie l’installation.

La prochaine étape, c’est de pouvoir accéder aux logs d’erreurs pour que je puisse voir ce qu’il se passe.

Dans un futur pas encore bien visible pour le moment, il faudra que les logs soient stockés non pas dans les containers mais dans un endroit centralisé. Par exemple un syslog ? Ou un fluentd ? J’aimerai pouvoir le consulter en temps réel en fonction de leur catégorie (info, warning, error, etc.)

La suite, c’est ici, dans l’épisode 3 : Adventures with Docker - Part 3 - Logs