Docker : Stack Serveur Web

Comment mettre en place une stack serveur web avec docker compose version 2 ? Cette stack contient php, nginx, mysql et adminer. Vous aurez deux points d'entré : celui du adminer (port 8091), et celui de nginx (port 8090). Pour les pressés, retrouvez le code complet en bas de page. man_technologist

Service PHP

  # --- PHP 7.2
  php:
    image: bitnami/php-fpm:7.2
    restart: always
    volumes:
      - /home/monprojet/html:/app
      - /home/monprojet/conf/php.ini:/opt/bitnami/php/etc/conf.d/php.ini:ro

Ce service contient deux volumes :

  • /app : contient le code de votre application,
  • /opt/bitnami/php/etc/conf.d/php.ini : contient la configuration php.ini (voir code ci-dessous).

Voici le contenu de mon php.ini :

; miscellaneous
; -------------

expose_php = off

; resource limits
; ---------------

max_execution_time = 60
max_input_time = 60
memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 20M

; opcache
; -------

opcache.enable = 1
opcache.fast_shutdown = 1
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 7963
opcache.memory_consumption = 192

Service Nginx

  # --- nginx 1.14
  nginx:
    image: bitnami/nginx:1.14
    restart: always
    depends_on:
      - php
    volumes:
      - /home/monprojet/html:/app
      - /home/monprojet/conf/site.conf:/opt/bitnami/nginx/conf/vhosts/site.conf:ro
ports:
- 8090:8080

Pour ce service, vous avez les mêmes volumes mais cette fois avec la configuration du virtual host nginx :

  • /app : contient le code de votre application,
  • /opt/bitnami/nginx/conf/vhost/site.conf : contient la configuration du virtual host (voir ci-dessous).
server {
root /app/public;
listen 0.0.0.0:8080;
server_name _;
index index.php;
charset utf-8;
client_max_body_size 20M;
port_in_redirect off;

# Content security headers
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

# Base configuration for correct URL handling
location / {
try_files $uri $uri/ /index.php?$query_string;
}

# Define extra options for CSS and Javascript files
location ~* \.(?:css|js|map|scss)$ {
expires 30d;
access_log off;
add_header Cache-Control "public";
try_files $uri @fallback;
}

# Redirect error pages to index.php
error_page 404 /index.php;
error_page 403 /index.php;

# Configuration of the PHP handler
location ~ \.php$ {
fastcgi_pass php:9000;

try_files $uri /index.php;
include fastcgi.conf;
fastcgi_keep_conn on;
fastcgi_intercept_errors on;
fastcgi_index index.php;
fastcgi_read_timeout 300;
}
}

Pour une utilisation classique, vous n'avez à modifier que la ligne root /app/public pour pointer vers le dossier de votre index.php.

Service MySQL et Adminer

  # --- mysql 5.7
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: mabase
      MYSQL_USER: monutilisateur
      MYSQL_PASSWORD: monmotdepasse
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
     
  # --- adminer   
  adminer:
    image: adminer
    restart: always
    ports:
      - 8091:8080
    environment:
      ADMINER_DEFAULT_SERVER: db

Cette fois-ci rien de compliqué et aucune configuration externe. Pour le service mysql, utilisez les variables d'environnement pour créer votre utilisateur et base mysql. Pour une solution sécurisée ces éléments peuvent être mis en variable d'environnement afin qu'ils ne soient pas accessibles dans le docker-compose directement.

La stack complète

version: "2"

services:   
  # --- PHP 7.2
  php:
    image: bitnami/php-fpm:7.2
    restart: always
    volumes:
      - /home/monprojet/html:/app
      - /home/monprojet/conf/php.ini:/opt/bitnami/php/etc/conf.d/php.ini:ro

  # --- nginx 1.14
  nginx:
    image: bitnami/nginx:1.14
    restart: always
    depends_on:
      - php
    volumes:
      - /home/monprojet/html:/app
      - /home/monprojet/conf/site.conf:/opt/bitnami/nginx/conf/vhosts/site.conf:ro
    ports:
      - 8090:8080


  # --- mysql 5.7
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: mabase
      MYSQL_USER: monutilisateur
      MYSQL_PASSWORD: monmotdepasse
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
     
  # --- adminer   
  adminer:
    image: adminer
    restart: always
    ports:
      - 8091:8080
    environment:
      ADMINER_DEFAULT_SERVER: db

Commentaires