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.