Puoi eseguire Docker in modo nativo sul nuovo spazio utenti bash di Windows 10 (Ubuntu)?


126

La mia comprensione era che la principale limitazione dell'esecuzione della finestra mobile su altri sistemi operativi era rappresentata dai contenitori di rete Linux che lo rendevano possibile. (Certamente per Mac).

Recentemente Microsoft ha annunciato una versione beta di una modalità utente Ubuntu per Linux in esecuzione nativamente su Windows 10. Questo può eseguire binari compilati in formato ELF su Windows (a differenza di Cygwin che richiede una compilazione).

La mia domanda è: puoi eseguire Docker in modo nativo sul nuovo spazio utenti bash di Windows 10 (Ubuntu)?


4
Non è "solo" uno bashspazio utente. È uno spazio utente Linux reale, abbastanza completo, ma senza X Windows, ovvero solo testo. Dire "bash" comunica abbastanza bene la limitazione del solo testo.
Salterio

Ho dimenticato qualcosa? Questo è stato effettivamente distribuito? Al momento lo conosco solo come vaporware.
Michael Hampton

2
Penso che non sarà chiaro fino a quando non lo pubblicheranno (AFAIK non è ancora disponibile per gli addetti ai lavori di Windows), tuttavia vale la pena notare che Microsoft e Docker stanno lavorando per portare Docker su Windows in modo nativo, da rilasciare insieme a Windows Server 2016
Rоry McCune,

1
@ RоryMcCune: interessante. Tuttavia, secondo questo blog Docker da agosto 2015, questa sarà una porta che permette Docker di correre di Windows immagini su Windows, non le immagini Linux su Windows.
sleske,

2
in effetti questo è lo scopo della finestra mobile nativa di Windows. La natura della containerizzazione è che non è possibile eseguire sistemi con altri kernel, senza aggiungere un po 'di virtualizzazione o (possibilmente) questo nuovo sottosistema che Microsoft sta sviluppando
Rоry McCune

Risposte:


103

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

Installa Docker Desktop per Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Se desideri utilizzare i contenitori Windows anziché i contenitori Linux, entrambi i tipi di contenitori possono essere gestiti dal client docker Linux in lo spazio utente bash.

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

Segui questi passi:

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

Aggiungi le variabili corrispondenti a .bashrc

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

Ovviamente, puoi 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 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 provato usando la versione 2.1.0.1 (37199) di Docker Desktop usando 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 volumi. Il percorso C:\dirsarà visibile come /mnt/c/dirsu WSL e come /c/dir/dal motore docker. Puoi 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.

AGGIORNARE

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

Prese Unix Le prese Unix non erano supportate su Windows e ora lo sono! È inoltre possibile comunicare tramite socket Unix tra Windows e WSL. Una delle grandi cose a riguardo è che consente a WSL di eseguire il client Docker Linux per interagire con il demone Docker in esecuzione su Windows.

AGGIORNARE

Questo script e l'uso di Unix Socket sono stati inclusi nella configurazione di Pengwin di Pengwin.

Saluti


3
Ciao @ joel-pearson, la finestra mobile ha due parti: il motore e il client. Il motore funziona in Windows utilizzando Docker Toolbox (basato su VirtualBox) o Docker per Windows (basato su Hyper-V) entrambi supportati ufficialmente dal team docker. Il motore Docker non funziona ancora nello spazio utente bash. Il client Docker in Windows può essere eseguito in cmd, powershell o cygwin. Ciò che dice questa risposta è il modo di eseguire il client docker nello spazio utenti di bash. Perché? Personalmente preferisco bash, il completamento funziona. Sono d'accordo sul fatto che la domanda riguardi il motore docker, ma l'ho trovata mentre cercavo il cliente e molte persone fanno lo stesso.
Carlos Rafael Ramirez,

1
L'ho appena testato e funziona per me su 1.12 :) Super entusiasta di essere ora in grado di fare qualche serio sviluppo su Windows.
Zach Russell,

2
Ho provato le tue istruzioni in Bash su Ubuntu su Windows, ho ottenuto "Impossibile connettersi al demone Docker. Il demone docker è in esecuzione su questo host?". Ti mancano alcuni passaggi?
Aprire il

5
A partire da febbraio 2017, questo è ancora l'unico modo.
hdave,

3
Dopo giugno 2017, è possibile eseguire la finestra mobile per gli eseguibili di Windows dalla shell bash . Invece di installare il client docker è possibile utilizzare docker.exedirettamente per eseguire query / interazioni nel sottosistema docker. Tuttavia, si noti che la finestra mobile per Windows utilizzerà le variabili e le configurazioni di Windows.
Jaime,

51

A partire da ora (aprile 2016) la risposta è:

Non lo sappiamo ancora (ma probabilmente no).

