Logo Webbouw Plus

WSL2 gebruiken in Docker op Windows

november 19, 2022

Ik gebruik Docker nu al een aantal jaar maar voorheen nog niet op WSL2 tot nu.
Gestart bij een nieuwe klus, standaard Laravel project met al wel een Bootstrap admin thema maar het project is niet vooruit te branden.
Een pageload van +/- 10 seconden. Had veel te maken met het inladen van assets en niet door langzame queries.

Na wat research toch een besloten om WSL2 te gaan gebruiken, na wat issues is gelukt.

Veeeel sneller

Ook draaien projecten nu veel sneller, het installeren van PHP packages, downloaden en compilen van Node js. Daar kom je pas achter wanneer je het ziet/mee werkt 😉

Project met +/- 350 unit/feature testen

Op de Windows locatie
Time: 02:50.566, Memory: 108.50 MB
Time: 02:11.983, Memory: 108.50 MB
Time: 02:37.326, Memory: 108.50 MB

Op de WSL2 locatie
Time: 00:44.691, Memory: 108.50 MB
Time: 00:43.208, Memory: 108.50 MB
Time: 00:52.704, Memory: 108.50 MB

WSL2 gebruiken

Hieronder een beschrijving welke stappen ik heb genomen, welke problemen ik tegen kwam en de oplossing hiervoor.

Windows onderdelen aanzetten voor WSL2

In Windows moet je 2 onderdelen aanzetten om WSL2 te kunnen gebruiken.
Ga naar ‘Windows onderdelen in-of uitschakelen’ en zet daar aan:

  • Hyper V
  • Windows-subsysteem voor Linux

Windows onderdelen aanzetten

WSL2 aanzetten

Open nu de Docker desktop applicatie, je kan nu bij instellingen ‘Use the WSL 2 based engine’ aanzetten.

Ubuntu installeren

Ik gebruik Ubuntu als WSL intergratie, je kan ook een andere distributie kiezen.
Om Ubuntu te installeren of een andere dustributie, open ‘Windows Powershell’.
Dit kan je doen door op de Window toets te drukken en zoeken naar powershell, open deze applicatie als admin.

Powersheel als admin openen

Om te kijken welke WSL versie er draait, voer het volgende uit:

wsl -l -v

Het volgende zou je nu moeten zien:

WSL versie bekijken

Voer het volgende in Om de beschikbare distributies te zien:

wsl  --list --online

Een distributie kan je installeren via:

wsl --install -d distributie_naam

Je krijgt nu een Wizzard die je kan doorlopen om de distributie te installeren.

Eerste probleem, WSL distributie is niet te zien in Docker desktop

Na de installatie, ga terug naar Docker Desktop -> Settings -> Resources -> WSL intergration.

Bij mij was hier geen distributie te zien. Dit kwam omdat bij mij versie 1 van Ubuntu was geïnstalleerd.
Dit kan je eenvoudig controleren in Windows Powershell, voer het volgende weer uit om de versies te controleren mocht je ook geen distributie zien in je Docker desktop applicatie

wsl -l -v

WSl1 omzetten naar WSL2

Staat hier een 1, gelukkig hoef je niets de de-installeren en weer te installeren. Voer het volgende uit om te switchen naar versie 2

wsl --set-version distributie_naam 2

De distributie is nu opgezet naar versie 2 en zou je en kunnen gebruiken in Docker desktop.

WSL2 gebruiken in Docker

Bestandlocatie in Ubuntu

Bestanden van je project zullen vanaf nu op de Ubuntu locatie moeten staan. Je kan deze bestanden netzoals Windows bestanden benaderen door de Ubuntu locatie als ‘snelstart’ toe te voegen of een netwerklocatie van maken.
Je kan de locatie benaderen in Windows Explorer door te Klikken op de Windows toets, zoek en open de ‘Ubuntu’ applicatie.

Er zal nu weer een terminal openen en je zit nu inUbuntu. Om deze locatie openen in Windows explorer, voer het volgende uit

explorer.exe .

