Czy możesz uruchomić Dockera w nowej przestrzeni użytkownika bash dla systemu Windows 10 (Ubuntu)?


126

Zrozumiałem, że głównym ograniczeniem uruchamiania dokera w innych systemach operacyjnych były pojemniki Linux Network, które to umożliwiły. (Z pewnością dla komputerów Mac).

Niedawno Microsoft ogłosił wersję beta trybu użytkownika Ubuntu Linux działającego natywnie na systemie Windows 10. Może to uruchamiać pliki binarne skompilowane w formacie ELF w systemie Windows (w przeciwieństwie do cygwina, który wymaga kompilacji).

Moje pytanie brzmi: czy możesz uruchomić Dockera w nowej przestrzeni użytkownika bash dla systemu Windows 10 (Ubuntu)?


4
To nie jest „tylko” bashprzestrzeń użytkownika. To prawdziwa, dość kompletna przestrzeń użytkownika Linuksa, ale bez X Windowsa, tzn. Tylko tekstu. Powiedzenie „bash” dość dobrze komunikuje ograniczenie tekstowe.
MSalters

Przegapiłem coś? Czy to faktycznie zostało rozpowszechnione? W tej chwili wiem o tym tylko jako vaporware.
Michael Hampton

2
Myślę, że nie będzie jasne, dopóki nie wypuszczą tego (AFAIK nie jest jeszcze dostępny dla osób z Windowsa), jednak warto zauważyć, że Microsoft i Docker pracują nad wprowadzeniem Dockera do Windows natywnie, który zostanie wydany wraz z Windows Server 2016
Rоry McCune,

1
@ RоryMcCune: Interesujące. Jednakże, zgodnie z tym blogu Docker od sierpnia 2015 roku, będzie to port, który umożliwia Docker do uruchomienia systemu Windows obrazów w systemie Windows, a nie obrazów Linux na Windows.
śleske,

2
rzeczywiście taki jest cel natywnego okna dokowanego systemu Windows. Charakter konteneryzacji jest to, że nie można uruchomić systemu z innymi jądrami, bez dodawania w pewnym wirtualizacji lub (ewentualnie) ten nowy podsystem, że Microsoft rozwijają
Rоry McCune

Odpowiedzi:


103

Możesz używać Docker Desktop dla Windows jako silnika i Docker dla Linux jako klienta w WSL na Ubuntu / Debian na Windows. Połącz je przez TCP.

Zainstaluj Docker Desktop dla systemu Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Jeśli chcesz używać kontenerów Windows zamiast kontenerów Linux, oba kontenery typu mogą być zarządzane przez klienta dokera Linux w przestrzeń użytkownika bash.

Od wersji 17.03.1-ce-win12 (12058) musisz zaznaczyć opcję Ujawnij demona na tcp: // localhost: 2375 bez TLS, aby umożliwić klientowi Linux Docker kontynuowanie komunikacji z demonem Windows Docker przez TCP

Wykonaj następujące kroki:

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

lub

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

Aby było trwałe:

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

Dodaj odpowiednie zmienne do .bashrc

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

Oczywiście możesz zainstalować komponowanie dokera

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

Lub używając Pythona Pipa

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

I zakończenie Bash. Najlepsza część:

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

Przetestowałem to przy użyciu Docker Desktop w wersji 2.1.0.1 (37199) przy użyciu funkcji 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**

Kłęby

Zachowaj ostrożność podczas dodawania woluminów. Ścieżka C:\dirbędzie widoczna jak /mnt/c/dirna WSL i /c/dir/przez silnik dokera. Możesz go przezwyciężyć na stałe:

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

Musisz wyjść i ponownie załadować WSL po wprowadzeniu zmiany do wsl.conf, aby WSL odczytał twoje zmiany przy uruchomieniu.

AKTUALIZACJA

od: Co nowego w wierszu polecenia w systemie Windows 10 w wersji 1803

Gniazda Unix Gniazda Unix nie były obsługiwane w systemie Windows, a teraz są! Możesz także komunikować się przez gniazda Unix między Windows a WSL. Jedną ze wspaniałych rzeczy jest to, że umożliwia WSL uruchamianie klienta Linux Docker w celu interakcji z demonem Docker działającym w systemie Windows.

AKTUALIZACJA

Ten skrypt i użycie gniazd uniksowych zostały uwzględnione w konfiguracji pengwin Pengwina .

pozdrowienia