I fatti

  • Windows 10 ora può eseguire una varietà di programmi Linux (tra cui la shell Bash e varie utilità di testo). Queste non sono porte (ovvero versioni ricompilate, come ad esempio in Cygwin ), sono gli stessi binari ELF che girano su un tipico sistema Linux. In questo caso, sono stati presi da Ubuntu.
  • Per renderlo possibile, Windows 10 è stato modificato per accettare le chiamate di sistema Linux (syscalls) e per poter caricare ed eseguire i binari ELF ( commento di Scott Hanselman ). Ciò significa che è possibile eseguire eseguibili Linux non modificati, caricheranno le loro librerie condivise non modificate come richiesto e Windows le eseguirà come processi Windows.
  • Ogni volta che un tale programma Linux vuole interagire con il kernel, emette una chiamata di sistema (o consente a una libreria di farlo). Questa è (presumibilmente) l'unica differenza nell'esecuzione su Linux: quando si esegue su Linux, il kernel Linux gestisce queste chiamate; su Windows 10, invece lo fa il kernel di Windows 10.

La speculazione

Quindi la domanda è se i syscall di cui Docker ha bisogno (per chroot e namespace, tra le altre cose) sono stati implementati o meno. La risposta è probabilmente "no". Docker richiede funzionalità abbastanza sofisticate (e specifiche per Linux) per la gestione dei processi e delle risorse e l'isolamento dei processi. Anche se è probabilmente possibile replicare tutto ciò su Windows, sarebbe un sacco di lavoro, e poiché l'obiettivo di questa funzionalità di Windows sembra essere l'esecuzione di programmi di spazio utente Linux, sembra improbabile che abbiano fatto tutto il lavoro (e mantenuto segreto) .

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

Porte Docker esistenti

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

  • C'è una porta Docker per FreeBSD . È etichettato "sperimentale", ma sembra funzionare in linea di principio. Può utilizzare contenitori Docker non modificati dal repository Docker, il che significa che in realtà fornisce un ambiente host simile a Linux per le immagini.
  • È in corso un progetto per il porting di Docker su Windows (in particolare, Windows Server 2016) - vedi questo post sul blog Docker da agosto 2015. Tuttavia, a differenza della porta FreBSD sopra, questa sarà una porta che consente a Docker di eseguire immagini di Windows su Windows, non immagini Linux su Windows. Grazie a Rоry McCune per averlo segnalato.

1
Aggiornamento: ora c'è un articolo sull'argomento su un blog MSDN: Panoramica del sottosistema Windows per Linux .
sleske,

Ad oggi è possibile con Hyper-V: tutorials.ubuntu.com/tutorial/…
Nick Sweeting,

Ho annullato il voto semplicemente perché la risposta più votata è più utile della speculazione su ciò che potrebbe essere, copre ciò che è.
James,

13

La prima anteprima dall'interno è stata rilasciata ieri. Ho tentato di installare la finestra mobile ma non riesce con quanto segue: finestra mobile non riuscita

Così sembrerebbe, che per la prima anteprima attualmente non funziona. Tuttavia, come molte persone hanno ipotizzato, potrebbe funzionare in una versione futura.


5
Buona idea per provare davvero questo. Una cosa: potresti aggiungere il testo dello screenshot come testo effettivo (il terminale Ubuntu supporta il copia e incolla). Il testo "reale" presenta numerosi vantaggi (più facile da leggere, supporta gli screen reader, può essere cercato dai motori di ricerca)
sleske,

Alcuni aggiornamenti: sono stato in grado di installare completamente la finestra mobile sulla mia macchina eseguendo l'aggiornamento dell'anniversario finale. Ma docker psfallire con:Get http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?
kumarharsh


13

No, non è possibile.

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

  • chroot
  • Namespace per:
    • PID
    • utenti
    • Rete
    • Monti
    • UTS
    • IPC

Queste sono tutte funzionalità del kernel implementate in Linux. Sfortunatamente, la maggior parte di essi non ha una funzionalità simile in Windows da utilizzare come sostituto (né nel sottosistema Linux implementato da Microsoft nel kernel di Windows). Tutto ciò deve essere fornito dal sistema operativo.


4
In realtà, Windows ha spazi dei nomi per Utenti, Montaggi e IPC. Gli spazi dei nomi utente sono richiesti per Active Directory, gli spazi dei nomi mount e gli spazi dei nomi IPC sono necessari per il funzionamento multiutente. Fondamentalmente, il kernel Object Manager in Windows ha sempre avuto spazi dei nomi, sin dalla prima versione di Windows NT, quindi non è poi così strano.
Salterio

3
E con Remote Desktop Services, gli oggetti Session utilizzano attivamente questi spazi dei nomi per fornire operazioni simultanee. Ciò non significa che hai tutte le infrastrutture necessarie, ma ci sono parti importanti. Per quanto riguarda chroot, renditi conto che l'ambiente Ubuntu ha già una radice diversa da quella WIN32.
Salterio

6
In realtà, penso che sia troppo presto per rispondere in entrambi i modi. Come descritto in un commento di Scott Hanselman , il kernel di Windows 10 ora accetta i syscall di Linux. Quindi la domanda è se i syscall di cui Docker ha bisogno (per chroot e namespace) sono stati implementati o meno. Mentre la risposta è probabilmente "no", non ci sono informazioni definitive in entrambi i casi, per quanto ne so.
sleske,

