Vraag Kun je Docker standaard uitvoeren op de nieuwe Windows 10 (Ubuntu) bash-gebruikersruimte?


Mijn idee was dat de primaire beperking van het draaiende docker op andere besturingssystemen de Linux-netwerkcontainers waren die het mogelijk hebben gemaakt. (Zeker voor Macs).

Kort geleden Microsoft aangekondigd een beta van a Ubuntu linux gebruikersmodus native draait op Windows 10. Dit kan binaries uitgevoerd in ELF-formaat op Windows uitvoeren (in tegenstelling tot cygwin waarvoor een compilatie vereist is.)

Mijn vraag is: Kun je Docker standaard uitvoeren op de nieuwe Windows 10 (Ubuntu) bash-gebruikersruimte?


121
2018-04-04 10:16


oorsprong


Het is niet "gewoon" een bash gebruikersruimte. Het is een echte, redelijk complete Linux-gebruikersruimte, maar zonder X Windows, d.w.z. alleen tekst. Als u "bash" zegt, wordt de beperking van de tekst vrij goed gecommuniceerd .. - MSalters
Heb ik iets gemist? Is dit daadwerkelijk gedistribueerd? Op dit moment ken ik het alleen als vaporware. - Michael Hampton♦
Ik denk dat het niet duidelijk zal zijn totdat ze dit vrijgeven (AFAIK, het is nog niet eens beschikbaar voor Windows-insiders) maar het is de moeite waard om op te merken dat Microsoft en Docker bezig zijn om Docker naar Windows te brengen, om samen met Windows Server 2016 te worden uitgebracht. - Rоry McCune
@ RоryMcCune: interessant. Echter volgens dit Docker-blogbericht vanaf augustus 2015 is dit een poort waarmee Docker kan worden uitgevoerd ramen afbeeldingen op Windows, geen Linux-afbeeldingen op Windows. - sleske
dat is inderdaad het doel van het native docker van Windows. De aard van containerisatie is dat je geen systemen met andere kernels kunt draaien, zonder enige virtualisatie of (mogelijk) dit nieuwe subsysteem toe te voegen dat Microsoft aan het ontwikkelen is - Rоry McCune


antwoorden:


Vanaf nu (april 2016) is het antwoord:

We weten het nog niet (maar waarschijnlijk niet).

De feiten

  • Windows 10 kan nu verschillende Linux-programma's uitvoeren (oa de Bash-shell en verschillende teksthulpprogramma's). Dit zijn geen poorten (d.w.z. opnieuw gecompileerde versies, zoals bijvoorbeeld in Cygwin), zij zijn hetzelfde ELF-binaire bestanden die op een typisch Linux-systeem draaien. In In dit geval zijn ze van Ubuntu gehaald.
  • Om dit mogelijk te maken, is Windows 10 aangepast om Linux System-oproepen (syscalls) te accepteren en ELF-binaire bestanden te kunnen laden en uitvoeren (commentaar van Scott Hanselman). Dit betekent dat niet-gemodificeerde Linux-executables kunnen worden uitgevoerd, dat ze hun ongewijzigde gedeelde bibliotheken waar nodig zullen laden en dat Windows ze zal uitvoeren als Windows-processen.
  • Wanneer zo'n Linux-programma met de kernel wil communiceren, geeft het een systeemoproep (of laat het een bibliotheek doen). Dit is (vermoedelijk) het enige verschil met het draaien op Linux: bij het draaien op Linux verwerkt de Linux-kernel deze oproepen; op Windows 10 doet de Windows 10-kernel dat in plaats daarvan.

De speculatie

Dus de vraag is of de syscalls die Docker nodig heeft (onder andere voor chroot en namespaces) geïmplementeerd zijn of niet. Het antwoord is dat waarschijnlijk "nee" is. Docker vereist vrij geavanceerde (en Linux-specifieke) functionaliteit voor proces- en resourcebeheer en procesisolatie. Hoewel het waarschijnlijk mogelijk is om dit allemaal te repliceren op Windows, zou het een hoop werk zijn, en aangezien het doel van deze Windows-functie lijkt op het draaien van Linux-gebruikersruimteprogramma's, lijkt het onwaarschijnlijk dat ze al het werk deden (en het geheim hielden). .

Er is echter hoe dan ook geen definitieve informatie, voor zover ik kan vertellen. 

Bestaande Docker-poorten