3
Witaj @ joel-pearson, doker ma dwie części: silnik i klienta. Silnik działa w systemie Windows przy użyciu Docker Toolbox (oparty na VirtualBox) lub Docker dla Windows (oparty na Hyper-V), oba oficjalnie obsługiwane przez zespół dokerów. Silnik Docker jeszcze nie działa w przestrzeni użytkownika bash. Klient Docker w systemie Windows może być uruchamiany w cmd, PowerShell lub cygwin. To, co mówi ta odpowiedź, jest sposobem na uruchomienie klienta dokera w przestrzeni użytkownika bash. Dlaczego? Osobiście wolę bash, ukończenie działa. Zgadzam się, że pytanie dotyczy silnika dokującego, ale znalazłem je, kiedy szukałem klienta, i wiele osób robi to samo.
Carlos Rafael Ramirez

1
Właśnie go przetestowałem i działa dla mnie na 1.12 :) Super podekscytowany, że mogę teraz poczynić poważne zmiany w systemie Windows.
Zach Russell

2
Wypróbowałem instrukcje w Bash na Ubuntu w systemie Windows, otrzymałem komunikat „Nie możesz połączyć się z demonem Docker. Czy demon dokera działa na tym hoście?”. Czy brakuje Ci niektórych kroków?
mpen

5
Od lutego 2017 r. Jest to jedyny sposób.
hdave

3
Po czerwcu 2017 r. Można uruchomić okno dokowane dla plików wykonywalnych systemu Windows z poziomu powłoki bash . Zamiast instalować klienta dokera, możesz użyć docker.exebezpośrednio do zapytania / interakcji podsystemu dokera. Należy jednak pamiętać, że okno dokowane dla systemu Windows będzie używać zmiennych i konfiguracji systemu Windows.
Jaime

51

Od teraz (kwiecień 2016 r.) Odpowiedź brzmi:

Nie wiemy jeszcze (ale prawdopodobnie nie).

Fakty

  • Windows 10 może teraz uruchamiać różne programy Linux (w tym powłokę Bash i różne narzędzia tekstowe). Nie są to porty (tj. Wersje ponownie skompilowane, jak na przykład w Cygwin ), są to te same pliki binarne ELF, które działają w typowym systemie Linux. W tym przypadku zostały pobrane z Ubuntu.
  • Aby było to możliwe, system Windows 10 został zmodyfikowany tak, aby akceptował wywołania systemowe (wywołania systemowe) systemu Linux oraz aby mógł ładować i uruchamiać pliki binarne ELF ( komentarz Scott Hanselman ). Oznacza to, że można uruchamiać niezmodyfikowane pliki wykonywalne systemu Linux, w razie potrzeby załadują niezmodyfikowane biblioteki współużytkowane, a system Windows uruchomi je jako procesy systemu Windows.
  • Ilekroć taki program Linux chce wchodzić w interakcje z jądrem, wydaje wywołanie systemowe (lub pozwala bibliotece to zrobić). Jest to (przypuszczalnie) jedyna różnica w stosunku do Linuksa: W Linuksie jądro Linuksa obsługuje te wywołania; w systemie Windows 10 jądro systemu Windows 10 robi to zamiast tego.

Spekulacja

Pytanie brzmi więc, czy zaimplementowane syscalls, których potrzebuje Docker (między innymi chroot i przestrzenie nazw), czy nie. Odpowiedź brzmi: prawdopodobnie „nie”. Docker wymaga dość wyrafinowanej (i specyficznej dla Linuksa) funkcjonalności do zarządzania procesami i zasobami oraz izolacji procesów. Chociaż prawdopodobnie można to wszystko replikować w systemie Windows, byłoby to dużo pracy, a ponieważ celem tej funkcji systemu Windows wydaje się być uruchamianie programów przestrzeni użytkownika dla systemu Linux, wydaje się mało prawdopodobne, aby wykonali całą pracę (i trzymali ją w tajemnicy) .

Jednak, o ile mi wiadomo, nie ma jednoznacznych informacji.

Istniejące porty dokujące

