Comment avoir un Docker performant sur MacOS ?

Si vous utilisez Docker sur votre Mac grâce à l'application officielle alors vous avez sûrement constaté des performances médiocres pour les accès disques. Certains frameworks Web en pâtissent comme par exemple Symfony. Nous allons voir dans les lignes suivantes qu'il est possible de résoudre rapidement cette lacune afin de redonner à Docker des performances optimales.

Voici les outils que nous allons utiliser pour rendre Docker plus véloce :
- xhyve : MacOS intègre une API qui permet de créer une machine virtuelle tout en respectant la gestion des ressources de virtualisation de la même manière que pour les applications. Celui-ci s’appelle l’hypervisor.framework.
- Docker Machine est un outil de la famille Docker, qui se charge de créer et configurer des machines pour exécuter le démon Docker.
- Docker-machine-nfs est un utilitaire qui simplifie le partage NFS entre la machine hôte et la machine virtuelle à la place de device-mapper.

Installation

# Installation des dépendances 
brew install docker docker-compose docker-machine docker-machine-driver-xhyve docker-machine-nfs xhyve  
sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve  
sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve

# Création d’une machine virtuelle via docker-machine 
docker-machine create -d xhyve default

# Création d’un partage NFS entre la machine hôte & la machine virtuelle
Docker-machine-nfs default  

Pour utiliser votre Docker-machine et connaître l’IP de celui-ci, utilisez la commande suivante :

# On récupère l’IP de la machine virtuelle
docker-machine ip default  
# On configure notre cli docker local pour utiliser la machine virtuelle
eval "$(docker-machine env default)"  

Comparatif des performances

Voyons ensuite l’impact sur les performances. Nous allons comparer le temps de chargement de Symfony 3.2.8 exécuté depuis deux containers : un lancé via docker for Mac standard et un autre via docker-machine+xhyve+NFS. L’image que nous utilisons est eko/docker-symfony, qui nous permet de lancer rapidement le nécessaire pour faire tourner un Symfony 3.2.8 (nginx, php 5.6, MySQL).
On ne fait aucune modification dans les fichiers de configuration de SF et on supprime le dossier var/cache après chaque essai.
Nous disposons de deux machines virtuelles, la première “docker for Mac” (ip: 127.0.0.1) et la seconde via docker-machine+xhyve+NFS (ip 192.168.64.1).

On constate que le temps de chargement de Symfony en mode développement est divisé par un peu plus de deux avec docker-machine-nfs. L’utilisation de docker-machine-nfs à la place de device-mapper par défaut, permet d'accélérer le temps d’accès au fichier, et ainsi rendre les pages bien plus rapidement. On notera qu’en plus du gain de performance, Docker machine autorise la création d’un bridge vers le réseau ce que ne permet pas Docker for Mac.

N'hésitez pas à nous poser des questions si nécessaire.