1
@sleske ha ragione, al momento questa domanda non è responsabile, e dire "no non può" senza alcuna reale indicazione di ciò che fanno gli sviluppatori che lavorano nello spazio Linux nelle vedove è abbastanza presuntuoso.
Ryan,

2
Non so abbastanza per affermare con sicurezza che questa risposta è totalmente sbagliata, ma il modo in cui è formulato mi rende un po 'scettico sulla sua validità. In particolare affermando "Bash è un semplice programma per lo spazio utente e non può fornire nessuno di questi" e riferendosi al sottosistema Window per Linux come "la nuova funzionalità di Bash" fa sembrare che questa risposta si basi sul presupposto totalmente falso che tutta Microsoft ha fatto è stato portato a Windows. Non è quello che è successo. Hanno sviluppato un intera interfaccia del kernel Linux in esecuzione in cima al kernel di Windows: msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32

7

A partire da Creator Update (rilasciato pubblicamente il 13 giugno 2017) è possibile eseguire eseguibile Windows nativo direttamente in WSL. Questo significa che se hai già installato Docker per Windows puoi semplicemente invocare i dockerbinari installati sotto C:\Program Files. Poiché finiscono .exenell'opzione più semplice è creare alias. Qualcosa di simile al seguente .bashrcdovrebbe 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 alias per tutti i file nella DOCKER_BINdirectory:

$ 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 avvertimento: riceverai un messaggio di errore come " Impossibile tradurre la directory di lavoro corrente " se eseguito da una directory di Linux. Solo cdin una directory di Windows (ad esempio /mnt/c/Users/YourUsername) e dovresti essere bravo.


Questo non sembra raccogliere le variabili di ambiente bash in file YML composti da docker. Qualche idea per quello?
Rüdiger Schulz,

1
Questo ha senso, dal momento che stai invocando il file dockerbinario di Windows e lo stai facendo semplicemente attraverso la shell di Linux. Non sono sicuro che ci sia un buon modo per farlo.
dimo414,

6

Una volta rilasciato Docker 1.12 e separato il client Docker Linux, dovresti essere in grado di eseguire il client docker in Windows 10 bash.

Questo potrebbe non sembrare molto dato che hai un client Docker per Windows ma è utile se hai toolchain Linux che includono docker per la sua funzionalità lato client.


4

In Windows 10 versione 1607 Build 1493.10 è possibile installarlo correttamente su Ubuntu Bash, ma non funziona :(

Una semplice "versione docker" ti dirà:

Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.18/version: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?

Se quindi esegui "sudo docker -d" visualizzi il seguente errore:

FATA[0000] ERROR: You are running Linux kernel version 3.4.0+, which is unsupported for running Docker. Please upgrade your kernel to 3.8+.

Quindi questo è sicuramente un tappo dal lato bash.

Tuttavia, puoi installare Docker per Windows e funziona come un incantesimo, puoi ovviamente distribuire i server Linux e tutto ciò di cui hai bisogno.

> docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      windows/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      linux/amd64

3

A partire da settembre 2016, n.

Tutte le attuali implementazioni di Docker su Windows utilizzano la virtualizzazione, Docker 1.12 utilizza un hypervisor in Windows, eliminando così il vantaggio della containerizzazione rispetto alla virtualizzazione.

Docker ha bisogno di molto più del semplice utilizzo delle chiamate di sistema Linux.

Ha bisogno di gruppi di controllo di processo (cgroups), un filesystem impilabile (aufs), oltre ad altri sistemi basati su Linux all'esterno del kernel.

Né i cgroup né gli auf sono nativamente nel kernel di Windows 10.

C'è un'implementazione di Windows Server 2016 qui: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server .. ma questo eseguirà solo alcuni servizi Windows, ad esempio IIS, e non Ubuntu


2

Docker attualmente non funziona nella build corrente (14316) - presupponendo che sia possibile installarlo.

root@localhost:~# docker --help
runtime: address space conflict: map(0x7ff5ddbb0000) = 0x7ff5ffd20000
fatal error: runtime: address space conflict

Eccezionale! Per favore continua a provare.
Occhio di

Sembra che questo potrebbe essere correlato a come funziona l'allocazione della memoria in Golang (in cui Docker è scritto): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/…
Timothy Meade

Il mio si blocca per sempre dopo il comando.
wieczorek1990,

1

Da: https://blog.docker.com/2016/07/docker-for-mac-and-windows-production-ready/

Faster and more reliable – native development environment using
hypervisors built into each operating system. (No more VirtualBox!)

2
Ciò è integrato dal fatto che ora è possibile eseguire il client docker per Linux in bash, quindi evitare di usare PowerShell se non si è abituati
Carlos Rafael Ramirez,

1
Sarà interessante vedere se lo scalano fino allo sciame di docker.
Occhio di
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.