Natuurlijk, als Microsoft beslist dat ze Docker-ondersteuning willen in Windows 10, zullen ze het waarschijnlijk kunnen aanbieden. Er is een precedent voor het porten van Docker naar een andere kernel:

  • Er is een Dockerpoort voor FreeBSD. Het wordt als 'experimenteel' bestempeld, maar lijkt in principe te werken. Het kan ongewijzigde Docker-containers uit de Docker-repository gebruiken, wat betekent dat het daadwerkelijk een Linux-achtige hostomgeving voor de afbeeldingen biedt.
  • Er loopt een project voor de overdracht van Docker naar Windows (met name Windows Server 2016) - zie dit Docker-blogitem vanaf augustus 2015. In tegenstelling tot de FreBSD-poort hierboven is dit echter een poort waarmee Docker Windows-afbeeldingen op Windows kan uitvoeren, niet Linux-afbeeldingen op Windows. Met dank aan Rother McCune voor het wijzen van dit.

50
2018-04-05 07:15



Update: er is nu een artikel over het onderwerp op een MSDN-blog: Windows Subsystem for Linux Overview. - sleske
Vanaf vandaag is het mogelijk met Hyper-V: tutorials.ubuntu.com/tutorial/... - Nick Sweeting
Ik heb eenvoudigweg besloten dat het hoger gestemde antwoord nuttiger is dan speculatie over wat mogelijk is, het dekt wat is. - James


U kunt Docker voor Windows gebruiken als de engine en Docker voor Linux als de client in Bash op Ubuntu op Windows. Verbind ze via TCP.

Installeer Docker voor Windows: https://docs.docker.com/docker-for-windows/ Als u in plaats van Linux Containers Windows Containers wilt gebruiken, kunnen beide typen containers worden beheerd door de linux docker-client in de bash-gebruikersruimte.

Sinds versie 17.03.1-ce-win12 (12058) moet je controleren Expose daemon op tcp: // localhost: 2375 zonder TLS om ervoor te zorgen dat de linux docker-client blijft communiceren met de windows docker daemon via TCP

Volg deze stappen:

cd
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.1-ce.tgz
tar -xzvf docker-*.tgz
cd docker
./docker -H tcp://0.0.0.0:2375 ps

of

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

Om het permanent te maken:

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

Voeg de bijbehorende variabelen toe aan .bashrc

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

Natuurlijk kunt u docker-compose installeren

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

Of met behulp van python pip

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

En Bash-voltooiing. Het beste gedeelte:

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

Ik heb het getest met behulp van de 18.06.0-ce-win59 (19098) -versie van Docker voor Windows met Hyper-V:

~$ docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:04:39 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:13:46 2018
  OS/Arch:          linux/amd64
  Experimental:     true

Zie zowel client als server zeggen OS / Arch: linux / amd64

volumes

Let op bij het toevoegen van volumes. Het pad C:\dir zal zichtbaar zijn als /mnt/c/dir op WSL en as /c/dir/ door koppelaar motor. Je kunt het permanent overwinnen:

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

U moet WSL afsluiten en opnieuw laden nadat u de wijziging in wsl.conf hebt aangebracht, zodat WSL uw wijzigingen bij het opstarten inleest.

BIJWERKEN

van: Wat is er nieuw voor de opdrachtregel in Windows 10-versie 1803

Unix Sockets   Unix Sockets werden niet ondersteund op Windows, en dat zijn ze nu! U kunt ook communiceren via Unix-sockets tussen Windows en WSL. Een van de voordelen hiervan is dat WSL de Linux Docker Client in staat stelt om te communiceren met de Docker Daemon die op Windows draait.

vriendelijke groeten


99
2017-07-19 22:05



