Tentons maintenant d'écrire un fichier Dockerfile qui construise la même image Apache que celle que nous avons générée dans l'article précédent.
Après plusieurs tentatives, le fichier Dockerfile le plus simple auquel je suis arrivé est le suivant :
FROM ubuntu:14.04 MAINTAINER <name> <<email>> RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \ apache2 \ libapache2-mod-php5 \ nano \ php5 \ php5-mysql EXPOSE 80 ENTRYPOINT ["/usr/sbin/apache2ctl","-DFOREGROUND"]
Lors d'un premier test, j'ai essayé de modifier le fichier policy-rc.d, comme je l'avais fait auparavant. Mais il est apparu que cela n'était pas nécessaire.
La définition DEBIAN_FRONTEND=noninteractive est là uniquement pour empêcher apt-get d'afficher des messages d'avertissement.
Le paramètre -DFOREGROUND indique à Apache de faire tourner le processus parent en avant-plan, de façon à ce que le container ne termine pas son exécution tout de suite après avoir été lancé.
Pour créer l'image à partir de ce fichier :
docker build -t="<userid>/apache2:v1" .
docker run -p 80:80 -d <userid>/apache2:v1
L'option -d indique à Docker de lancer le container en arrière-plan.
Pour obtenir la liste des containers actifs : docker ps
Pour arrêter le container, utiliser l'id affichée dans la commande précédente : docker stop <containerId>
Et nous y voilà : nous avons une image fonctionnelle, sur la machine de développement, construite grâce à un Dockerfile.
Au lieu de transférer l'image sur mon serveur (la "machine de production"), je transfère le Dockerfile, et construit l'image sur la machine de production. Comme j'ai déjà un serveur web qui tourne là, j'ai besoin d'indiquer un autre port quand je lance le container :
docker run -p 8080:80 -d <userid>/apache2:v1
Le serveur web du container sera atteignable sur le port 8080.
Mise à jour : d'autres articles concernant mes expérimentations avec Docker se trouvent dans la partie anglaise du site. Désolé, je n'ai pas encore eu le temps de les traduire.