Je kan nu een locatie toevoegen (rechtermuisknop), ‘Aan snelle start vastmaken’

Netwerkverbinding maken

Handig is om deze locatie ook als netwerklocatie toe te voegen zodat je het bovenstaande niet steeds hoeft te doen.

Docker project opstarten

Je zal je Docker-compose, Nginx en overige project bestanden nu moeten kopiëren/toevoegen naar de deze locatie.
Het opstarten van de Docker containers werkt gewoon precies hetzelfde.

Schijfrechten

Linux werkt net even wat anders met schijfrechten, wellicht dat je deze nog moet goed zetten. Ik gebruik voornamelijk Laravel en doe dan het volgende:

cd naar_je_laravel_project
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/

Rechten probleem met het Laravel artisan commando

Met het Laravel artisan command kan je o.a. nieuwe migratie, controllers, models enz. bestanden aanmaken. Hoewel de bestanden werden aangemaakt kreeg ik een foutmelding bij het aanpassen van deze bestanden in PHPstorm.

Het komt omdat hij deze nieuwe bestanden aanmaakt als de root user.
Je kan dit controleren door naar de locatiefolder te gaan met de terminal en ls -al uit te voeren.

Ook zal je zien dat er een backup van de file is gemaakt, deze zie je niet terug in PHPstorm.
Voorbeeld:

Tilde in WSL2 bestandnaam

Oplossing voor dit rechtenprobleem

De oplossing is om in je Dockerfile een gebruiker aan te maken en te gebruiken zodat nieuwe bestanden niet als root worden aangemaakt.


FROM php:8.1-fpm-alpine
...

RUN adduser --disabled-password --gecos '' developer
RUN chown -R developer:www-data /var/www
USER developer
  • We maken een nieuwe gebruiker aan zonder wachtwoord
  • We voegen deze gebruiker toe aan ‘www-data’, dit is de groep die php:8.1-fpm-alpine aanmaakt
  • We zeggen dat we deze gebruiker nu willen gebruiken.

Composer packages installeren als niet root gebruiker

Ongeveer hetzelfde probleem als het vorige issue. De oplossing is om een user aan de Docker composer container te geven.
user: “1000:1000”


composer:
    image: composer:latest
    user: "1000:1000"
.....

Probleem met het mounten van default.conf

Voor een wat ouder Laravel project krijg ik deze error bij het opstarten van de Docker containers (docker-compose up -d –build) in de terminal van PHPStorm:

ERROR: for nginx  Cannot start service nginx: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/run/desktop/mnt/host/uC/wsl$/Ubuntu-20.04/home/mvd/www/project_name/nginx/default.conf" to rootfs at "/etc/nginx/conf.d/default.conf": mount /run/desktop/mnt/host/uC/wsl$/Ubuntu-20.04/home/mvd/www/project_name/nginx/default.conf:/etc/nginx/conf.d/default.conf (via /proc/self/fd/14), flags: 
0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: Encountered errors while bringing up the project.

Oplossing

Niet echt een oplossing maar als ik naar de terminal van Ubuntu ga en daar de containers opstart werkt het wel.


Node JS problemen

Met Node js nog problemen met compilen, vaak was de oplossing om de node_modules folder te verwijderen opnieuw te downloaden (npm install).

Bij een ander project kreeg ik maar errors bij het compilen van Node JS, rechten goed gezet, Docker images verwijderd, Docker / PC al opnieuw opgestart enz. maar foutmelding bleef.
Uiteindelijk een andere Node JS versie image voor de Docker container gepakt en die werkte wel :/


Netwerk issue

Op locatie bij een klant had ik geen netwerk in WSL2/Ubuntu maar wel in Windows zelf.
De oplossing was op netwerkinstellingen te resetten

netsh winsock reset 
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns

Hierna je laptop/pc opnieuw te starten.

Overige Docker gerelateerde berichten

WEBBOUWPLUS

Marcel van Doornen - Freelance Laravel developer
Marcel van Doornen, freelance Laravel developer
Ben je benieuwd hoe ik jou kan helpen?
Neem contact met mij op