Faire cohabiter des conteneurs Windows et Linux sur Windows 10
Dans un article récent j'expliquais comment utiliser des conteneurs Windows sur Windows 10, grâce à Docker et aux Hyper-V Containers. Au début de ce même article j'évoquais les différentes options pour utiliser Docker sur Windows 10, avec notamment Docker for Windows et ses conteneurs Linux dans une VM Linux. Une question que l'on peut légitimement se poser est : peut-on faire cohabiter les deux sur le même système Windows 10 ? Bonne nouvelle, la réponse est oui.
Tout d'abord, précisons que tout ceci a déjà été clairement documenté par Joel Bennett, alias Jaykull, ici : https://gist.github.com/Jaykul/15a6982aad9b6197a537f1ce5a786723.
La solution réside dans le mode de communication entre le client (docker) et le moteur Docker (dockerd). Par défaut le client Windows, docker.exe
, se connecte au moteur sur un named pipe nommé //./pipe/docker_engine
. Il "suffit" donc d'utiliser un named pipe différent pour le moteur de l'un des deux environnements, et de spécifier ce named pipe lorsque l'on voudra utiliser celui-ci avec le client.
Nous avons vu, dans l'article précédent, comment lancer le moteur dockerd.exe
manuellement. Il suffira donc de spécifier un named pipe spécfique avec l'option -H
de dockerd.exe
, et de même avec le client.
Concrètement :
- Installer Docker for Windows normalement.
- Installer Hyper-V Containers comme spécifié dans mon article, sans enregistrer le service Docker (dockerd).
De cette manière, si l'on utilise docker.exe
sans option, on se connectera par défaut à //./pipe/docker_engine
, ce qui utilisera le moteur Linux de Docker for Windows.
Il suffit ensuite de lancer le moteur Windows sur un named pipe différent :
- Aller dans
C:\Program Files\Docker
(si c'est ici que vous avez copiédockerd.exe
) - Exécuter :
dockerd.exe -H npipe:////./pipe/win_engine
- Tester la connexion avec :
docker.exe -H npipe:////./pipe/win_engine info
- Si cela fonctionne, vous pouvez interrompre
dockerd.exe
(Ctrl+C
) et enregistrer le service avec la même option et en spécifiant un nom de service distinct :dockerd.exe -H npipe:////./pipe/win_engine --service-name=com.docker.windows --register-service
A partir de là, vous pouvez accéder au moteur Linux en utilisant docker.exe
sans l'option -H
, et au moteur Windows avec l'option -H npipe:////./pipe/win_engine
; le tout sur la même machine !
Petit détail supplémentaire : les fichier de Docker for Windows sont par défaut dans C:\Program Files\Docker\Docker
, ce qui évite les conflits.
Résultat : dans la capture ci-dessous on voit, du fond vers le premier plan : le moteur dockerd.exe
pour les conteneurs Windows, un conteneur Windows Nano Server, et un conteneur Alpine Linux qui s'exécutent en même temps. Bingo !
La commande docker version montre également les deux moteurs distincts sur la même machine :
Pour terminer, au lieu d'utiliser l'option -H, il est aussi possible d'utiliser la variable d'environnement DOCKER_HOST pour spécifier le named pipe sans recourir à l'option -H, ce qui allège les commandes.