Hallo @ joel-pearson, docker bestaat uit twee delen: de engine en de client. De engine wordt in vensters uitgevoerd met behulp van Docker Toolbox (gebaseerd op VirtualBox) of Docker voor Windows (op basis van Hyper-V), beide officieel ondersteund door het docking-team. Docker-engine draait nog niet in bash-gebruikersruimte. Docker-client in vensters kan worden uitgevoerd in cmd, powershell of cygwin. Wat dit antwoord zegt, is de manier om de docker-client in bash-gebruikersruimte uit te voeren. Waarom? Persoonlijk geef ik de voorkeur aan bash, de voltooiing werkt. Ik ben het ermee eens dat de vraag betrekking heeft op docker-engine, maar ik vond het toen ik op zoek was naar de klant en veel mensen doen hetzelfde. - Carlos Rafael Ramirez
Ik heb het net getest en het werkt voor mij op 1.12 :) Super enthousiast om nu een serieuze ontwikkeling op Windows te kunnen doen. - Zach Russell
Heb je instructies geprobeerd in Bash op Ubuntu op Windows, heb "Kan geen verbinding maken met de Docker-daemon. Is de docker-daemon actief op deze host?". Mis je enkele stappen? - mpen
Vanaf februari 2017 is dit nog steeds de enige manier. - hdave
Na juni 2017 kan dat voer de ... uit docker voor windows uitvoerbare bestanden uit de bash-shell. In plaats van de docker-client te installeren, kunt u de docker.exe rechtstreeks om het docker-subsysteem op te vragen / te interageren. Merk echter op dat het koppelvenster voor vensters de Windows-variabelen en -configuraties gebruikt. - Jaime


De eerste inside-preview is gisteren vrijgegeven. Ik heb geprobeerd om Docker te installeren, maar het faalt met het volgende: docker fail

Het lijkt er dus op dat het voor de eerste preview momenteel niet werkt. Maar zoals veel mensen hebben gespeculeerd, kan het in een toekomstige versie werken.


12
2018-04-07 10:29



Cool - bedankt voor het proberen! - Hawkeye
Goed idee om dit echt te proberen. Eén ding: zou u de tekst van de schermafbeelding als echte tekst willen toevoegen (Ubuntu-terminal ondersteunt kopiëren en plakken). "Echte" tekst heeft tal van voordelen (gemakkelijker te lezen, ondersteunt schermlezers, kan worden gecrawld door zoekmachines) - sleske
Enige update: ik heb docker volledig kunnen installeren op mijn machine waarop de laatste verjaardagsupdate is uitgevoerd. Maar het doen van een docker ps mislukt met: 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? - kumar_harsh
Het lijkt erop dat het nu werkt: tutorials.ubuntu.com/tutorial/... - Nick Sweeting


Nee, dit is niet mogelijk.

Docker heeft meerdere dingen nodig om containers te kunnen uitvoeren:

  • chroot
  • Namespaces voor:
    • PID
    • gebruikers
    • Netwerk
    • mounts
    • UTS
    • IPC

Dit zijn allemaal kernelfuncties die in Linux zijn geïmplementeerd. Helaas hebben de meeste van hen geen vergelijkbare functie in Windows om te gebruiken als vervanging (noch in het Linux-subsysteem dat Microsoft in de Windows-kernel heeft geïmplementeerd). Al deze moeten worden geleverd door het besturingssysteem.


11
2018-04-04 10:21



Windows heeft inderdaad namespaces voor gebruikers, mounts en IPC. User namespaces zijn vereist voor Active Directory, mount namespaces en IPC namespaces zijn vereist voor multi-user werking. Fundamenteel heeft de kernel Object Manager in Windows altijd naamruimten gehad, vanaf de allereerste versie van Windows NT, dus het is niet zo vreemd. - MSalters
En met Remote Desktop Services gebruiken de Session-objecten deze naamruimten actief om gelijktijdig gebruik te bieden. Dat betekent niet dat u over alle benodigde infrastructuur beschikt, maar er zijn belangrijke onderdelen. Wat betreft chroot, beseffen dat de Ubuntu-omgeving al een andere root heeft dan de WIN32-versie. - MSalters
Eigenlijk denk ik dat het te vroeg is om dit op beide manieren te beantwoorden. Zoals beschreven in een opmerking van Scott Hanselman, de Windows 10-kernel accepteert nu Linux-syscalls. Dus de vraag is of de syscalls die Docker nodig heeft (voor chroot en namespaces) geïmplementeerd zijn of niet. Hoewel het antwoord waarschijnlijk "nee" is, is er hoe dan ook geen definitieve informatie, voor zover ik kan vertellen. - sleske
@sleske heeft gelijk, deze vraag is op dit moment niet te verantwoorden, en zeggen "nee kan het niet" zonder enige echte indicatie van wat de ontwikkelaars aan het doen is op de linux-ruimte in weduwen, is nogal aanmatigend. - Ryan
Ik weet niet genoeg om met vertrouwen te stellen dat dit antwoord helemaal verkeerd is, maar de manier waarop het wordt geformuleerd maakt me een beetje sceptisch over de geldigheid ervan. In het bijzonder met de melding "Bash is een eenvoudig gebruikersruimteprogramma en kan geen van deze bieden" en verwijst naar het Window Subsystem for Linux als "de nieuwe Bash-functie" het klinkt alsof dit antwoord is gebaseerd op de totaal verkeerde veronderstelling dat alle Microsoft het deed was port bash voor Windows. Dat is niet wat er gebeurde. Ze ontwikkelden een volledige Linux-kernelinterface die bovenop de Windows-kernel draaide: msdn.microsoft.com/en-us/commandline/wsl/about - Ajedi32


