vendredi 16 décembre 2022

Utilisation de docker-compose pour un projet de développement web

Objectif

  • Docker-compose permet de diffuser rapidement et simplement une infrastructure de développement.
  • Dans notre exemple, le projet doit comporter :
    • Une base de données
    • Un logiciel capable d'administrer cette base de données
    • Un serveur web apache2, avec PHP version 7.4 et Composer
    • Un serveur de courrier
  • Le dossier contenant le projet doit contenir l'ensemble du code que vous développez, ainsi que l'ensemble des fichiers utilisés pour créer l'architecture de travail. Je vous propose d'utiliser l'arborescence de fichiers suivante :
    • Un dossier _BUILD qui contient les définitions des containers qu'il faut personnaliser.
    • Un dossier _VOLUMES qui contient les configurations des différents serveurs, ainsi que votre code de développement
    • A la racine du dossier , on trouve vos scripts de gestion de l'infrastructure ainsi que le fichier "docker-compose.yml"
  • Le dossier contenant le projet peut être facilement sauvegardé (avec GIT ou TAR)

Téléchargement et utilisation du projet "php74_vierge_dev"

  • Installez docker sur votre machine : apt install docker docker.io docker-compose
  • Le projet est disponible ici : Php74_vierge_dev.tgz
  • Placez vous dans le dossier du projet.
  • Je conseille de lancer une première fois le projet en mode "frontal" pour vérifier que tout fonctionne correctement : docker-compose up
  • CTRL+C pour quitter le mode "frontal".

Les images du docker hub

  • Les conteneurs mariadb:10.7 , adminer:4.6 , maildev/maildev:1.1.1 sont utilisés sans aucune modification.
  • Le conteneur php:7.4-apache ne contient pas "composer" et nécessite l'ajout de composants PHP, il faut donc construire une image personnalisée.
  • ATTENTION : Utilisez les versions précise que je propose, car il existe de nombres incompatibilités.

Le fichier Dockerfile

  • Ce fichier permet de construire votre image personnalisée (apache+php+composer)
FROM php:7.4-apache

RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
RUN apt-get update
RUN apt-get install -y --no-install-recommends locales apt-utils git libicu-dev g++ libpng-dev libxml2-dev libzip-dev libonig-dev libxslt-dev
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
RUN echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen
RUN curl -sSk https://getcomposer.org/installer | php -- --disable-tls
RUN mv composer.phar /usr/local/bin/composer
RUN docker-php-ext-configure intl
RUN docker-php-ext-install pdo pdo_mysql gd opcache intl zip calendar dom mbstring xsl

WORKDIR /var/www/
  • FROM : indique l'image source qu'il faut utiliser sur le docker-hub
  • RUN : commandes qui seront lancées une seule fois lors de la création de votre image personnalisée.
    • "locale-gen" est nécessaire pour que la compilation des modules "docker-php-ext-install" se termine sans problèmes.
  • WORKDIR : indique le dossier par défaut

Le fichier docker-compose.yml

version: '3'

services:
  mariadb:
    image: mariadb:10.7
    container_name: mariadb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=btsinfo
    volumes:
      - ./_VOLUMES/mariadb/db:/var/lib/mysql
    ports:
      - "3306"
    networks:
      - dev

  apache2:
    build: ./_BUILD/apache2_php74_composer_img
    container_name: apache2
    restart: always
    depends_on:
      - mariadb
    ports:
      - "80:80"
    volumes:
      - ./_VOLUMES/apache2/log:/var/log/apache2
      - ./_VOLUMES/apache2/www:/var/www/html
      - ./_VOLUMES/apache2/etc:/etc/apache2/sites-enabled
    networks:
      - dev

  adminer:
    image: adminer:4.6
    container_name: adminer
    restart: always
    depends_on:
      - mariadb
    ports:
      - 8080:8080
    networks:
      - dev

  maildev:
    image: maildev/maildev:1.1.1
    container_name: maildev
    command: bin/maildev --hide-extensions STARTTLS
    ports:
      - "1080:1080"
      - "1025:1025"
    restart: always
    networks:
      - dev

