Blog

Astuce pour optimiser Composer dans vos containers Docker

Partager le dossier de cache

Lorsque vous lancé Composer celui ci va télécharger la liste des packages au format JSON pour les stocker dans un dossier de cache.

Capture%20d%E2%80%99%C3%A9cran_2018-08-13_14-29-02.png

Quand vous lancé votre container celui ci est vide, donc vous perdez 30s à chaque fois que vous le lancer.

L'idée ici est d'aller chercher votre dossier de cache local pour le monter sous forme de volume

Drupal Docker

Mise en place d'une architecture Docker + Drupal 8

Sa y est, j'ai enfin franchi le cap. j'ai migré tout mon site sur une architecture full Docker en dev, test et prod.

Je vais vous expliquer dans cet article, comment j'ai réussi à mettre tout ça en place

Paragraphes
Pleine largeur

Mon environement de dev

Texte simple

Depuis que j'ai réinstallé mon poste (sous Fedora), j'ai décidé de travailler exclusivement avec Docker pour des questions de performance, de simplicité et de RAM (même si j'ai 16Go de ram sur mon environnement de dev).

Tout les sites que je développe sont basé sur une version de drupal-composer/drupal-project. dont voici l'exemple d'une hiérarchie

Image
Texte simple

Dans cette hiérarchie, nous allons trouver un fichier docker-composer.yml qui va contenir tous les containers de notre projet :

  1. version: "3.3"
  2.  
  3. services:
  4.  
  5.   web:
  6.     image: libert/drupal_php_apache_dev:php-7.0
  7.     labels:
  8.      - "traefik.enable=true"
  9.      - "traefik.frontend.rule=Host:${DRUPAL_TRAEFIK_FRONTEND_RULE_HOSTNAME:-www.famillewallon.localhost}"
  10.     depends_on:
  11.       - mysql
  12.       - redis
  13.       - mail
  14.     volumes:
  15.       - .:/project
  16.       - ./config/php/php.ini:/usr/local/etc/php/php.ini
  17.       - ./config/httpd/extra/httpd-vhosts.conf:/etc/apache2/sites-enabled/httpd-vhosts.conf
  18.  
  19.   mysql:
  20.     image: mysql:5.7
  21.     environment:
  22.       MYSQL_USER: drupal
  23.       MYSQL_PASSWORD: drupal
  24.       MYSQL_DATABASE: drupal
  25.       MYSQL_ROOT_PASSWORD: drupal
  26.     volumes:
  27.       - ./config/mysql:/etc/mysql/conf.d
  28.       - ./data/db:/var/lib/mysql
  29.  
  30.   redis:
  31.     image: redis:4.0-alpine
  32.     volumes:
  33.       - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
  34.     entrypoint:
  35.       - docker-entrypoint.sh
  36.       - /usr/local/etc/redis/redis.conf
  37.  
  38.   mail:
  39.     image: djfarrelly/maildev
  40.     labels:
  41.        - "traefik.enable=true"
  42.        - "traefik.frontend.rule=Host:${DRUPAL_TRAEFIK_MAIL_RULE_HOSTNAME:-mail.famillewallon.localhost}"
  43.        - "traefik.port=80"

Ici, nous allons retrouver 4 images

  • libert/drupal_php_apache_dev:php-7.0 : Une image apache + PHP 7.0 en mod_php sous debian avec drush, Drupal console et une conf pour reverse proxy Traefik
  • mysql:5.7 : Notre serveur MySQL
  • redis:4.0-alpine : Un serveur de cache Redis
  • djfarrelly/maildev : Un container qui simule une boite mail

Chose assez basique, pour celles et ceux qui travaillent sur Docker

L'environnement de Test et de Prod

L'historique

Texte simple

Historiquement, j'avais 2 containers Lxc, le souci que l'on rencontre généralement dans ce cas là (valable également pour les VMs) :

  • Problème de version de PHP entre les différents environnement
  • Conf différentes
  • Distributions différentes
  • Lourdeur des containers Lxc ou VMs

C'est pour toutes ces raisons que je suis partie sur docker dans mes environnements de test et de prod.

 

Mon Architecture

Image
Texte simple

Pour mes environnements de test et de prod, je me suis basé sur un hyperviseur Proxmox.

Dans le schéma ci dessus, les requêtes web arrive sur un Reverse proxy Nginx "Central" pour renvoyer toutes les requêtes du site de prod et de test sur un reverse proxy Traefik

 

Le Reverse Proxy Traefik

Texte simple

Le Reverse Proxy Traefik va pouvoir éviter de renseigner un port pour les différentes machines web docker, ainsi on peut démarrer autant de container que l'on veut en même temps

Dans mon cas, il sera externe à mes docker-compose de test et de prod

  1. root@vsrv2:/var/lib/vz/docker/traefik# cat docker-compose.yml
  2. version: '2'
  3.  
  4. services:
  5.   traefik:
  6.     image: traefik:1.6-alpine
  7.     ports:
  8.       - 80:80
  9.     network_mode: host
  10.     volumes:
  11.       - /var/run/docker.sock:/var/run/docker.sock
  12.       - ./traefik.toml:/etc/traefik/traefik.toml

 

  1. root@vsrv2:/var/lib/vz/docker/traefik# cat traefik.toml
  2. logLevel = "WARNING"
  3. [entryPoints]
  4.     [entryPoints.http]
  5.     address = ":80"
  6. [docker]

 

 

Exemple avec l'environement de Prod

Texte simple
  1. root@vsrv2:/var/lib/vz/docker/site_famillewallon# cat docker-compose.yml
  2. version: "3.3"
  3.  
  4. services:
  5.  
  6.   web:
  7.     image: libert/drupal_php_apache_dev:php-7.0
  8.     labels:
  9.       - "traefik.enable=true"
  10.       - "traefik.frontend.rule=Host:${DRUPAL_TRAEFIK_FRONTEND_RULE_HOSTNAME:-www.famillewallon.com}"
  11.     depends_on:
  12.       - redis
  13.     volumes:
  14.       - .:/project
  15.       - ./config/php/php.ini:/usr/local/etc/php/php.ini
  16.       - ./config/ssmtp/ssmtp.conf:/etc/ssmtp/ssmtp.conf
  17.       - ./config/httpd/extra/httpd-vhosts.conf:/etc/apache2/sites-enabled/httpd-vhosts.conf
  18.   redis:
  19.     image: redis:4.0-alpine
  20.     restart: always
  21.     volumes:
  22.       - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf
  23.     entrypoint:
  24.       - docker-entrypoint.sh
  25.       - /usr/local/etc/redis/redis.conf
  26.  
  27.   webhook:
  28.     image: libert/docker-gitlab-webhook:latest
  29.     ports:
  30.       - 8081:80
  31.     volumes:
  32.       - .:/app
  33.       - /var/run/docker.sock:/var/run/docker.sock:ro
  34.       - /root/.ssh:/root/.ssh
  35.     environment:
  36.         REPOSITORY: drupal-composer
  37.         TOKEN: my_token
  38.         BRANCH: master
  39.         COMPOSE_PROJECT_NAME: site_famillewallon
  40.         POST_SCRIPT: docker-compose exec -T web /project/scripts/update.sh

 

Ici, nous allons retrouver 3 images

  • libert/drupal_php_apache_dev:php-7.0 : Une image apache + PHP7 en mod_php sous debian avec drush, Drupal console et une conf pour reverse proxy Traefik
  • redis:4.0-alpine : Un serveur de cache Redis
  • libert/docker-gitlab-webhook:latest : Un container qui intègre un webhook gitlab en python pour gérer automatiquement les pulls git et ensuite lancer la commande update.sh (composer install, drush updatedb...) dans mon container web

Pour des raisons de manque de Ram sur mon serveur, Mysql est externalisé sur une VM mutualisé

 

Et une UI pour gerer les containers ?

Texte simple

Pour gérer mes containers de manière graphique (visualisation des logs , utilisation de la RAM par container...), j'utilise Portainer.io

Image
Image
Pleine largeur

Et enfin comment démarrer tout ce petit monde au boot du serveur physique

Texte simple

Pour faire démarrer tout ce petit monde au boot, je me suis créée un petit script systemd

  1. [Unit]
  2. Description=%i service with docker compose
  3. Requires=docker.service
  4. After=docker.service
  5.  
  6. [Service]
  7. Restart=always
  8.  
  9. WorkingDirectory=/var/lib/vz/docker/%i
  10.  
  11. # Remove old containers, images and volumes
  12. ExecStartPre=/usr/bin/docker-compose down -v
  13. ExecStartPre=/usr/bin/docker-compose rm -fv
  14.  
  15. # Compose up
  16. ExecStart=/usr/bin/docker-compose up
  17.  
  18. # Compose down, remove containers and volumes
  19. ExecStop=/usr/bin/docker-compose down -v
  20.  
  21. [Install]
  22. WantedBy=multi-user.target

Enfin il me restait plus qu'à démarrer les services et à les activer au boot

Drupal Docker

Automatiser la création d'un site Drupal sur sa machine de dev à l'aide d'Ansible

Il peut être intéréssant de pouvoir créer à la voler des sites Drupal sur sa machine de dev.

Cet article n'a pas pour vocation de vous faire un cours sur Ansible mais de vous montrer un example de ce que j'ai fait pour me faciliter la vie.

https://gitlab.famillewallon.com/ansible-playbook/drupal-site-install

Tout d'abord voici l'arborescence de mon playbook

Drupal ansible