Introduzione ai contenitori Docker remoti in WSL 2

Questa guida dettagliata consente di iniziare a sviluppare con contenitori remoti configurando Docker Desktop per Windows con WSL 2 (sottosistema Windows per Linux, versione 2).

Docker Desktop per Windows offre un ambiente di sviluppo per la creazione, la spedizione e l'esecuzione di app dockerized. Abilitando il motore basato su WSL 2, è possibile eseguire sia contenitori Linux che Windows in Docker Desktop nello stesso computer. (Docker Desktop è gratuito per uso personale e piccole aziende, per informazioni su Pro, Team o Prezzi aziendali, vedere le domande frequenti sul sito Docker).

Nota

È consigliabile usare Docker Desktop a causa della relativa integrazione con Windows e sottosistema Windows per Linux. Tuttavia, mentre Docker Desktop supporta l'esecuzione di contenitori Linux e Windows, non è possibile eseguire entrambi contemporaneamente. Per eseguire i contenitori Linux e Windows contemporaneamente, è necessario installare ed eseguire un'istanza Docker separata in WSL. Se è necessario eseguire contenitori simultanei o si preferisce installare un motore di contenitori direttamente nella distribuzione Linux, seguire le istruzioni di installazione di Linux per tale servizio contenitore, ad esempio Installare il motore Docker in Ubuntu o Installare Podman per l'esecuzione di contenitori Linux.

Panoramica dei contenitori Docker

Docker è uno strumento usato per creare, distribuire ed eseguire applicazioni usando i contenitori. I contenitori consentono agli sviluppatori di creare un pacchetto di un'app con tutti i componenti necessari (librerie, framework, dipendenze e così via) e di distribuirli come un unico pacchetto. L'uso di un contenitore garantisce che l'app venga eseguita lo stesso indipendentemente da eventuali impostazioni personalizzate o da librerie precedentemente installate nel computer in cui è in esecuzione che potrebbero essere diverse da quelle del computer usato per scrivere e testare il codice dell'app. Ciò consente agli sviluppatori di concentrarsi sulla scrittura del codice senza doversi preoccupare del sistema in cui verrà eseguito il codice.

I contenitori Docker sono simili alle macchine virtuali, ma non creano un intero sistema operativo virtuale. Docker consente invece all'app di usare lo stesso kernel Linux del sistema in cui è in esecuzione. Ciò consente al pacchetto dell'app di richiedere solo i componenti non ancora presenti nel computer host, riducendo le dimensioni del pacchetto e migliorando le prestazioni.

La disponibilità continua, usando contenitori Docker con strumenti come Kubernetes, è un altro motivo per l'ampia diffusione dei contenitori. In questo modo è possibile creare più versioni del contenitore dell'app in momenti diversi. Invece di dover ridurre un intero sistema per gli aggiornamenti o la manutenzione, ogni contenitore (e i relativi microservizi specifici) può essere sostituito al volo. Puoi preparare un nuovo contenitore con tutti gli aggiornamenti, configurare il contenitore per la produzione e puntare semplicemente al nuovo contenitore quando è pronto. Puoi anche archiviare versioni diverse dell'app usando i contenitori e mantenerle in esecuzione come fallback di sicurezza, se necessario.

Per altre informazioni, vedere Introduzione ai contenitori Docker.

Prerequisiti

Nota

WSL può eseguire distribuzioni in modalità WSL versione 1 o WSL 2. È possibile controllare questa operazione aprendo PowerShell e immettendo: wsl -l -v. Assicurarsi che la distribuzione sia impostata per usare WSL 2 immettendo: wsl --set-version <distro> 2. Sostituire <distro> con il nome di distribuzione (ad esempio Ubuntu 18.04).

Nella versione 1 di WSL, a causa delle differenze fondamentali tra Windows e Linux, il motore Docker non poteva essere eseguito direttamente all'interno di WSL, quindi il team Docker ha sviluppato una soluzione alternativa usando macchine virtuali Hyper-V e LinuxKit. Tuttavia, poiché WSL 2 ora viene eseguito in un kernel Linux con capacità completa di chiamata di sistema, Docker può essere completamente eseguito in WSL 2. Ciò significa che i contenitori Linux possono essere eseguiti in modo nativo senza emulazione, ottenendo prestazioni migliori e interoperabilità tra gli strumenti Windows e Linux.

Installare Docker Desktop

Con il back-end WSL 2 supportato in Docker Desktop per Windows, è possibile lavorare in un ambiente di sviluppo basato su Linux e compilare contenitori basati su Linux, usando Visual Studio Code per la modifica e il debug del codice ed eseguendo il contenitore nel browser Microsoft Edge in Windows.

