Docker, créer un environnement sql, php, web et nodejs

Classé dans : Programmation | 0

L’objectif de ce post est de vous présenter les scripts que j’utilise pour me créer mes environnements de développement. Les prérequis sont de connaitre Docker et l’écriture de scripts Bash. Sur Windows vous pouvez installer git-bash. Sur Linux et MacOs c’est installé de base.

En général voici les besoins pour chaque nouveau projet :

Une base de données SQL (Mysql ou Mariadb)

Une serveur web (Apache ou Nginx)

Un moteur PHP et un moteur NodeJS

Pour ce faire l’idéal c’est de créer un container pour chaque besoin, mais dans la pratique c’est plus simple (à gérer) de mutualiser certaines choses. Dans l’exemple ci dessous j’utilise 3 containers: mariadb, phpapache et nodejs

Le container mariadb est peu spécial car il est multi-projets. Je trouve inutile, sauf besoin très spécifique, de créer un container sql pour chaque projet.

Par contre pour phpapache et nodejs, ils sont bien spécifiques à chaque projet.

Le script principal

Ce script doit permettre de :

  • Générer les images docker si besoin
  • Générer les containers docker si besoin
  • Exécuter les containers
  • Arrêter les containers

Il faut donc créer des fonctions génériques pour certaines tâches pour ne pas avoir à répéter le code pour chaque images/container.

checkImageDocker

Cette fonction vérifie si l’image docker existe, si ce n’est pas le cas l’image est créée. En entrée la fonction reçoit le nom de l’image et le nom du fichier DockerFile à utiliser pour créer l’image si besoin. L’appel se fait avec

checkImageDocker NOM_IMAGE DOCKER_FILE

## $1 = nom de l'image, $2 = dockerfile pour créer l'image
function checkImageDocker {
  IMAGENAME="$1"
  DOCKERFILE="$2"
  imgExist=`docker image ls | grep $1 | wc -l`
  if [ $imgExist != "1" ]; then 
    echo "-> Build image:$IMAGENAME [docker build -t $IMAGENAME -f $DOCKERFILE .]"
    docker build -t $IMAGENAME -f $DOCKERFILE .
  fi
}

checkContainerDocker

Cette fonction est le pendant de la précédente pour les containers. Elle vérifie si un container existe, si c’est le cas il est relancé. Si le container n’existe pas il est généré. En entrée la fonction reçoit, le nom du container, les options pour générer le container et un 3ième paramètre optionnel pour spécifier si le container doit être lancé en mode interractif ou pas. Voici un exemple :

checkContainerDocker CONTAINER_NAME OPT [it]

## vérifie si un container existe, si besoin le reconstruit 
## $1 = nom du container 
## $2 = liste des options pour construire le container 
## $3 = it (interractif) necessite winpty sur windows
function checkContainerDocker { 
  contExist=`docker ps -a | grep $1 | wc -l`
  if [ "$contExist" != "1" ]; then
    echo "- Build & Start du container [docker $OPT ]"
    if [ "$3" == "it" ]; then
      winpty docker $2
    else
      docker $2
    fi
  else
    echo "- Restart du container $1"
    docker stop $1
    docker start $1
  fi
}

Docker ‘nodejs’

A partir des fonctions ci-dessous voici le code pour créer et lancer un container nodejs. J’utilise un fichier Dockerfile_NODEJS pour la configuration de l’image img-nodejs.

CONTAINERNAME="srv-nodejs"
echo "[NodeJS]"
IMAGENAME="img-nodejs"
DOCKERFILE="Dockerfile_NODEJS"
SRCROOT="-v "PATH_TO_PROJET_FILES":/tmp/data"
## static pour root pour poser les fichiers compiles
STATICROOT="-v "PATH_TO_STATIC_FOLDER":/tmp/static"
RUN="run -d -it --name $CONTAINERNAME $SRCROOT $STATICROOT $IMAGENAME"
checkImageDocker $IMAGENAME $DOCKERFILE 
checkContainerDocker $CONTAINERNAME "$RUN"

Pour finir il suffit ensuite de créer un script global : startDocker.sh, qui lance tous les containers de votre projet. Pour chaque container il suffit de créer un bloc de commande identique, en adaptant les paramètres.

Ensuite vous pouvez également dans ce script intégrer (avant le code des containers) des options pour stopper ou régénérer les containers.

if [ "$1" == "stop" ]; then 
  docker stop srv-nodejs
  docker stop srv-phpapache
  exit
fi
if [ "$1" == "delete" ]; then 
  docker rm srv-nodejs
  docker rm srv-phpapache
  exit
fi

Dans mon environnement le container srv-mariadb est multi-projet, il doit donc être géré ‘manuellement’ et pas être traité par le stop ou et delete. C’est pourquoi il n’est pas présent dans les bloc de code ci-dessous.

Container PHP/Apache

## PHP APACHE
################
CONTAINERNAME="srv-$PREFIX-phpapache" 
echo "[PHP/Apache]"
IMAGENAME="img-$PREFIX-phpapache"
DOCKERFILE="Dockerfile_PHPAPACHE"
VOLUMES="--mount type=bind,source=$ROOTPATH,target=/var/www/html"
NETWORK="--network $DOCKERLAN --ip $IP_WEB"
PORT=" -p $LOCALHTTPPORT:80"
ADDHOST="--add-host=mariadb:$IP_SQL"
echo "- Build & Run du container"
OPT="run -it --restart=unless-stopped --name $CONTAINERNAME $PORT $VOLUMES $NETWORK $ADDHOST $IMAGENAME"
checkImageDocker $IMAGENAME $DOCKERFILE 
checkContainerDocker "$CONTAINERNAME" "$OPT" it

Container SQL mariadb

## parametres
CONTAINERNAME="srv-mariadb"
IMAGENAME="img-mariadb"
DOCKERFILE="Dockerfile_MARIADB"
echo "[srv-mariadb]"
## reconstruit l'image si besoin
checkImageDocker $IMAGENAME $DOCKERFILE
## parametres du container 
SQLROOT="-v "d:/mysql":/var/lib/mysql"
NETWORK="--network DOCKERLAN --ip W.X.Y.Z."
PORT="-p 3306:3306"
OPT="run -d -e MYSQL_ROOT_PASSWORD=root --name $CONTAINERNAME $SQLROOT $NETWORK $PORT $IMAGENAME"
## reconstruit le container si besoin
checkContainerDocker "$CONTAINERNAME" "$OPT"

Voila reste plus qu’a assembler tout cela pour avoir un joli script bash qui met tout en route. A noter que si vous lancer un container un mode interactif (opiont -it) il doit être lancé en dernier.

Pour ce qui est des fichiers dockerFile de chaque container ils seront présentés dans des posts dédiés.