Skip to content

È possibile eseguire Docker in modo nativo sul nuovo spazio utente bash di Windows 10 (Ubuntu)?

Jazmín, un membro di questo fantastico team, ci ha fatto il favore di scrivere questo tutorial perché conosce perfettamente l'argomento.

Soluzione:

Soluzione 1:

È possibile utilizzare Docker Desktop per Windows come motore e Docker per Linux come client in WSL su Ubuntu / Debian su Windows. Collegarli via TCP.

Installare Docker Desktop per Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows
Se si desidera utilizzare container Windows invece di container Linux, entrambi i tipi di container possono essere gestiti da Linux. docker client nello spazio utente di bash.

Dalla versione 17.03.1-ce-win12 (12058) è necessario controllare Esporre il demone su tcp://localhost:2375 senza TLS per consentire al client Docker di Linux di continuare a comunicare con il demone Docker di Windows tramite TCP

Seguire questi passaggi:

cd
wget https://download.docker.com/linux/static/stable/`uname -m`/docker-19.03.1.tgz
tar -xzvf docker-*.tgz
cd docker
./docker -H tcp://0.0.0.0:2375 ps

o

env DOCKER_HOST=tcp://0.0.0.0:2375 ./docker ps

Per renderlo permanente:

mkdir ~/bin
mv ~/docker/docker ~/bin

Aggiungere le variabili corrispondenti a .bashrc

export DOCKER_HOST=tcp://0.0.0.0:2375
export PATH=$PATH:~/bin

Naturalmente, è possibile installare docker-compose

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

O usando python pip

sudo apt-get install python-pip bash-completion
sudo pip install docker-compose

e il completamento di Bash. La parte migliore:

sudo -i
apt-get install bash-completion
curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker > /etc/bash_completion.d/docker
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

L'ho testato utilizzando la versione 2.1.0.1 (37199) di Docker Desktop con Hyper-V:

$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89e8a
 Built:             Thu Jul 25 21:17:37 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:17:52 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
Look both client and server say **OS/Arch: linux/amd64**

Volumi

Fare attenzione quando si aggiungono i volumi. Il percorso C:dir sarà visibile come /mnt/c/dir su WSL e come /c/dir/ da docker engine. È possibile superarlo in modo permanente:

sudo bash -c "echo -e '[automount] nroot = /'>/etc/wsl.conf"

È necessario uscire e ricaricare WSL dopo aver apportato la modifica a wsl.conf, in modo che WSL legga le modifiche all'avvio.

AGGIORNAMENTO

da: Novità per la riga di comando in Windows 10 versione 1803

Zoccoli Unix
I socket Unix non erano supportati su Windows, ma ora lo sono! È possibile comunicare tramite socket Unix tra Windows e WSL. Uno dei vantaggi è che WSL può eseguire il client Docker di Linux per interagire con il demone Docker in esecuzione su Windows.

AGGIORNAMENTO

Questo script e l'uso di Unix Sockets sono stati inclusi in pengwin-setup.

Saluti

Soluzione 2:

Al momento (aprile 2016) la risposta è:

Non lo sappiamo ancora (ma probabilmente no).

I fatti

  • Windows 10 è ora in grado di eseguire una serie di programmi Linux (tra cui la shell
    la shell Bash e varie utilità di testo). Non si tratta di porte
    (cioè di versioni ricompilate, come ad esempio in Cygwin), ma sono
    sono gli stessi binari ELF che vengono eseguiti su un tipico sistema Linux. In questo
    questo caso, sono stati presi da Ubuntu.
  • Per rendere questo possibile, Windows 10 è stato modificato per accettare le chiamate di sistema di Linux (syscalls) e per essere in grado di caricare ed eseguire binari ELF (commento di Scott Hanselman). Ciò significa che gli eseguibili Linux non modificati possono essere eseguiti, caricheranno le loro librerie condivise non modificate come richiesto e Windows li eseguirà come processi Windows.
  • Ogni volta che un programma Linux vuole interagire con il kernel, emette una chiamata di sistema (o lascia che sia una libreria a farlo). Questa è (presumibilmente) l'unica differenza rispetto all'esecuzione su Linux: Quando si esegue su Linux, è il kernel di Linux a gestire queste chiamate; su Windows 10, invece, è il kernel di Windows 10 a farlo.

