Comme vu récemment, Docker Toolbox est le successeur de boot2docker. Le site officiel de Docker Toolbox liste les outils mis à disposition pour faire du Docker sur MacOS X ou MS Windows :

  • Docker Client
  • Docker Machine
  • Docker Compose (Mac only)
  • Docker Kitematic
  • VirtualBox

Docker Compose n’est pas (encore) disponible sous MS Windows ? Pourtant cet outil est extrêmement pratique pour gérer un projet multi-conteneurs. En attendant une distribution officielle pour MS Windows via Docker Toolbox, il est possible d’utiliser docker-compose sur un système Windows avec Docker Toolbox.

Le prérequis est donc d’avoir un Docker Toolbox installé avec une VM fonctionnelle.

Certains et d’autres proposent de passer par la console Babun, d’installer Python et enfin d’installer Composer via pip…

Un instant ! Le système sur lequel on souhaite mettre Docker Compose possède déjà Docker. Vous rappelez-vous à quoi sert Docker ? Oui, à pleins de choses… L’un des cas d’usage est de pouvoir exécuter au sein d’un conteneur une application empaquetée dans une image auto-suffisante. Alors pourquoi ne pas utiliser un conteneur docker-compose ?

Il existe déjà des images de docker-compose. La plus populaire semble être dduportal/docker-compose. Mais comment créer sa propre image de docker-compose ?

Il est possible en une seule ligne de commande de créer cette image à partir du dépôt GitHub officiel :

$ docker build -t docker-compose github.com/docker/compose
...

$ docker run --rm docker-compose --version
docker-compose version: 1.5.0dev

L’image de docker-compose est construite et s’exécute dans un conteneur. Il faut maintenant essayer docker-compose sur un fichier docker-compose.yml qui se trouve sur la machine Windows. Pour celà, prenons le fichier proposé par WordPress :

wordpress:
  image: wordpress
  links:
    - db:mysql
  ports:
    - 8080:80

db:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: example

La commande doit donc être la suivante :

$ docker --rm -it -v /c/Users/pnom/docker-wp:/c/Users/pnom/docker-wp -w /c/Users/pnom/docker-wp docker-compose up
invalid value "C:\\Users\\pnom\\docker\\docker-wp\\;C:\\Users\\pnom\\docker\\docker-wp\\" for flag -v: bad mount mode specified : \Users\pnom\docker\docker-wp\
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

Cette erreur vient du fait que le shell MSYS tente de convertir en chemin Windows une chaine qu’il pense être un chemin Unix. L’astuce est de préfixer tous les chemins en début de chaine par un / comme ceci :

$ docker run --rm -it -v //c/Users/pnom/docker/docker-wp/:/c/Users/pnom/docker/docker-wp/ -w //c/Users/pnom/docker/docker-wp docker-compose up
Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

Les chemins semblent être correctement interprétés. Néanmoins, docker-compose ne trouve pas le serveur Docker. Rappelons que docker-compose tourne dans un conteneur. Il est complètement isolé du système hôte. Il ne peut donc pas accéder au serveur Docker. Heureusement, il est possible de monter la socket de l’hôte dans le conteneur de cette façon :

$ docker run --rm -it -v //c/Users/sebastien/docker/docker-wp/:/c/Users/sebastien/docker/docker-wp/ -w //c/Users/sebastien/docker/docker-wp -v //var/run/docker.sock:/var/run/docker.sock docker-compose up
Starting dockerwp_db_1
Starting dockerwp_wordpress_1
Attaching to dockerwp_db_1, dockerwp_wordpress_1
...

db_1        | Version: '10.0.21-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
wordpress_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.5. Set the 'ServerName' directive globally to suppress this message
wordpress_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.5. Set the 'ServerName' directive globally to suppress this message
wordpress_1 | [Fri Oct 16 21:21:49.401776 2015] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.14 configured -- resuming normal operations
wordpress_1 | [Fri Oct 16 21:21:49.402230 2015] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

WordPress tourne ! Il est accessible à l’adresse suivante (dans le cas où la VM créée via docker-machine se nomme default) :

$ curl http://`docker-machine ip default`:8080

Il faut avouer que la ligne de commande pour lancer docker-compose dans un conteneur est assez longue. Pour réduire la taille de la commande à saisir et donner l’illusion d’avoir docker-compose sur MS Windows, il est possible de créer un alias et le placer dans le fichier ~/.bash_profile :

alias docker-compose='docker run --rm -ti -v //var/run/docker.sock:/var/run/docker.sock -v /`pwd`:`pwd` -w /`pwd` docker-compose'

Après un rechargement du bash, il est maintenant possible de démarrer WordPress avec cette ligne de commande bien plus familière :

$ docker-compose up -d

Remarque importante si vous ne voulez pas perdre trop de temps : pour le moment docker (ou docker-machine) ne semble pas partager correctement les répertoires entre l’hôte Windows et la VM GNU/Linux sauf pour le répertoire utilisateur se trouvant dans /c/Users/pnom. Il faut donc utiliser docker-compose seulement dans la sous-arborescence de /c/Users/pnom. Si on l’utilise dans un autre répertoire, il sera partagé avec la VM de docker-machine mais le répertoire sera vide dans celle-ci. Et docker-compose ne trouvera donc pas le fichier docker-compose.yml.

Vous pouvez maintenant utiliser docker-compose sur MS Windows ! Enfin… pas vraiment. Mais tout le monde y croira ! 😉