Vanaf Creator Update (openbaar uitgebracht op 13 juni 2017) U kunt native Windows-uitvoerbare bestanden direct in WSL uitvoeren. Dit betekent dat als je al hebt geïnstalleerd Docker voor Windows je kunt gewoon de docker binaries geïnstalleerd onder C:\Program Files. Omdat ze eindigen in .exe de gemakkelijkste optie is om aliassen te maken. Iets als het volgende in uw .bashrc zou moeten werken:

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

Hiermee maakt u aliassen voor alle bestanden in de 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

Een waarschuwing: u krijgt een foutmelding zoals "Kan de huidige werkdirectory niet vertalen"indien uitgevoerd vanuit een Linux-directory cd in een Windows-map (bijv. /mnt/c/Users/YourUsername) en je moet goed zijn.


6
2018-06-22 06:02



Dit lijkt bash-omgevingsvariabelen niet op te nemen in YML-bestanden die samenvatten in dockers. Enig idee daarvoor? - Rüdiger Schulz
Dat is logisch, omdat je Windows aanroept docker binair, en dit alleen via de Linux-shell. Ik weet niet zeker of er een goede manier is om dat te bereiken. - dimo414


Zodra Docker 1.12 is vrijgegeven en de Linux Docker-client is gescheiden, zou u de docker moeten kunnen uitvoeren cliënt in bash van Windows 10.

Dit klinkt misschien niet zo goed als je een Docker Windows-client hebt, maar het is handig als je Linux-toolchains hebt die docker bevatten voor de functionaliteit van de client-side.


5
2018-04-29 09:31





In Windows 10 versie 1607 Build 1493.10 kun je het met succes installeren op Ubuntu Bash, maar het werkt niet :(

Een eenvoudige "docker-versie" zal u vertellen:

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?

Als u vervolgens "sudo docker -d" uitvoert, krijgt u de volgende foutmelding:

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+.

Dus dit is absoluut een stop vanaf de baszijde.

Niettemin, u kunt installeren Docker voor Windows en het werkt als een charme, je kunt natuurlijk Linux-servers implementeren en alles wat je nodig hebt.

> 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
2017-08-12 21:38





Vanaf september 2016, Nee

Alle huidige implementaties van Docker op Windows gebruiken virtualisatie, Docker 1.12 maakt gebruik van een hypervisor in Windows, waardoor het voordeel van containerisatie ten opzichte van virtualisatie wordt weggenomen.

Docker heeft meer nodig dan alleen het gebruik van Linux-systeemoproepen.

Het heeft procesbesturingsgroepen (cgroups), een stapelbaar bestandssysteem (aufs) en andere op Linux gebaseerde systemen buiten de kernel nodig.

Cgroups noch aufs staan ​​standaard in de Windows 10-kernel.

Hier is een implementatie van Windows Server 2016: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server ..maar dit zal alleen een aantal Windows-services uitvoeren, bijvoorbeeld IIS, en niet Ubuntu


2
2017-09-05 13:15





Docker werkt momenteel niet in de huidige build (14316) - ervan uitgaande dat u het kunt installeren.

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

1
2018-04-12 20:47



Geweldig! Blijf het alsjeblieft proberen. - Hawkeye
Het lijkt erop dat dit gerelateerd kan zijn aan hoe geheugentoewijzing werkt in golang (waarin Docker is geschreven): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/... - Timothy Meade
De mijne hangt gewoon voor altijd na het bevel. - wieczorek1990


Van: 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!)

0
2017-08-03 12:20



Dit wordt aangevuld met het feit dat je nu docker-client voor Linux kunt uitvoeren in bash, dus het gebruik van PowerShell vermijden als je niet gebruikt om - Carlos Rafael Ramirez
Het zal interessant zijn om te zien of ze dit opschalen naar havenzwerm. - Hawkeye