Si je veux faire tourner plusieurs serveurs web sur une seule adresse IP il va falloir un serveur nginx pour faire proxy.
Ce sera donc le premier containeur !
Voici le Dockerfile qui va servir à la création :
# nginx
#
# VERSION 0.1.0
FROM ubuntu:quantal
MAINTAINER Thomas Montfort <thomas@montfort.fr>
# Pas de warning, tout automatique
ENV DEBIAN_FRONTEND noninteractive
# mise a jour - -y pour ne pas avoir de question
RUN apt-get update -y; \
apt-get upgrade -y
# supervisord
RUN apt-get install -y supervisor
# sshd
RUN apt-get install -y ssh
RUN mkdir -p /var/run/sshd
# Config minimale de sshd pour supervisor
RUN /bin/echo -e "[program:sshd] \ncommand=/usr/sbin/sshd -D \n" > /etc/supervisor/conf.d/sshd.conf
# Config minimale de nginx pour supervisor
RUN apt-get -y install nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN /bin/echo -e "[program:nginx] \ncommand=/usr/sbin/nginx \n" > /etc/supervisor/conf.d/nginx.conf
# 2 volumes visibles par l'hote
VOLUME /etc/nginx/sites-enabled
VOLUME /var/log/nginx
# On expose les ports 22 et 80
EXPOSE 22 80
# Au demarrage du containeur on lance supervisord
CMD ["/usr/bin/supervisord", "-n"]
J’utilise supervisor car cela semble être la méthode la plus répandue dans les containeurs pour démarrer les processus.
La configuration de nginx se limite à ne pas le démarrer en daemon.
Deux répertoires sont exportés vers l’hôte, /var/log/nginx pour les logs du serveurs et /etc/nginx/sites-enabled pour la configuration des différents sites web.
Dans un premier temps la configuration des sites se fera à la main avant de sans doute être automatisée.
Voici la configuration à placer dans sites-enabled pour un premier site web, par exemple ghost :
server {
listen 80; ## listen for ipv4; this line is default and implied
listen [::]:80 default_server ipv6only=on; ## listen for ipv6
# Make site accessible from http://localhost/
server_name thomas.montfort.fr;
location / {
proxy_pass http://ADRESSE_IP_GHOST:2368;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
La configuration est minimaliste mais fonctionnelle. La seule chose à changer à la main avant de démarrer nginx est l’adresse IP du containeur qui contiendra ghost. On peut récupérer cette adresse ip avec la commande docker inspect CONTAINER | grep IP
.
On peut lancer le containeur nginx avec la commande :
docker run -d -name nginx -p 80:80 -p 22 -link ghost:ghost -v /root/docker/nginx/sites-enabled/:/etc/nginx/sites-enabled -v /root/docker/nginx/logs:/var/logs/nginx montfort/nginx
Quelques explications sur la commande :
- on démarre le containeur en mode détaché en lui donnant le nom nginx,
- le port 80 est exposé sur le port 80 de l’hôte et le port 22 est attribué de manière dynamique,
- on définit un lien docker ghost:ghost pour relier le containeur de nom ghost dans ce containeur avec l’alias ghost pour accéder à son réseau et ses variables d’environnement,
- on exporte les deux volumes vers des répertoires de l’hôte.
Voici un premier containeur nginx qui ne fait pas grand chose… Un containeur ghost va vite arriver.