Avant Docker nous utilisions principalement des machines virtuelles pour développer, ou déployer nos applications. C’est en 2013 qu’il est venu chambouler l’éco-système DevOps. Docker est un outil efficient capable d’empaqueter une application et ses dépendances dans un conteneur isolé, et en plus, il peut être exécuté sur n’importe quel serveur ou machine. Alors découvrons le monde du Docker !
D’un point de vue technique, Docker est Platform as a Service (PaaS). À la base du projet, il reposait sur LXC (Linux container) pour gérer un environnement virtuel. C’est en 2014 que ses concepteurs ont tout réécrit de zéro en langage GO. C’est un projet Open Source. Parmis ces alternatives, nous comptons CoreOS rkt .
Ça sert à quoi ?
Docker est une plateforme qui permet d’exécuter du code à l’intérieur d’un conteneur indépendamment de la machine sur laquelle vous êtes.
Un conteneur ressemble à une machine virtuelle sauf qu’il n’embarque pas tout un système d’exploitation avec lui ce qui lui permet de s’exécuter en quelque secondes et d’être beaucoup plus léger.
Avec cet outil, vous n’avez plus besoin d’installer une machine virtuelle de zéro, son système d’exploitation et ses technologies. C’est particulièrement utile si vous travaillez à plusieurs développeurs, il en effet très facile d’uniformiser l’environnement de votre choix pour qu’il soit identique pour tout le monde. (version de PHP, MySQL, etc…). Que vous soyez sur MacOS, Linux ou Windows, vous pouvez avoir tous le même environnement de projet ! Cela évitera les mauvaises surprises… A noter que depuis quelques années, il peut d’ailleurs être utilisé directement en production.
J’ai besoin de quoi pour commencer ?
- Macos : (https://docs.docker.com/docker-for-mac/)
- Windows : (https://docs.docker.com/docker-for-windows/install/)
- Linux Ubuntu : https://docs.docker.com/engine/install/ubuntu/
Comment créer mon environnement de développement PHP/MySQL ?
Pré-requis :
Pour créer votre propre environnement personnalisé, il faut commencer par installer Docker mais aussi docker-compose qui va vous permettre de lancer tout l’environnement via un fichier (XML / YML) unique docker-compose.yml
Vous trouverez le lien d’installation de docker-compose, ci-après : https://docs.docker.com/compose/install/
Exemple de docker-compose.yml pour un environnement PHP/MySQL/Nginx
version: “3”
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile ——————————-> Fichier Docker pour générer une image Docker
image: digitalocean.com/php
container_name: app_dashboard
restart: unless-stopped
tty: true
volumes:
– ./:/var/www
– ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
– app-network-exemple
#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver_exemple
restart: unless-stopped
tty: true
ports:
– “8092:80”
– “5440:443”
volumes:
– ./:/var/www
– ./docker/nginx/conf.d/:/etc/nginx/conf.d/
networks:
– app-network-exemple
#MySQL Service
db:
image: mysql:8.0.17
container_name: db_exemple
restart: unless-stopped
tty: true
ports:
– “3312:3306”
environment:
MYSQL_DATABASE: exemple
MYSQL_ROOT_PASSWORD: exemple
MYSQL_ROOT_HOST: ‘%’
MYSQL_PASSWORD: exemple
MYSQL_USER: exemple
volumes:
– dbdata_exemple/var/lib/mysql/
– ./docker/mysql/my.cnf:/etc/mysql/my.cnf
networks:
– app-network-exemple
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin_exemple
ports:
– “7012:80”
links:
– db:db
environment:
MYSQL_USER: exemple
MYSQL_PASSWORD: exemple
MYSQL_ROOT_PASSWORD: exemple
networks:
– app-network-exemple
#Docker Networks
networks:
app-network-exemple:
driver: bridge
#Volumes
volumes:
dbdata_exemple:
driver: local
Et le Dockerfile associé :
FROM php:7.2-fpm
# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl \
libgmp-dev
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
RUN ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl bcmath gmp
RUN docker-php-ext-configure gd –with-gd –with-freetype-dir=/usr/include/ –with-jpeg-dir=/usr/include/ –with-png-dir=/usr/include/
RUN docker-php-ext-install gd
# Install composer
RUN curl -sS https://getcomposer.org/installer | php — –install-dir=/usr/local/bin –filename=composer
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# Copy existing application directory contents
COPY . /var/www
# Copy existing application directory permissions
COPY –chown=www:www . /var/www
# Change current user to www
USER www
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD [“php-fpm”]
A partir de là, c’est simple, la commande magique : docker-compose up -d
Cette commande va télécharger les images dans le dockerHub et générer une image via le fichier DockerFile.
Une fois l’installation terminée et le Docker lancé, exécuter la commande docker ps pour visualiser la liste des dockers en cours d’exécution.
Vous trouverez ci-après une liste des commandes docker et docker-compose à connaître : https://www.padok.fr/blog/docker-docker-compose-commandes-connaitre
Je n’aime pas la ligne de commande ?
Si vous n’êtes pas fan de la ligne de commande, il y a des outils pour vous aider à gérer vos dockers en local. Vous pouvez installer Kitematic ou Portainer.
Pour les plus aguerris du mode console :
- Dive : https://github.com/wagoodman/dive
- Dockly : https://github.com/lirantal/dockly
Pour terminer…
L’évolution du monde Docker est grandissante, support de VMware, support de Microsoft Azure mais aussi support de Amazon AWS. Cette mouvance a permit l’émergence de nouveaux outils orientés infrastructures tels que Rancher (Orchestration de Docker), Kubernetes, etc.
Il est devenu assez facile de mettre en place des solutions en haute disponibilité. Cela est aussi facilité par les Cloud Provider, AWS, GCP, DigitalOcean, etc… qui proposent des offres Kubernetes managées voir même l’approche Cloud Native Application Bundle ou CNAB. Mais cela fera l’objet d’un prochain article !