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.