Per installare Docker (dopo aver già installato WSL):

  1. Scaricare Docker Desktop e seguire le istruzioni di installazione.

  2. Dopo l'installazione, avviare Docker Desktop dal menu Start di Windows, quindi selezionare l'icona Docker dal menu icone nascoste della barra delle applicazioni. Fare clic con il pulsante destro del mouse sull'icona per visualizzare il menu comandi Docker e selezionare "Impostazioni". Icona del dashboard di Docker Desktop

  3. Assicurarsi che "Usare il motore basato su WSL 2" sia selezionato in Impostazioni>generali. Impostazioni generali di Docker Desktop

  4. Selezionare dalle distribuzioni di WSL 2 installate in cui si vuole abilitare l'integrazione di Docker passando a: Impostazioni>risorse>WSL Integration. Impostazioni delle risorse di Docker Desktop

  5. Per verificare che Docker sia stato installato, aprire una distribuzione WSL (ad esempio Ubuntu) e visualizzare la versione e il numero di compilazione immettendo: docker --version

  6. Verificare che l'installazione funzioni correttamente eseguendo un'immagine Docker predefinita semplice usando: docker run hello-world

Suggerimento

Ecco alcuni comandi Docker utili da conoscere:

  • Elenca i comandi disponibili nell'interfaccia della riga di comando di Docker immettendo: docker
  • Elenca le informazioni per un comando specifico con: docker <COMMAND> --help
  • Elenca le immagini Docker nel computer (che è solo l'immagine hello-world a questo punto) con: docker image ls --all
  • Elencare i contenitori nel computer con: docker container ls --all o docker ps -a (senza il flag -a show all, verranno visualizzati solo i contenitori in esecuzione)
  • Elencare le informazioni a livello di sistema relative all'installazione di Docker, incluse le statistiche e le risorse (memoria CPU & ) disponibili nel contesto WSL 2, con: docker info

Sviluppare in contenitori remoti con VS Code

Per iniziare a sviluppare app con Docker con WSL 2, è consigliabile usare VS Code, insieme alle estensioni WSL, Dev Container e Docker.

  • Installare l'estensione WSL di VS Code. Questa estensione consente di aprire il progetto Linux in esecuzione in WSL in VS Code (non è necessario preoccuparsi dei problemi di percorso, compatibilità binaria o altre sfide tra sistemi operativi).

  • Installare l'estensione Vs Code Dev Containers. Questa estensione consente di aprire la cartella del progetto o il repository all'interno di un contenitore, sfruttando il set completo di funzionalità di Visual Studio Code per eseguire il lavoro di sviluppo all'interno del contenitore.

  • Installare l'estensione Docker di VS Code. Questa estensione aggiunge la funzionalità per compilare, gestire e distribuire applicazioni in contenitori dall'interno di VS Code. È necessaria l'estensione Dev Containers per usare effettivamente il contenitore come ambiente di sviluppo.

Usare Docker per creare un contenitore di sviluppo per un progetto di app esistente.

  1. Per questo esempio, si userà il codice sorgente dell'esercitazione Hello World per Django nell'ambiente di sviluppo Python configurato la documentazione. È possibile ignorare questo passaggio se si preferisce usare il proprio codice sorgente del progetto. Per scaricare l'app Web HelloWorld-Django da GitHub, aprire un terminale WSL (ad esempio Ubuntu) e immettere: git clone https://github.com/mattwojo/helloworld-django.git

    Nota

    Archiviare sempre il codice nello stesso file system in cui si usano gli strumenti. Ciò comporterà prestazioni di accesso ai file più veloci. In questo esempio viene usata una distribuzione Linux (Ubuntu) e si vuole archiviare i file di progetto nel file system \\wsl\WSL. L'archiviazione dei file di progetto nel file system di Windows rallenta notevolmente quando si usano gli strumenti Linux in WSL per accedere a tali file.

  2. Dal terminale WSL modificare le directory nella cartella del codice sorgente per questo progetto:

    cd helloworld-django
    
  3. Aprire il progetto in VS Code in esecuzione nel server di estensione WSL locale immettendo:

    code .
    

    Verificare che la distribuzione di WSL Linux sia connessa controllando l'indicatore remoto verde nell'angolo inferiore sinistro dell'istanza di VS Code.

    Indicatore remoto WSL di VS Code

  4. Dal pallette del comando VS Code (CTRL + MAIUSC + P), immettere: Contenitori di sviluppo: Aprire cartella nel contenitore... Se questo comando non viene visualizzato quando si inizia a digitarlo, verificare di aver installato l'estensione Contenitori di sviluppo collegata in precedenza.

    Comando Contenitori dev di VS Code

  5. Selezionare la cartella del progetto da inserire in contenitori. Nel mio caso, questo è \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\

    Cartella Contenitori dev di VS Code

  6. Verrà visualizzato un elenco di definizioni di contenitori, poiché nella cartella del progetto (repository) non è ancora presente alcuna configurazione del contenitore di sviluppo. L'elenco delle definizioni di configurazione del contenitore visualizzato viene filtrato in base al tipo di progetto. Per il progetto Django, selezionare Python 3.

    Definizioni di configurazione dei contenitori dev di VS Code

  7. Verrà aperta una nuova istanza di VS Code, si inizierà a creare la nuova immagine e una volta completata la compilazione, verrà avviato il contenitore. Si noterà che una nuova .devcontainer cartella è apparsa con le informazioni di configurazione del contenitore all'interno di un Dockerfile file e devcontainer.json .

    Cartella VS Code .devcontainer

  8. Per verificare che il progetto sia ancora connesso a WSL e all'interno di un contenitore, aprire il terminale integrato di VS Code (CTRL + MAIUSC + ~). Controllare il sistema operativo immettendo: uname e la versione python con: python3 --version. È possibile notare che l'unme è tornato come "Linux", quindi si è ancora connessi al motore WSL 2 e il numero di versione di Python sarà basato sulla configurazione del contenitore che può essere diversa dalla versione python installata nella distribuzione WSL.

  9. Per eseguire ed eseguire il debug dell'app all'interno del contenitore usando Visual Studio Code, aprire prima di tutto il menu Esegui (CTRL+MAIUSC+D o selezionare la scheda sulla barra dei menu all'estrema sinistra). Selezionare quindi Esegui e debug per selezionare una configurazione di debug e scegliere la configurazione più adatta al progetto(nell'esempio seguente sarà "Django"). Verrà creato un launch.json file nella .vscode cartella del progetto con le istruzioni su come eseguire l'app.

    Configurazione di debug dell'esecuzione di VS Code

  10. All'interno di VS Code selezionare Avvia>debug (o premere semplicemente F5 ). Verrà aperto un terminale all'interno di VS Code e verrà visualizzato un risultato simile al seguente: "Avvio del server di sviluppo all'uscita http://127.0.0.1:8000/ del server con CONTROL-C". Tenere premuto il tasto Di controllo e selezionare l'indirizzo visualizzato per aprire l'app nel Web browser predefinito e visualizzare il progetto in esecuzione all'interno del contenitore.

    VS Code che esegue un contenitore Docker

È stato configurato un contenitore di sviluppo remoto con Docker Desktop, basato sul back-end WSL 2, che è possibile scrivere codice, compilare, eseguire, distribuire o eseguire il debug con VS Code.

Risoluzione dei problemi

Contesto docker WSL deprecato

Se si usava un'anteprima tecnica anticipata di Docker per WSL, potrebbe essere disponibile un contesto Docker denominato "wsl" ora deprecato e non più usato. È possibile controllare con il comando : docker context ls. È possibile rimuovere questo contesto "wsl" per evitare errori con il comando: docker context rm wsl come si vuole usare il contesto predefinito per Windows e WSL2.

Possibili errori che potrebbero verificarsi con questo contesto wsl deprecato includono: docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. o error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.

Per altre informazioni su questo problema, vedere Come configurare Docker in Windows System for Linux (WSL2) in Windows 10.

Problemi durante la ricerca della cartella di archiviazione delle immagini Docker

Docker crea due cartelle di distribuzione per archiviare i dati:

  • \wsl$\docker-desktop
  • \wsl$\docker-desktop-data

È possibile trovare queste cartelle aprendo la distribuzione di WSL Linux e immettendo: explorer.exe . per visualizzare la cartella in Windows Esplora file. Immettere: \\wsl\<distro name>\mnt\wsl sostituendo <distro name> con il nome della distribuzione (ad esempio. Ubuntu-20.04) per visualizzare queste cartelle.

Per altre informazioni sull'individuazione dei percorsi di archiviazione Docker in WSL, vedere questo problema dal repository WSL o da questo post stackOverlow.

Per altre informazioni sulla risoluzione dei problemi generali in WSL, vedere la documentazione sulla risoluzione dei problemi .

Risorse aggiuntive