Docker sous Windows (WSL 2) sans Docker Desktop
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.
Sommaire
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/2021/11/23/docker-sous-windows-wsl-2-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.pngDé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...SeBSébastien LECACHEUR23r0@laposte.netAdministratorLe weblogue de SeB
Pour information, votre Windows 10 doit être en Build 1903 ou + en build 1809, les commandes wsl sont limitées et ne le permettent pas.
Merci pour le tuto 🙂