networks:
  dev:

Mariadb

  • Dans "environment", on indique le mot de passe pour root
  • Dans "volumes", on donne l'emplacement des fichiers de la base de données. Cela permet la persistance.
  • Dans "ports", on donne uniquement le port d'écoute local (machine mariadb elle même). Il ne doit pas y avoir d'accès direct via la machine hôte.
    ATTENTION : Docker attribue tout de même un port aléatoire coté hôte, ceci est acceptable au niveau sécurité pour une machine de développement.

Apache2

  • Dans "volumes", on partage 3 dossiers :
    • /var/www/html qui va contenir votre développement.
    • /var/log/apache2 pour la persistance des logs.
    • /etc/apache2/sites-enabled qui contient le fichier de configuration du serveur apache.

Adminer

  • J'utilise adminer à la place de phpmyadmin, suite à des problèmes de droits.
  • Le conteneur adminer permet de configurer mariadb.
  • Dans "ports", on réalise le mappage du port local 8080, vers le port 8080 de la machine hôte.
  • Accès à mariadb :
    • Système : Mysql
    • Serveur : mariadb
    • Utilisateur : root
    • Mot de passe : btsinfo
    • Base de données :

Maildev

  • Ce conteneur permet d'avoir un serveur de courrier local :
    • port 1025 pour le SMTP
    • port 1080 pour un Webmail

Networks

  • On déclare ici le pont "dev:". Ce pont sera automatique créé, avec un DHCP associé et un résolution de nom fonctionnelle au niveau des conteneurs.
  • Les règles de NAT et de firewall (iptables) sont également activées sur la machine hôte.

Les scripts de gestion de l'infrastructure

  • lgmUp : lance tous les conteneurs en mode "service". Il y a également une modification des droits au niveau des volumes.
  • lgmDown : arrête tous les conteneurs du projet. Il n'y a pas de perte au niveau des volumes qui sont en persistance.
  • lgmClean : arrête tous les conteneurs sur la machine hôte, ceux du projets ainsi que d'autres si besoin. Un nettoyage "prune" est également réalisé afin de supprimer tout ce qui est inutilisé.

 

dimanche 2 octobre 2022

Distribution Mx linux avec bureau Cinnamon

La Mx 21.2 xfce est basée sur la Debian 11. Après quelques mois d'utilisation je suis globalement satisfait, mais un problème important persiste : l'utilisation simultanée de machines sous VirtualBox et des bureau virtuels est instable. si on déplace une machine virtuelle par glissé/déposé, le  […]

Lire la suite

mardi 25 janvier 2022

Cas d'utilisation : HaProxy derriere une FreeBox

Description de l'infrastructure La FreeBox (192.168.1.1) dispose d'une adresse IP publique fixe. Votre site personnel "foo.mondomaine.fr" dispose d'un enregistrement DNS valide. Le reverse-proxy haproxy est installé sur une Alpine Linux 3.14 (192.168.1.20) Le site web  […]

Lire la suite

vendredi 24 décembre 2021

Utiliser un compte gmail comme relais SMTP

Gmail propose d'utiliser ses services pour envoyer jusqu'a 500 courriers par jour.  Gmail Si vous utilisez l'authentification en deux étapes Connectez vous sur votre compte personnel gmail avec cette URL : https://security.google.com/settings/security/apppasswords Ajoutez un nouveau mot de passe  […]

Lire la suite

dimanche 12 décembre 2021

Mise en oeuvre d'un serveur "gitea"

Introduction Gitea est un dépôt git complet (HTTP/HTTPS et SSH) qui consomme peu de mémoire. Il est facilement installable sur une distribution "Alpine linux". Installation Sur une "Alpine linux 3.14", 32 bits,  384 Mo de mémoire, disque dur de 32 Go. Il ne doit pas y avoir de  […]

Lire la suite

samedi 11 décembre 2021

