illustration de Développer avec Docker
Mise à jour : 16 octobre 2016

Je ne pouvais pas prétendre vouloir écrire des articles parlant des performances des applications web sans parler d’environnement de test et de développement.

Qu’est-ce que Docker ?

Avant d’aller plus loin il faut bien comprendre ce qu’est Docker. Docker est une plateforme open source permettant aux développeurs et sysadmins d’automatiser le déploiement d’applications très facilement dans des conteneurs logiciels.

Il étend le format de conteneur linux standard, LXC avec une API de haut niveau et fournit une solution de virtualisation qui exécute les processus de façon isolée.

 

[youtube url=https://www.youtube.com/embed/ZzQfxoMFH0U]

 

Docker permet donc de créer une machine virtuelle « type » pour des développements et les tests à l’aide d’un fichier de configuration appelé « dockerfile ». Les cas d’utilisations sont variés, applications distribuées, intégrations continues, mise en production continue, PaaS.

Utilisation des containers

Pour lancer un container sous ubuntu :

# Usage: [sudo] docker [command] [flags] [arguments] ..
$ sudo docker run -i -t ubuntu /bin/bash

Cette commande vous récupère automatiquement l’image d’Ubuntu sur le hub de docker et vous la lance dans un container. Vous avez ensuite accès au bash de votre conteneur.

Les commandes disponibles sont :

attach  #Attach to a running container
build   #Build an image from a Dockerfile
commit  #Create a new image from a container's changes

 

Dockerfile

Le dockerfile permet de configurer facilement un conteneur. Ces fichiers sont disponibles directement sur le hub de docker et certains sont disponibles sur GitHub.

Voici un exemple de Dockerfile :

#
# Nginx Dockerfile
#
# https://github.com/dockerfile/nginx
#

# Pull base image.
FROM dockerfile/ubuntu

# Install Nginx.
RUN \
  add-apt-repository -y ppa:nginx/stable && \
  apt-get update && \
  apt-get install -y nginx && \
  rm -rf /var/lib/apt/lists/* && \
  echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \
  chown -R www-data:www-data /var/lib/nginx

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

# Define working directory.
WORKDIR /etc/nginx

# Define default command.
CMD ["nginx"]

# Expose ports.
EXPOSE 80
EXPOSE 443

 

Une fois le dockerfile créé il suffit de build avec la commande suivante :

$ sudo docker build -t dockerfile/nginx .

les options -t ou --tags="" permettent de donner un nom à votre image créée a partir du dockerfile. Ce nom permet d’identifier facilement votre image afin de créer un container à l’aide de la commande run.

Pour lister les différentes images créées :

$ sudo docker images

 

Binder des ports :

Lorsqu’on lance un container, il faut souvent pouvoir binder des ports, c’est a dire de lier un port (ex: localhost:8080) de votre container docker avec votre localhost.

Pour cela l’option -p permet de binder les ports entre la machine host et le container ex : -p 8080.

Binder des dossiers :

Binder des dossiers avec docker est une des fonctionnalités primordiales pour le développement avec docker.

Par exemple pour un projet sous node.js il vous suffit de binder votre dossier de projet avec le dossier data du container avec l’option -v <your-folder>:/data.

Vous continuez à développer en local et votre container joue le rôle de serveur.

Linker des containers :

Voici la force de docker. Il est en effet très simple et surtout très conseillé de linker des containers entre eux. L’objectif principal est d’avoir une architecture efficace et évolutive en exécutant des containers ayant une et une seule fonction (une base de données MySQL ou un serveur Apache2).

Pour linker les containers il faut noter l’utilisation des variables EXPOSE permettant d’exposer des ports aux autres containers.

Voici un exemple de link entre un container MySQL et un container Apache2 :

sudo docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql

sudo docker run --link my-mysql:mysql -it --rm -p 80:80 -v <my-dir>:/data tutum/apache-php

 

Pour plus d’informations :

La documentation de docker

La documentation sur les dockerfiles

Pour ceux qui souhaites tester voici une liste de dockerfile intéressants :