Oczywiście, jeśli Microsoft zdecyduje, że chce obsługiwać Docker w Windows 10, prawdopodobnie będzie w stanie to zaoferować. Istnieje pewien precedens dla przenoszenia Dockera na inne jądro:

  • Istnieje port Docker dla FreeBSD . Jest oznaczony jako „eksperymentalny”, ale wydaje się, że działa w zasadzie. Może używać niezmodyfikowanych kontenerów Docker z repozytorium Docker, co oznacza, że ​​faktycznie zapewnia środowisko hosta podobne do systemu Linux dla obrazów.
  • Trwa projekt przeniesienia Dockera na system Windows (w szczególności Windows Server 2016) - zobacz ten wpis na blogu Docker z sierpnia 2015 r. Jednak w przeciwieństwie do powyższego portu FreBSD będzie to port, który pozwoli Dockerowi uruchamiać obrazy systemu Windows w systemie Windows, nie obrazy systemu Linux w systemie Windows. Podziękowania dla Rоry'ego McCune'a za zwrócenie na to uwagi.

1
Aktualizacja: na blogu MSDN znajduje się artykuł na ten temat: Omówienie podsystemu Windows dla systemu Linux .
śleske

Na dzień dzisiejszy jest to możliwe dzięki Hyper-V: tutorials.ubuntu.com/tutorial/...
Nick Sweeting

Zgłosiłem się po prostu dlatego, że wyżej głosowana odpowiedź jest bardziej przydatna niż spekulacje na temat tego, co może być, obejmuje to, co jest.
James

13

Pierwszy podgląd poufnych informacji został wydany wczoraj. Próbowałem zainstalować okno dokowane, ale nie udaje mu się: niepowodzenie dokera

Wygląda więc na to, że dla pierwszego podglądu obecnie nie działa. Jednak, jak spekulowało wiele osób, może to działać w przyszłym wydaniu.


5
Dobry pomysł, aby spróbować tego. Jedno: czy możesz dodać tekst zrzutu ekranu jako rzeczywisty tekst (terminal Ubuntu obsługuje kopiowanie i wklejanie). Tekst „prawdziwy” ma wiele zalet (łatwiejszy do odczytania, obsługuje czytniki ekranu, indeksowane przez wyszukiwarki)
sleske,

Trochę aktualizacji: byłem w stanie całkowicie zainstalować dokera na moim komputerze z uruchomioną ostatnią rocznicową aktualizacją. Ale robienie docker psGet 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?
porażki

Wygląda na to, że teraz działa: tutorials.ubuntu.com/tutorial/…
Nick Sweeting

13

Nie, nie jest to możliwe.

Docker potrzebuje wielu rzeczy, aby uruchomić kontenery:

  • chroot
  • Przestrzenie nazw dla:
    • PID
    • Użytkownicy
    • Sieć
    • Wierzchowce
    • UTS
    • IPC

Są to wszystkie funkcje jądra zaimplementowane w systemie Linux. Niestety większość z nich nie ma podobnej funkcji w systemie Windows, która mogłaby być używana jako zamiennik (ani w podsystemie Linux, który Microsoft zaimplementował w jądrze systemu Windows). Wszystkie te muszą być dostarczone przez system operacyjny.


4
W rzeczywistości system Windows ma przestrzenie nazw dla użytkowników, montowań i IPC. Przestrzenie nazw użytkownika są wymagane dla Active Directory, przestrzenie nazw montowania i przestrzenie nazw IPC są wymagane dla operacji wielu użytkowników. Zasadniczo Menedżer obiektów jądra w systemie Windows zawsze miał przestrzenie nazw od pierwszej wersji systemu Windows NT, więc nie jest to takie dziwne.
MSalters

3
Dzięki usługom pulpitu zdalnego obiekty sesji aktywnie korzystają z tych przestrzeni nazw, aby zapewnić równoczesne działanie. To nie znaczy, że masz całą wymaganą infrastrukturę, ale są tam główne części. Jeśli chodzi o to chroot, pamiętaj, że środowisko Ubuntu ma już inny katalog główny niż WIN32.
MSalters

6
Właściwie myślę, że jest za wcześnie, aby odpowiedzieć na to pytanie w obu przypadkach. Jak opisano w komentarzu Scotta Hanselmana , jądro systemu Windows 10 akceptuje teraz systemowe wywołania systemu Linux. Pytanie brzmi więc, czy zaimplementowane syscalli, których potrzebuje Docker (dla chroot i przestrzeni nazw), czy nie. O ile odpowiedź brzmi „nie”, o ile wiem, nie ma jednoznacznych informacji.
śleske

1
@sleske ma rację, na to pytanie nie można obecnie odpowiedzieć, a powiedzenie „nie, nie można” bez żadnego rzeczywistego wskazania, co robią deweloperzy pracujący nad linuksem w wdowach, jest dość zarozumiały.
Ryan