Installation de la distribution "alpine linux"

Introduction Alpine linux 3.14 est une distribution très légère qui est idéale pour créer des machines virtuelles de production (sur LXC, ou Proxmox par exemple). Les principales caractéristiques de cette distribution sont : Nombreux processeurs compatibles : i386, amd64, arm, ppc64 Taille de disque  […]

Lire la suite

mardi 22 juin 2021

Blocage de l'accès en fonction du pays (iptables)

Principe Mes serveurs personnels sont uniquement utilisés en France ou en Europe. De plus, je remarque que de nombreuses attaques viennent de pays lointains. Il est donc nécessaire de réduire la surface d'attaque en n'autorisant que certains pays. Pour cela il existe différentes solutions qui  […]

Lire la suite

samedi 31 octobre 2020

Haproxy en mode http

  Haproxy peut être utilisé en mode http, avec prise en charge des acl(s), ou en mode tcp (pass-through). Mon article ne présente que le mode http. Maquette Le reverse-proxy dispose de l'adresse 192.168.16.30 dans mon exemple. J'utilise une Debian 10. Le serveur web qui héberge www.foo.net :  […]

Lire la suite

lundi 12 octobre 2020

LXC 3.0 sur Debian 10

Pourquoi revenir à LXC ? J'ai utilisé avec bonheur LXD 2.0 sur Ubuntu 16.04, mais depuis la version 4.0 il est obligatoire d'utiliser "snap" pour l'installation. J'ai alors eu de gros problèmes de compatibilité entre les conteneurs crées sur "apt" et leur mise en oeuvre avec  […]

Lire la suite

vendredi 15 mai 2020

LXD 4.0 sur Ubuntu 20.04

Installation avec la commande : apt install lxd En réalité, la commande apt execute un "snap". Il n'y a pas de version classique. Première initialisation Would you like to use LXD clustering : no Do you want to configure a new storage pool : yes Name of the new storage pool : default Name  […]

Lire la suite

lundi 11 mai 2020

Systemd (systemctl)

Systemd (commande "systemctl") est un système d'initialisation qui a été spécifiquement conçu comme alternative à SysVinit ( commandes "/etc/init.d" et "service"). Ce service est activé par défaut, à partir des distributions suivantes : Debian 8 Ubuntu 16.04 CentOs 7  […]

Lire la suite

vendredi 3 avril 2020

Première utilisation d'OpenNebula

Utilisation d'OpenNebula en tant que front-end pour un cloud privé. Les noeuds fonctionnent avec LXD. Nebula-1.webm  […]

Lire la suite

mardi 31 mars 2020

Installation d'une maquette OpenNebula

Objectif OpenNebula est une solution de cloud privé, complète et assez simple à mettre en oeuvre La maquette disposera de 4 machines virtuelles : Un routeur DebHub16 ou Pfsense, pour que chaque élève soit isolé Un front-end OpenNebula basé sur Debian 10 64 bits : mémoire 1 Go, disque de 20 Go, 1  […]

Lire la suite

samedi 28 mars 2020

Downgrade du réseau sur Ubuntu 16.04 et plus

Voici deux manipulations qui permettent de revenir à la configuration réseau de l'Ubuntu 14.04 Predictable Network Interface Device Names Vous ne voulez plus des interfaces réseau du style "eno1", "enp0s1" et revenir à "eth0" Dans le fichier /etc/default/grub, à la  […]

Lire la suite

dimanche 24 novembre 2019

La commande netstat

La commande Netstat permet de lister tous les ports ouverts sur une machine Options utiles -p  Affiche le nom du programme -t  Tous les ports TCP en mode "ETABLISHED" ou "WAIT" -u  Tous les ports UDP en mode "ETABLISHED" ou "WAIT" -a  Voir aussi les ports en  […]

Lire la suite

mardi 29 octobre 2019

Quick reference OpenSuse 15

