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 compilazione, la spedizione e l'esecuzione di app con docker. Abilitando il sistema basato su WSL 2, è possibile eseguire contenitori sia Linux che Windows in Docker Desktop nello stesso computer. (Docker Desktop è gratuito per uso personale e piccole imprese; per informazioni sulle tariffe Pro, Team e Business, vedere le Domande frequenti sul sito Docker.)

Nota

È consigliabile usare Docker Desktop grazie all'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 arrestare un intero sistema per gli aggiornamenti o la manutenzione, ogni contenitore (e i microservizi specifici) possono essere sostituiti in tempo reale. 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 ulteriori informazioni, vedere Introduzione ai contenitori Docker.

Prerequisiti

Per altre informazioni, vedere la documentazione di Docker Requisiti di sistema per installare Docker Desktop in Windows.

Per informazioni su come installare Docker in Windows Server, vedere Introduzione: Preparazione di Windows per i contenitori.

Nota

WSL può eseguire distribuzioni in modalità WSL versione 1 o WSL 2. Puoi verificarlo 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 della distribuzione (ad esempio Ubuntu 18.04).

In WSL versione 1, a causa di differenze fondamentali tra Windows e Linux, non è stato possibile eseguire il motore Docker 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à di chiamata di sistema completa, Docker può essere eseguito completamente 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 di 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 delle icone nascoste della barra delle applicazioni. Fare clic sull'icona con il pulsante destro del mouse per visualizzare il menu dei comandi di Docker e selezionare "Impostazioni". Icona del dashboard di Docker Desktop

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

  4. Selezionare tra le distribuzioni di WSL 2 installate quella in cui si vuole abilitare l'integrazione di Docker andando su: Impostazioni> Risorse>Integrazione WSL. 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 build immettendo: docker --version

  6. Verificare che l'installazione funzioni correttamente eseguendo una semplice immagine Docker incorporata 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 -a show all flag, 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 (CPU e memoria) disponibili nel contesto WSL 2, con: docker info

Sviluppare in contenitori remoti usando VS Code

Per iniziare a sviluppare app con Docker con WSL 2, è consigliabile usare VS Code, insieme alle estensioni WSL, Dev Containers 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 di problemi di percorso, compatibilità binaria o altre problematiche tra sistemi operativi).

  • Installare l'estensione VS Code Dev Containers. Questa estensione consente di aprire la cartella o il repository del progetto 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 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.)

Si userà 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 nella documentazione della configurazione dell'ambiente di sviluppo Python. È 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 si usa una distribuzione Linux (Ubuntu) e si vogliono archiviare i file di progetto nel file system WSL \\wsl\. L'archiviazione dei file di progetto nel file system Windows rallenta notevolmente quando si usano gli strumenti Linux in WSL per accedere a tali file.

  2. Dal terminale WSL passare alla 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 di essere connessi alla distribuzione di WSL Linux controllando l'indicatore remoto verde nell'angolo inferiore sinistro dell'istanza di VS Code.

    Indicatore remoto WSL di VS Code

  4. Dal riquadro comandi di VS Code (CTRL+ MAIUSC+ P), immettere: Dev Containers: Reopen in Container (Contenitori di sviluppo: Riaprire nel contenitore ) perché si usa una cartella già aperta usando l'estensione WSL. In alternativa, usare Contenitori di sviluppo: Apri cartella nel contenitore... per scegliere una cartella WSL usando la condivisione locale \\wsl$ (dal lato Windows). Per altri dettagli, vedere Avvio rapido di Visual Studio Code : Aprire una cartella esistente in un contenitore . Se questi comandi non vengono visualizzati man mano che si inizia a digitare, verificare di aver installato l'estensione Dev Containers collegata in precedenza.

    Comando Vs Code Dev Containers

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

    Cartella contenitori di sviluppo 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 di sviluppo di VS Code

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

    Cartella .devcontainer di VS Code

  8. Per verificare che il progetto sia ancora connesso a WSL e sia all'interno di un contenitore, aprire il terminale integrato di VS Code (CTRL+ MAIUSC + ~). Controllare il sistema operativo immettendo: uname e la versione di Python con: python3 --version. È possibile notare che l'Uname è 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ò differire dalla versione di Python installata nella distribuzione WSL.

  9. Per avviare 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 ed esegui debug per selezionare una configurazione di debug e scegliere la configurazione più adatta al progetto(nell'esempio seguente sarà "Django"). Verrà creato un file launch.json nella cartella .vscode del progetto con istruzioni su come eseguire l'app.

    Configurazione di debug dell'esecuzione di VS Code

  10. All'interno di VS Code, selezionare Esegui>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 in http://127.0.0.1:8000/ Uscire dal 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 correttamente un contenitore di sviluppo remoto usando Docker Desktop, basato sul back-end WSL 2, in cui è possibile scrivere codice, compilare, avviare, distribuire o eseguire il debug usando VS Code.

Risoluzione dei problemi

Contesto docker WSL deprecato

Se si usa un'anteprima tecnica anticipata di Docker per WSL, potrebbe essere disponibile un contesto Docker denominato "wsl" ora deprecato e non più usato. A questo scopo, verificare 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.

I possibili errori che potrebbero verificarsi con questo contesto wsl deprecato includono: docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. e 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 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 Esplora file di Windows. 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 questo post di StackOverflow.

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

Risorse aggiuntive