Une architecture Docker en production

feather

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.

 

Schéma Docker

 

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.

 

Sur le même sujet :