Configuration réseau Configuration d'une carte réseau Les fichiers sont dans le dossier "/etc/sysconfig/network" Sur un serveur en mode CLI, le réseau doit être géré par "Wicked". En GUI, il doit être géré par "NetworManager". Il est possible de changer de mode avec  […]

Lire la suite

Quick reference CentOs 8

Configuration réseau Configuration d'une carte réseau Les fichiers sont dans le dossier "/etc/sysconfig/network-scripts" Il y a un fichier de configuration par carte réseau. Pour la carte "enp0s3" par exemple, il faut utiliser le fichier "ifcfg-enp0s3" Exemple d'adresse  […]

Lire la suite

dimanche 25 août 2019

Clé live-usb MX

La distribution MX linux 18.3 est basée sur Debian9 et permet de réaliser facilement un live-usb avec persistance des données Installation Il faut commencer par charger l'image ISO de MX linux 18.3, et installez celle-ci sur un live-cd. Une alternative est de partir directement d'une clé MX déja  […]

Lire la suite

mercredi 21 août 2019

Mise en oeuvre d'un serveur CentOs 7 ou 8 (64 bits)

Installation CentOs7 J'utilise le CD d'installation "CentOS-7-x86_64-NetInstall-1908.iso L'installateur fonctionne graphiquement, la souris est "presque" fonctionnelle. Dans certains cas il faut utiliser les touches "tab" "enter" et "echap" ! La carte  […]

Lire la suite

lundi 24 juin 2019

LXD 3.0 sur Ubuntu 18.04

Objectif Réaliser une installation de LXD, avec prise en charge de limites : Taille de la mémoire Taille du disque dur Nombre de processeurs Utilisation des profiles "default" (bridge lxdbr0) et "mac" (macvlan) Machine physique Ubuntu 18.04 64 bits est installé sur un disque  […]

Lire la suite

samedi 22 juin 2019

LXD sur un réseau local