La speculazione

Quindi la domanda è se le chiamate di sistema di cui Docker ha bisogno (per chroot e namespace, tra le altre cose) siano state implementate o meno. La risposta è probabilmente "no". Docker richiede funzionalità piuttosto sofisticate (e specifiche di Linux) per la gestione dei processi e delle risorse e per l'isolamento dei processi. Sebbene sia probabilmente possibile replicare tutto questo su Windows, sarebbe molto lavoro e, dato che l'obiettivo di questa funzione di Windows sembra essere l'esecuzione di programmi userspace di Linux, sembra improbabile che abbiano fatto tutto il lavoro (e lo abbiano tenuto segreto).

Tuttavia, non ci sono informazioni definitive in entrambi i casi, per quanto ne so.

Porte Docker esistenti

Naturalmente, se Microsoft decide di volere il supporto di Docker in Windows 10, probabilmente sarà in grado di offrirlo. Ci sono alcuni precedenti per il porting di Docker su un kernel diverso:

  • Esiste un porting di Docker per FreeBSD. È etichettato come "sperimentale", ma in linea di principio sembra funzionare. Può usare contenitori Docker non modificati dal repository Docker, il che significa che fornisce un ambiente host simile a Linux per le immagini.
  • È in corso un progetto per il porting di Docker su Windows (nello specifico, Windows Server 2016) - si veda questo articolo del blog di Docker dell'agosto 2015. Tuttavia, a differenza del porting FreBSD di cui sopra, questo sarà un porting che permetterà a Docker di eseguire immagini Windows su Windows, non immagini Linux su Windows. Grazie a Rоry McCune per avercelo fatto notare.

Soluzione 3:

No, non è possibile.

Docker ha bisogno di più cose per eseguire i container:

  • chroot
  • Spazi dei nomi per:
    • PID
    • Utenti
    • Rete
    • Montaggi
    • UTS
    • IPC

Queste sono tutte funzioni del kernel implementate in Linux. Sfortunatamente, la maggior parte di esse non ha una funzione simile in Windows da utilizzare in sostituzione (né nel sottosistema Linux che Microsoft ha implementato nel kernel di Windows). Tutte queste caratteristiche devono essere fornite dal sistema operativo.


Soluzione 4:

La prima anteprima insider è stata rilasciata ieri. Ho tentato di installare docker, ma il problema è il seguente:
docker fail

Quindi sembrerebbe che per la prima anteprima non funzioni attualmente. Tuttavia, come molti hanno ipotizzato, potrebbe funzionare in una versione futura.


Soluzione 5:

A partire dal Creator Update (rilasciato pubblicamente il 13 giugno 2017) è possibile eseguire gli eseguibili nativi di Windows direttamente in WSL. Ciò significa che se avete già installato Docker per Windows potete semplicemente invocare il comando docker installati sotto C:Program Files. Poiché terminano in .exe l'opzione più semplice è quella di creare degli alias. Qualcosa di simile a quanto segue nel proprio file .bashrc dovrebbe funzionare:

DOCKER_BIN='/mnt/c/Program Files/Docker/Docker/resources/bin'
for f in "$DOCKER_BIN"/*; do
  alias "$(basename "$f" | sed 's/.exe$//')"'="'"$f"'"'
done

Questo crea degli alias per tutti i file della cartella DOCKER_BIN :

$ type docker
docker is aliased to `"/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe"'

$ docker --version
Docker version 17.03.1-ce, build c6d412e

Un'avvertenza: si otterrà un messaggio di errore come "Impossibile tradurre la directory di lavoro corrente" se eseguito da una directory Linux. Solo cd in una directory Windows (ad es. /mnt/c/Users/YourUsername) e si dovrebbe essere a posto.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.