2
Nie wiem wystarczająco, aby stwierdzić z całą pewnością, że ta odpowiedź jest całkowicie błędna, ale sposób jej sformułowania sprawia, że ​​jestem nieco sceptyczny co do jej ważności. W szczególności stwierdzenie „Bash jest prostym programem kosmicznym użytkownika i nie może dostarczyć żadnego z nich”, a odniesienie do Podsystemu okien dla systemu Linux jako „nowej funkcji Bash” sprawia, że ​​brzmi to tak, jakby ta odpowiedź była oparta na całkowicie fałszywym założeniu, że wszyscy Microsoft zrobili to był port bash na Windows. Tak się nie stało. Opracowali cały interfejs jądra Linux działający na jądrze systemu Windows: msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32

7

Od aktualizacji Creator Update (opublikowanej publicznie 13 czerwca 2017 r.) Możesz uruchamiać natywny plik wykonywalny Windows bezpośrednio w WSL. Oznacza to, że jeśli już zainstalowałeś Docker dla Windows , możesz po prostu wywołać dockerpliki binarne zainstalowane pod C:\Program Files. Ponieważ kończą .exesię najłatwiejszą opcją jest tworzenie aliasów. .bashrcPowinno działać coś takiego :

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

To tworzy aliasy dla wszystkich plików w DOCKER_BINkatalogu:

$ 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

Jedno zastrzeżenie: pojawi się komunikat o błędzie „ Nie można przetłumaczyć bieżącego katalogu roboczego ”, jeśli jest uruchamiany z katalogu Linux. Wystarczy cddo katalogu Windows (np. /mnt/c/Users/YourUsername) I powinieneś być dobry.


Nie wydaje się, aby pobierało zmienne środowiskowe bash do plików YML tworzących okno dokowane. Masz na to jakiś pomysł?
Rüdiger Schulz

1
Ma to sens, ponieważ wywołujesz dockerplik binarny Windows i po prostu robisz to za pomocą powłoki Linux. Nie jestem pewien, czy jest na to dobry sposób.
dimo414,

6

Po Docker 1.12 jest zwolniony, a klient Linux Docker oddziela się, powinieneś być w stanie uruchomić Döcker klienta w systemie Windows 10 bash.

Może to nie wydawać się dużo, biorąc pod uwagę, że masz klienta Docker dla systemu Windows, ale jest to przydatne, jeśli masz łańcuchy narzędzi dla systemu Linux, które zawierają okno dokowane dla jego funkcji po stronie klienta.


4

W Windows 10 wersja 1607 kompilacja 1493.10 możesz z powodzeniem zainstalować go na Ubuntu Bash, ale to nie działa :(

Prosta „wersja dokera” powie ci:

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?

Jeśli następnie uruchomisz „sudo docker -d”, pojawia się następujący błąd:

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

Jest to zdecydowanie korek od strony uderzenia.

Niemniej jednak możesz zainstalować Docker dla Windows i działa to jak urok, możesz oczywiście wdrożyć serwery Linux i wszystko, czego potrzebujesz.

> 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

Według stanu na wrzesień 2016 r.

Wszystkie obecne implementacje Dockera w systemie Windows używają wirtualizacji, Docker 1.12 używa hiperwizora w systemie Windows, co eliminuje przewagę konteneryzacji nad wirtualizacją.

Docker potrzebuje czegoś więcej niż tylko korzystania z wywołań systemu Linux.

Potrzebuje grup kontroli procesu (cgroups), systemu plików, który można ustawiać jeden na drugim (aufs), a także innych systemów opartych na Linuksie poza jądrem.

Ani grupy, ani auf nie są natywnie w jądrze systemu Windows 10.

Istnieje implementacja Windows Server 2016 tutaj: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server .. ale to uruchomi tylko niektóre usługi Windows, np. IIS, a nie Ubuntu


2

Docker obecnie nie działa w bieżącej kompilacji (14316) - przy założeniu, że można go zainstalować.

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

Niesamowite! Proszę próbuj dalej.
Hawkeye,

Wygląda na to, że może to mieć związek z działaniem alokacji pamięci w golang (w którym napisany jest Docker): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/…
Timothy Meade

Mój po prostu zawiesza się na zawsze po wydaniu polecenia.
wieczorek1990

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.