Objectif L'utilisation de LXD derrière un bridge "lxdbr0" impose d'utiliser des règles de NAT. Une seule adresse réseau est visible (celle de l'hôte), et bien sur à cause du DNAT, chaque port ne peux être dirigé que vers un seul conteneur. J'ai donc cherché une autre solution, pour que  […]

Lire la suite

mardi 9 avril 2019

Remplacement d'Ansible et sshd sur Cygwin

Critique d'Ansible, après 1 an d'utilisation Ansible est un système qui fonctionne correctement dans le cadre de l'administration système. Les machines cibles sont généralement assez rapides pour que tout se passe sans timeout ! En ce qui concerne l'accès aux machines virtuelles des élèves, sur des  […]

Lire la suite

dimanche 7 octobre 2018

Mise en place d'une configuration de proxy automatique

Principe Le serveur DHCP distribue un nom de domaine par défaut. Le serveur DNS dispose d'un enregistrement "wpad" qui pointe vers un serveur web. Un fichier "wpad.dat" doit être situé à la racine. Les navigateurs sont configurés en "détection automatique des paramètres  […]

Lire la suite

mardi 7 août 2018

Utiliser Ansible avec un serveur Windows

Ansible communique avec Windows grace au protocole winrm, il n'est pas possible d'utiliser SSH. Winrm est apparu avec la version 3.0 de powershell. C'est la version qui est installé par défaut sur Windows 2012 et/ou Windows 8.0 Installation sur le serveur Ansible (Linux) apt-get install python-pip  […]

Lire la suite

vendredi 6 juillet 2018

Retour d'experience sur Ansible en production

Introduction Les scripts YAML d'Ansible peuvent avoir leur interêt, mais je trouve que l'utilisation de scripts Bash est préférable (c'est un avis personnel) : La vitesse Bash+Ansible est la même que Ansible+YAML En Bash je dispose des boucles et de tests Créer des scripts d'installation en Bash,  […]

Lire la suite

jeudi 21 juin 2018

Utilisation du système de gestion de configuration Ansible

Installation Le serveur ansible sera nommé (ans) et la machine à piloter (foo). Sur ans (Ubuntu 18.04) : apt-get install ansible Sur ans, création d'une paire de clés : ssh-keygen A créer dans /root/.ssh/ansible Pas de Passphrase Sur ans, dans /etc/ansible/ansible.cfg : remote_port = 22  […]

Lire la suite

mercredi 20 juin 2018

Backup d'un conteneur LXD

Pour réaliser le backup d'une machine LXD, je propose la méthode suivante : Arrêt du conteneur foo Déplacement dans le dossier /var/lib/lxd/containers/foo Archivage avec TAR. Les compressions gzip, bzip2 et xz fonctionnent Démarrage du conteneur foo Voici un script qui utilise cette méthode de  […]

Lire la suite

lundi 18 juin 2018

Optimisation d'un serveur LAMP

Php5 Dans /etc/php5/apache2/php.ini : Post_max_size = 64M Upload_max_filesize = 64M Apache2 Dans /etc/apache2/mods-enabled/mpm-prefork.conf : StartServers                         2 (à la place de 5) MinSpareServers                  2 (à la place de 5) MaxSpareServers                 5 (à la place de  […]

Lire la suite

lundi 28 mai 2018

Création d'une base de donnée Mysql

Eventuellement, pour vider une ancienne base : drop database foo; Puis : create database foo; create user 'fooUser'@'localhost' identified by 'unMotDePasse'; grant all on foo.* to 'fooUser'@'localhost'; flush privileges; Créer un pseudo-root pour MariaDb create user 'admin'@'localhost' identified  […]

Lire la suite

samedi 19 mai 2018

Eviter d'être considéré comme un spammeur

Si on utilise un serveur SMTP personnel, il arrive souvent que les mails envoyés soient considérés comme des spams. Voici quelques astuces pour éviter cela : Outil J'utilise un site qui permet de déterminer ce qui ne fonctionne pas. Ce site propose gratuitement d'effectuer 3 tests par jour :  […]

Lire la suite

Création de switchs virtuels sur Linux

Vde.png

Il est possible d'utiliser des switchs virtuels administrables sur Linux. Ces switchs peuvent ensuite être interfacés avec Virtualbox. Les switchs VDE permettent d'utiliser les VLANS Installation Sur Ubuntu : apt-get install vde2 Pour créer un switch et sa console d'administration : vde_switch -d -s  […]

Lire la suite

Nom des distributions Debian et Ubuntu LTS

Debian 6  Squeeze 7  Wheezy 8  Jessie 9  Stretch 10  Buster 11  Bullseye Ubuntu 8.04  Hardy 10.04  Lucid 12.04  Precise 14.04  Trusty 16.04  Xenial 18.04  Bionic 20.04  Focal 22.04  Jammy  […]

Lire la suite

Utiliser un raspberry comme serveur de virtualisation

Il est possible d'utiliser un Raspberry pi 2 ou 3 comme machine hôte pour plusieurs machines "virtuelles". Le processeur ARM ne dispose pas de la fonction VTx, il est impossible d'utiliser KVM. Par contre il est possible d'utiliser l'isolation LXC ou LXD. Si on garde la distribution  […]

Lire la suite

vendredi 18 mai 2018

LXD 2.0 sur Ubuntu 16.04 en mode bridge (lxdbr0)

Introduction LXD est une amélioration de LXC réalisé par Canonical. LXD est un cousin de Docker, les deux logiciels reposent sur LXC, l'utilisation est toutefois totalement différente. LXD est pré-installé sur les machines Ubuntu 16.04, 32 et 64 bits. Si vous voulez utiliser LXD, utilisez Ubuntu !  […]

Lire la suite

Finalisation de la configuration d'une machine Ubuntu 16.04 et plus

A la fin de l'installation d'un serveur ubuntu 16.04, 32 ou 64 bits il faut : Débrayer la mise à jour automatique qui a tendance à bloquer les commandes "apt-get update" et "apt-get upgrade" : Dans le fichier /usr/lib/apt/apt.systemd.daily, modifier la ligne AutoAptEnable=1, pour  […]

Lire la suite