Cet article date d'il y a plus d'un an.
Il est possible qu'il ne soit plus à jour.
Une architecture Docker en production
Comme promis, je vous détaille l’architecture que j’ai utilisé pour fournir des containers dans un contexte de TP PHP/MySQL pour des étudiants :
- Chaque groupe de travail/étudiant a son container LAMP.
- En frontend, un reverse proxy Nginx centralise les connexions HTTP(s).
- En backend, un serveur de base de données MariaDB offre une base par groupe/étudiant.
Les Dockerfiles
DB :
Je lance juste un container MariaDB et je crée ensuite les BDD à la main via docker exec :
## TITLE : MariaDB image for Docker ### DESCRIPTION : Based on Debian Jessie (last update : 23-10-2015) #! Usage : #! `docker run --name db -e MARIAPW=rootpass -d tp/mariadb` #! Then link it with an other container like an Apache/Php #! `docker run --name somecontainer -e USERPW=somepass --link db:db tp/tp-lamp` FROM tp/base ENV DEBIAN_FRONTEND noninteractive # Repos, upgrades, installs Apache/PHP5, Maria RUN (apt-get update && apt-get upgrade -y -q && apt-get dist-upgrade -y -q && apt-get -y -q autoclean && apt-get -y -q autoremove) RUN apt-get update && apt-get install -y -q mariadb-server mariadb-common supervisor # Corrects some bug with DBs ENV TERM dumb # Starting service RUN mkdir -p /var/log/supervisor ADD my.cnf /etc/mysql/my.cnf ADD supervisor-maria.conf /etc/supervisor/conf.d/supervisor-maria.conf ADD start.sh /start.sh CMD ["/start.sh"]
Nginx :
## TITLE : NGinx as a reverse proxy for Docker ### DESCRIPTION : Based on Debian Jessie (last update : 23-10-2015) #! Usage : #! `docker run --name frontend -e HOST_NAME="www" -e DOMAIN_NAME="domain.local" --link acontainer:acontainer -d tp/nginx` FROM tp/base ENV DEBIAN_FRONTEND noninteractive # Repos, upgrades, install Nginx RUN (apt-get update && apt-get upgrade -y -q && apt-get dist-upgrade -y -q && apt-get -y -q autoclean && apt-get -y -q autoremove) RUN apt-get update && apt-get install -y -q nginx-light supervisor # Nginx service WORKDIR /etc/nginx RUN mkdir keys ADD default sites-enabled/default ADD supervisor-nginx.conf /etc/supervisor/conf.d/supervisor-nginx.conf ADD nginx.conf nginx.conf ADD index.html /var/www/html/index.html ADD start.sh /start.sh RUN mkdir -p /var/nginx/cache VOLUME /etc/nginx CMD ["/start.sh"]
LAMP :
Mon image LAMP dont les étudiants se servent contient un serveur Apache, PHP5 et Adminer comme logiciel d’administration de base de données. J’installe aussi un serveur SSH pour fournir un terminal et un SFTP pour l’utilisateur www-data.
## TITLE : Apache/PHP image for Docker ### DESCRIPTION : Based on Debian Jessie (last update : 29-10-2015) #! Usage : #! `docker run --name lamp -d tp/tp-lamp` #! You can link it with an already started mariadb container : #! `docker run --name lamp -e wwwpw:a-pass --link db:db tp/lamp` FROM tp/base ENV DEBIAN_FRONTEND noninteractive # Repos, upgrades, installs Apache/PHP5, Maria RUN (apt-get update && apt-get upgrade -y -q && apt-get dist-upgrade -y -q && apt-get -y -q autoclean && apt-get -y -q autoremove) RUN apt-get install -y -q apache2 libapache2-mod-php5 php5 php5-mysql supervisor openssh-server adminer RUN apt-get clean -y # Adminer RUN ln -s /etc/adminer/apache.conf /etc/apache2/conf-available/adminer.conf RUN a2enconf adminer # Apache RUN a2enmod rewrite # Services ADD supervisor-apache-ssh.conf /etc/supervisor/conf.d/supervisor-apache-ssh.conf ADD sshd_config /etc/ssh/sshd_config ADD start.sh /start.sh RUN mkdir /var/run/sshd RUN mkdir -p /var/log/supervisor # User www RUN chsh www-data -s /bin/bash EXPOSE 22 80 CMD /start.sh
Docker-compose en chef d’orchestre
L’ensemble est géré par Docker Compose avec ce fichier docker-compose.yml.
Le plus important à comprendre :
- Tous les containers se lient à db
- Nginx se lie à tous les containers
- Toutes les données importantes (à sauvegarder) sont montées en volume sur l’hôte.
frontend: container_name: frontend restart: always volumes: - /etc/nginx - /var/log image: tp/nginx ports: - "80:80" - "443:443" environment: - DOMAIN_NAME=maboite.fr - HOST_NAME=wwwtp links: - tp1:tp1 - tp2:tp2 - ... db: container_name: db restart: always volumes: - /etc - /var/lib/mysql - /var/log image: tp/mariadb environment: - MARIAPW=AsTrOnGpAsS tp1: # Groupe 1 : restart: always container_name: tp1 image: tp/tp-lamp volumes: - /var/tplamp/1:/var/www/html ports: - "22001:22" environment: - "wwwpw=unmotdepasse" links: - db:db tp2: # Groupe 2 : restart: always container_name: tp2 image: tp/tp-lamp volumes: - /var/tplamp/2:/var/www/html ports: - "22002:22" environment: - "wwwpw=autremotdepasse" links: - db:db # ...
C’est tout, maintenant à vous de jouer.