Docker Desktop pour Windows permet d’améliorer grandement le confort des développeurs qui utilisent Docker sous Windows. Pourtant, il est possible d’utiliser Docker sous Windows avec WSL 2 sans Docker Desktop et simplement.

Introduction

Cet été, Docker a changé sa licence d’utilisation de Docker Desktop, rendant l’utilitaire payant dans certains cas. Si vous ne pouvez bénéficier de la licence ou si les fonctionnalités de Docker Desktop ne vous intéressent pas, sachez qu’il est possible d’utiliser Docker sous Windows de façon fluide.

Ceci demande tout de même une installation et configuration sur votre machine qui n’est pas si triviale.

Installation de Docker avec WSL 2

La solution passe par WSL 2. Docker Desktop repose également sur Windows Subsystem Linux.

Installation de WSL 2

Dans un premier temps, il faut s’assurer que WSL 2 est bien actif sur votre Windows. Si ce n’est pas le cas, voici une procédure pour l’installer et/ou migrer une distribution WSL vers WSL 2 à exécuter dans un PowerShell en mode administrateur :

# Configuration de WSL2 (Enable Hyper-V)
# Lancer PowerShell (mode administrateur) et exécuter les commandes ci-dessous
# Ceci va activer la fonctionnalité de virtualisation qui sera utilisée par WSL2

Windows PowerShell
Copyright (C) Microsoft Corporation. Tous droits réservés.

Testez le nouveau système multiplateforme PowerShell https://aka.ms/pscore6

PS C:\Users\pnom> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux


Path          :
Online        : True
RestartNeeded : False

# Si RestartNeeded vaut True, il est nécessaire de redémarrer son PC.

# Ensuite, vous devez rechercher votre distribution Linux existante pour la rendre fonctionnelle avec WSL2.

PS C:\Users\pnom> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         1

# Convertir cette distribution Linux pour WSL version 2 
PS C:\Users\pnom> wsl --set-version Ubuntu 2
La conversion est en cours. Cette opération peut prendre quelques minutes...
Pour plus d’informations sur les différences de clés avec WSL 2, visitez https://aka.ms/wsl2


# Enfin, il est possible d'activer la version 2 de WSL par défaut en exécutant la commande ci-dessous :
PS C:\Users\pnom> wsl --set-default-version 2

Installation de Docker

Une fois WSL 2 installé, il est nécessaire d’installer Docker dans une distribution Linux WSL. L’installation de Docker dans WSL est assez classique. Voici la procédure pour Ubuntu WSL et donc à exécuter dans la distribution Ubuntu :

sudo apt-get update -y
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update -y
sudo apt-get install -y docker-ce

sudo usermod -aG docker $USER

Il est alors possible de démarrer ou arrêter le service Docker avec les commandes sudo service docker start et sudo service docker stop.

De même, les commandes sudo docker info ou docker ps permettent de vérifier que Docker fonctionne correctement.

Enfin, les distributions Linux sous WSL n’ont pas de système d’initialisation. Pour démarrer automatiquement le démon Docker (et sans saisir de mot de passe) quand vous ouvrez une session WSL, vous pouvez exécuter ces commandes :

# automatiser le démarrage du démon docker
echo "sudo service docker status || sudo service docker start" >> ~/.bashrc

# désactiver la demande de mot de passe pour gérer le service docker
echo "%docker ALL=(ALL) NOPASSWD: /usr/sbin/service docker *" | sudo tee -a /etc/sudoers

Ainsi, à chaque fois que vous démarrerez une session WSL, le démon docker sera lancé automatiquement, s’il ne l’était pas. Et ce, sans demander de mot de passe.

Installation de Docker Compose

Cette étape est optionnelle mais Docker Compose étant tellement pratique qu’elle me semble essentielle :

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Intégration de Docker avec Windows

Nous avons maintenant un Docker fonctionnel dans une distribution Linux avec WSL 2. Toutes les commandes Docker sont fonctionnelles dans une session WSL 2.

Néanmoins, il serait intéressant de pouvoir utiliser le CLI de Docker depuis n’importe quel terminal tel que PowerShell, Cmd ou Windows Bash.

Voyons donc comment intégrer Docker sous WSL 2 avec ces différents terminaux. Pour cela, nous allons utiliser la ligne de commande wsl pour exécuter la commande docker dans la distribution Linux à distance.

Docker dans PowerShell

Pour utiliser les commandes Docker dans PowerShell, il faut créer ou modifier le fichier ~\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 avec les lignes suivantes :

# remplacer par le nom de votre distribution
$DOCKER_DISTRO = "ubuntu"
function docker {
    wsl -d $DOCKER_DISTRO docker @Args
}
function docker-compose {
    wsl -d $DOCKER_DISTRO docker-compose @Args
}

Si vous rencontrez l’erreur suivante :

. : Impossible de charger le fichier C:\Users\pnom\OneDrive - Company\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1, car l’exécution de scripts
est désactivée sur ce système. Pour plus d’informations, consultez about_Execution_Policies à l’adresse https://go.microsoft.com/fwlink/?LinkID=135170.
Au caractère Ligne:1 : 3
+ . 'C:\Users\pnom\OneDrive - Company\Documents\WindowsPowe ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : Erreur de sécurité : (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Il est alors nécessaire d’accorder quelques droits d’exécution :

PS C:\Users\pnom> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined


PS C:\Users\pnom> Get-ExecutionPolicy -Scope CurrentUser
Undefined
PS C:\Users\pnom> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Relancez une session PowerShell et testez la commande docker :

