Une image Docker pour Web2py

J’ai récemment découvert Docker. Docker permet d’empaqueter une applications et tout son environnement dans un « conteneur » afin de pouvoir le déployer facilement sur une autre machine, serveur,…

Il est par exemple possible de créer une image Docker pour un serveur Web, une autre pour une serveur de base de données et une troisième pour une application spécifique. Ces images pourront servir à développer l’application. Une fois l’application prête à être déployée sur un serveur de test puis sur un serveur de production, il suffira de copier les conteneurs correspondant à ces applications sur le serveur de test et de production. Ainsi, lors de toutes les étapes de développement, le même environnement d’exécution est utilisé.

Il s’agit là d’un exemple assez complexe, mais moi, je commence simple : j’ai mis au point une petite image Docker permettant de créer un conteneur  exécutant Web2Py, le framework Python que j’utilise pour mes développements web.

Le but de cette image est de contenir tout ce qui est nécessaire pour exécuter Web2Py, ni trop, ni trop peu, afin de servir d’image générique pour exécuter le framework. Les applications à exécuter ne sont pas inclues dans l’image, elles seront ajoutées au système de fichier du conteneur en utilisant un ‘volume’.

Voici la structure de répertoire que j’ai utilisée :

web2py
  |
  ---- certificates
  |         |
  |         ---- server.crt
  |         ---- server.key
  |
  ---- web2py_src
  |
  ---- Dockerfile

Le certificat et la clé sont générés avec la commande suivante:

openssl req -new -x509 -days 365 -subj "/C=BE/ST=The_State/L=The_Locality/O=The_Name/CN=The_Domain" -nodes -out server.crt -keyout server.key

Et voici le fichier Dockerfile:

# Pour créer une image sur une machine x86/x64
FROM debian:jessie

# Pour créer une image sur le RaspberryPi
#FROM sdhibit/rpi-raspbian

MAINTAINER jf jf@codingfield.com

# Update apt repositories and install Python
RUN apt-get update && \
    apt-get install -y python && \
    apt-get clean

WORKDIR /opt/web2py

# Copy Web2py
ADD web2py_src/ /opt/web2py/
ADD certificates/* /opt/web2py/

# Expose port 8000
EXPOSE 8000

# Run web2py
ENTRYPOINT ["./web2py.py", "-i", "0.0.0.0", "-a", "UnSuperMotDePassePourAdmin", "-c", "/opt/web2py/server.crt", "-k", "/opt/web2py/server.key"]

Comme vous pouvez le voir dans les commentaires, j’ai utilisé deux images de base différentes:

  • debian:jessie: l’image de base de Debian Jessie sur machine « Intel » (x86/x64). Cette image de base fonctionne sur n’importe quel PC ou serveur utilisant une architecture Intel (Intel et AMD)
  • sdhibit/rpi-raspbian: Une image de base conçue pour fonctionner sur le RaspberryPi.

Il doit sans doute y avoir un moyen plus intelligent pour créer un Dockerfile « multi-architecture », mais je n’ai pas encore pris le temps de chercher.

Les étapes suivantes sont assez simples:

  • RUN: Mise à jours du repository APT et installation de Python
  • WORKDIR: Le répertoire de travail sera /opt/web2py
  • ADD: Copie des fichiers de Web2py et des certificats depuis le répertoire courant de la machine hôte jusqu’au répertoire /opt/web2py du conteneur
  • EXPOSE: le port 8000 sera accessible en dehors du conteneur
  • ENTRYPOINT : Commande à exécuter lors du lancement du conteneur. Il s’agit donc de lancer web2py sur toutes les interfaces réseau, avec un mot de passe pour l’interface d’administration et la clé/certificat pour permettre le fonctionnement en HTTPS.

Pour créer l’image, il faut exécuter la commande docker build (depuis le répertoire contenant le fichier Dockerfile):

$ docker build -t my_web2py .

Dans ce cas, l’image s’appellera ‘my_web2py’.

Pour lancer le conteneur (en lui attribuant le nom ‘web2py_dev’):

$ docker run --name=web2py_dev -d -p 8000:8000 my_web2py

Et si on veut y exécuter une application web2py disponible sur la machine hôte:

$ docker run --name=web2py_dev -d -p 8000:8000 -v /home/jf/UneAppWeb2Py:/opt/web2py/applications/UneAppWeb2Py my_web2py

L’option -v va monter le répertoire local « /home/jf/UneAppWeb2Py » dans le système de fichier du conteneur correspondant au répertoire dans lequel Web2py s’attend à trouver les applications à exécuter.

Ensuite, il suffit de naviguer sur l’adresse de la machine hôte pour voir le résultat:

https://hôteDocker:8000/UneAppWeb2Py

Cette image peut encore être améliorée:

  • Il devrait être possible de gérer plusieurs architectures (Intel/ARM, dans ce cas) + facilement qu’en commentant une ligne du Dockerfile
  • Le certificat/clé sont embarqués dans l’image Docker. Or, pour être totalement générique, il faudrait que ceux-ci soient inclus sous forme d’une ‘volume’, de la même façon que les fichiers de l’applications sont inclus (via -v).

Amusez-vous bien avec Docker!

Laisser un commentaire

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