Windows PowerShell
Copyright (C) Microsoft Corporation. Tous droits réservés.

Testez le nouveau système multiplateforme PowerShell https://aka.ms/pscore6

PS C:\projects\docker\pg> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

PS C:\projects\docker\pg> docker-compose ps
    Name                   Command              State                       Ports
-----------------------------------------------------------------------------------------------------
pg_database_1   docker-entrypoint.sh postgres   Up      0.0.0.0:5433->5432/tcp,:::5433->5432/tcp
pg_dbadmin_1    /entrypoint.sh                  Up      443/tcp, 0.0.0.0:9999->80/tcp,:::9999->80/tcp

Docker dans Cmd

Pour pouvoir utiliser les commandes docker dans Cmd, il est nécessaire de créer le fichier docker.bat ci-dessous qui doit être présent dans le PATH :

@echo off
# remplacer par le nom de votre distribution
set DOCKER_DISTRO=ubuntu
wsl -d %DOCKER_DISTRO% docker %*

Pour docker-compose, nous devons créer un fichier docker-compose.bat sur le même principe :

@echo off
# remplacer par le nom de votre distribution
set DOCKER_DISTRO=ubuntu
wsl -d %DOCKER_DISTRO% docker-compose %*

Ouvrez une session Cmd et testez la commande docker :

pnom@LAPTOP C:\
$ docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED       STATUS          PORTS                                            NAMES
f8fd083a575e   dpage/pgadmin4:3.4   "/entrypoint.sh"         5 weeks ago   Up 53 minutes   443/tcp, 0.0.0.0:9999->80/tcp, :::9999->80/tcp   pg_dbadmin_1
c08cf29ad8f6   postgres:10          "docker-entrypoint.s…"   5 weeks ago   Up 53 minutes   0.0.0.0:5433->5432/tcp, :::5433->5432/tcp        pg_database_1

Docker dans Windows Bash (Git Bash)

Encore une fois, nous allons utiliser la même astuce en ajoutant les lignes suivantes dans le fichier ~/.bash_profile :

#!bash

docker() {
  # remplacer par le nom de votre distribution
  export DOCKER_DISTRO=ubuntu
  wsl -d $DOCKER_DISTRO docker $@
}

docker-compose() {
  # remplacer par le nom de votre distribution
  export DOCKER_DISTRO=ubuntu
  wsl -d $DOCKER_DISTRO docker-compose $@
}

Relancez une session Bash et testez les commandes docker et docker-compose :

pnom@LAPTOP MINGW64 /c/projects/docker/pg
$ docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED       STATUS          PORTS                                            NAMES
f8fd083a575e   dpage/pgadmin4:3.4   "/entrypoint.sh"         5 weeks ago   Up 57 minutes   443/tcp, 0.0.0.0:9999->80/tcp, :::9999->80/tcp   pg_dbadmin_1
c08cf29ad8f6   postgres:10          "docker-entrypoint.s…"   5 weeks ago   Up 57 minutes   0.0.0.0:5433->5432/tcp, :::5433->5432/tcp        pg_database_1

pnom@LAPTOP MINGW64 /c/projects/docker/pg
$ docker-compose ps
    Name                   Command              State                       Ports
-----------------------------------------------------------------------------------------------------
pg_database_1   docker-entrypoint.sh postgres   Up      0.0.0.0:5433->5432/tcp,:::5433->5432/tcp
pg_dbadmin_1    /entrypoint.sh                  Up      443/tcp, 0.0.0.0:9999->80/tcp,:::9999->80/tcp

Aller plus loin

J’ai pris le parti de démarrer automatiquement le démon docker en ouvrant une session WSL. L’autre solution aurait été d’intégrer la commande de démarrage de docker dans votre terminal préféré comme nous l’avons fait pour docker et docker-compose. Ainsi, il ne serait plus nécessaire d’ouvrir une session WSL à la main une première fois.

Comme vous pouvez le voir, toute la procédure d’installation et configuration est automatisable dans un script. Je n’ai pas (encore) eu l’occasion de le faire.

De même, je éludé le cas des montages de volume qui nécessite un peu plus de glu.

Enfin, je n’ai pas traité le cas d’un environnement avec plusieurs distribution WSL.

Conclusion

Après ces quelques manipulations, nous avons un Docker fonctionnel sous Windows avec WSL 2. De plus, les commandes docker et docker-compose sont accessibles depuis n’importe quel terminal sous Windows.

Comme vous pouvez le voir, Docker Desktop n’est pas nécessaire pour une utilisation basique de Docker sous Windows depuis l’arrivée de WSL 2. Néanmoins, ce dernier fluidifie énormément l’installation et propose bien plus de fonctionnalités. A vous de voir alors si Docker Desktop est pertinent pour votre cas d’usage.

Et pour vous ? Ce sera avec ou sans Docker Desktop ? 🐳

https://blog.lecacheur.com/wp-content/uploads/2020/09/docker-vertical-logo-monochromatic-1024x876.pnghttps://blog.lecacheur.com/wp-content/uploads/2020/09/docker-vertical-logo-monochromatic-150x150.pngSeBDéveloppementLinuxdocker,windows,wslDocker Desktop pour Windows permet d'améliorer grandement le confort des développeurs qui utilisent Docker sous Windows. Pourtant, il est possible d'utiliser Docker sous Windows avec WSL 2 sans Docker Desktop et simplement. Introduction Cet été, Docker a changé sa licence d'utilisation de Docker Desktop, rendant l'utilitaire payant dans certains cas. Si...Un blog, c'est un blog !