Чи можете ви запустити Docker на новому просторі користувачів Windows 10 (Ubuntu)?


126

Я розумів, що основним обмеженням роботи докера на інших ОС є контейнери Linux Network, що зробило це можливим. (Безумовно для Маків).

Нещодавно Microsoft оголосила бета-версію користувальницького режиму Ubuntu linux, що працює в Windows 10. Це може запускати бінарні файли, складені у форматі ELF для Windows (на відміну від cygwin, який вимагає компіляції.)

Моє запитання: Чи можете ви запускати Docker на новому просторі користувачів Windows 10 (Ubuntu)?


4
Це не просто " bashпростору " користувача. Це справжній, досить повний простір користувачів Linux, але без X Windows, тобто лише тексту. Говорячи "bash", досить добре
передається

Я щось пропустив? Це насправді було розповсюджено? На даний момент я знаю про це лише як випаровування.
Майкл Хемптон

2
Я думаю, що це буде зрозуміло, поки вони не випустять це (AFAIK він ще не доступний для інсайдерів Windows), однак варто відзначити, що Microsoft і Docker працюють над тим, щоб Docker вивести в Windows спочатку, щоб випустити разом з Windows Server 2016
Rоry McCune

1
@ RоryMcCune: Цікаво. Однак, в відповідно до цього запису в блозі Докер з серпня 2015 року, це буде порт , який дозволяє Docker запускати Windows , зображення на Windows, а не образ Linux на Windows.
sleske

2
Дійсно, це мета рідного докера Windows. Характер контейнерізації полягає в тому, що ви не можете запускати системи з іншими ядрами, не додаючи в якусь віртуалізацію або (можливо) цю нову підсистему, яку розробляє Microsoft
Рорі МакКуне

Відповіді:


103

Ви можете використовувати Docker Desktop для Windows як двигун, а Docker для Linux як клієнт у WSL на Ubuntu / Debian у Windows. Підключіть їх через TCP.

Встановлення Docker Desktop для Windows: https://hub.docker.com/editions/community/docker-ce-desktop-windows Якщо ви хочете використовувати контейнери Windows замість контейнерів Linux, обома контейнерами можна керувати клієнтом докерів Linux у простору користувачів bash.

Починаючи з версії 17.03.1-ce-win12 (12058), ви повинні перевірити Expose daemon на tcp: // localhost: 2375 без TLS, щоб клієнт Linux Docker міг продовжувати спілкуватися з демоном Windows Docker TCP

Виконайте такі дії:

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

або

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

Щоб зробити його постійним:

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

Додайте відповідні змінні до .bashrc

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

Звичайно, ви можете встановити докер-композит

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

Або за допомогою пітона піп

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

І завершення Баша. Найкраща частина:

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

Я перевірив його, використовуючи версію Docker Desktop 2.1.0.1 (37199) за допомогою 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**

Обсяги

Будьте обережні, додаючи обсяги. Шлях C:\dirбуде видно як /mnt/c/dirна WSL, так і за /c/dir/допомогою докерного двигуна. Ви можете його подолати назавжди:

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

Після внесення змін у wsl.conf ви повинні вийти та перезавантажити WSL, щоб WSL читав ваші зміни при запуску.

ОНОВЛЕННЯ

від: Що нового для командного рядка у Windows 10 версії 1803

Unix Sockets Unix Sockets не підтримувались у Windows, і тепер вони є! Ви також можете спілкуватися через Unix-сокети між Windows та WSL. Однією з чудових речей у цьому є те, що він дозволяє WSL запускати клієнт Linux Docker для взаємодії з Docker Daemon, що працює на Windows.

ОНОВЛЕННЯ

Цей сценарій та використання Unix Sockets були включені в налаштування pengwin 's pengwin.

З повагою


3
Привіт @ joel-pearson, докер має дві частини: двигун та клієнт. Двигун працює у Windows за допомогою Docker Toolbox (на базі VirtualBox) або Docker для Windows (на базі Hyper-V), офіційно підтримується командою docker. Докер-движок ще не працює в просторі користувача bash. Клієнт Docker у Windows може працювати в cmd, powerhell або cygwin. Ця відповідь говорить про те, як запустити докер-клієнт у просторі користувачів bash. Чому? Особисто я віддаю перевагу баш, завершення працює. Я погоджуюся, що питання стосується докерного двигуна, але я знайшов його, коли шукав клієнта, і багато людей роблять те саме.
Карлос Рафаель Рамірес

1
Я просто перевірив це, і він працює на мене 1.12 :) Супер схвильований, що тепер зможу зробити серйозну розробку на Windows.
Зак Рассел

2
Спробувавши ваші інструкції в Bash на Ubuntu в Windows, отримано "Неможливо підключитися до демона Docker. Чи працює цей демон на цьому хості?". Ви пропускаєте кілька кроків?
mpen

5
Станом на лютий 2017 року це все ще єдиний спосіб.
hdave

3
Після червня 2017 року ви можете запустити докер для виконавчих файлів Windows з оболонки bash . Замість встановлення докерного клієнта ви можете використовувати docker.exeбезпосередньо для запиту / взаємодії з підсистемою docker. Однак зауважте, що докер для Windows використовуватиме змінні та конфігурації Windows.
Хайме

51

На сьогодні (квітень 2016 року) відповідь така:

Ми ще не знаємо (але, мабуть, ні).

Факти

  • Тепер Windows 10 може запускати різні програми Linux (серед них оболонка Bash та різні текстові утиліти). Це не порти (тобто перекомпільовані версії, як, наприклад, у Cygwin ), це ті самі бінарні файли ELF, які працюють у типовій системі Linux. У цьому випадку їх взяли з Ubuntu.
  • Щоб зробити це можливим, Windows 10 було змінено на прийняття системних викликів (syscalls) Linux та можливість завантаження та запуску бінарних файлів ELF ( коментар Скотта Хензельмана ). Це означає, що немодифіковані виконувані файли Linux можуть бути запущені, вони завантажуватимуть незмінені спільні бібліотеки у міру необхідності, а Windows запускатиме їх як процеси Windows.
  • Щоразу, коли така програма Linux хоче взаємодіяти з ядром, вона видає системний виклик (або дозволяє бібліотеці робити це). Це (імовірно) єдина відмінність від запуску в Linux: під час роботи в Linux ядро ​​Linux обробляє тези викликів; в Windows 10 ядро ​​Windows 10 робить це замість цього.

Спекуляція

Отже, питання полягає в тому, реалізовані чи ні системні виклики, необхідні Докеру (для chroot та просторів імен, серед іншого). Відповідь на це, ймовірно, "ні". Докер вимагає досить складних (і специфічних для Linux) функціональних можливостей для управління процесами та ресурсами, а також для ізоляції процесів. Незважаючи на те, що можливо повторити все це в Windows, було б дуже багато роботи, і оскільки метою цієї функції Windows, здається, є запуск програм для користувацького простору Linux, мабуть, навряд чи вони виконали всю роботу (і зберегли це в секреті) .

Однак остаточної інформації немає, наскільки я можу сказати.

Існуючі порти Докера

Звичайно, якщо Microsoft вирішить, що хочуть підтримати Docker в Windows 10, вони, ймовірно, зможуть її запропонувати. Існує деякий прецедент для перенесення Docker на інше ядро:

  • Існує порт Docker для FreeBSD . Він позначений як "експериментальний", але, здається, працює в принципі. Він може використовувати немодифіковані контейнери Docker із сховища Docker, тобто він фактично забезпечує хост-середовище для зображень, схоже на Linux.
  • Розробляється проект по перенесенню Docker в Windows (зокрема, Windows Server 2016) - дивіться цю запис у блозі Docker з серпня 2015 року. Однак, на відміну від порту FreBSD, вище, це буде порт, який дозволяє Docker запускати зображення Windows у Windows, не образи Linux у Windows. Дякую Рорі МакКуне за те, що вказав на це.

1
Оновлення. Зараз у блозі MSDN є стаття на цю тему: Підсистема Windows для огляду Linux .
sleske

На сьогодні це можливо з Hyper-V: tutorials.ubuntu.com/tutorial/…
Nick Sweeting

Я заперечував просто тому, що вища відповідь, яка проголосує, корисніша, ніж міркування про те, що може бути, воно охоплює те, що є.
Джеймс

13

Перший інсайдерський попередній перегляд був опублікований вчора. Я намагався встановити докер, але він не вдається з наступним: провал докера

Отже, здавалося б, що для першого попереднього перегляду він наразі не працює. Однак, як багато людей припускають, це може працювати в майбутньому випуску.


5
Гарна ідея насправді спробувати це. Одне: Ви можете, будь ласка, додати текст скріншота як фактичний текст (термінал Ubuntu підтримує копіювати та вставляти). Текст "Справжній" має численні переваги (легше читати, підтримує зчитувачі екрану,
скануйте

Деякі оновлення: мені вдалося повністю встановити докер на мою машину, де працює остаточне оновлення ювілею. Але зробити це docker psне вдається: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?
кумархарш

Схоже, це працює зараз: tutorials.ubuntu.com/tutorial/…
Nick Sweeting

13

Ні, це неможливо.

Для запуску контейнерів Docker потребує декількох речей:

  • chroot
  • Простори імен для:
    • ПІД
    • Користувачі
    • Мережа
    • Гори
    • УТС
    • IPC

Це всі функції ядра, які реалізовані в Linux. На жаль, більшість з них не мають подібної функції в Windows, яку можна використовувати в якості заміни (ні в підсистемі Linux, яку Microsoft реалізував у ядрі Windows). Все це потрібно забезпечити ОС.


4
Насправді, у Windows є простори імен для користувачів, версій та IPC. Простіри імен користувачів необхідні для Active Directory, простори імен монтування та простори імен IPC потрібні для багатокористувацької роботи. По суті, менеджер об'єктів ядра в Windows завжди мав простори імен, починаючи з першого випуску Windows NT, тому це не так дивно.
MSalters

3
А за допомогою віддалених служб робочого столу об’єкти сесії активно використовують ці простори імен для забезпечення одночасної роботи. Це не означає, що у вас є вся необхідна інфраструктура, але основні частини є там. Що стосується chroot, розумійте, що середовище Ubuntu вже має інший корінь, ніж WIN32.
MSalters

6
Власне, я думаю, що зарано відповісти на це так чи інакше. Як описано в коментарі Скотта Хензельмана , ядро ​​Windows 10 тепер приймає системні виклики Linux. Отже, питання полягає в тому, реалізовані чи ні системні виклики, необхідні Докеру (для chroot та просторів імен). Хоча відповідь, ймовірно, "ні", наскільки я не можу сказати, немає і остаточної інформації.
sleske

1
@sleske правий, на даний момент це питання не відповідає, і сказати "ні, це не можна" без жодних реальних вказівок на те, що розробники, що працюють на linux-просторі у вдовах, досить нахабні.
Райан

2
Я не знаю достатньо, щоб з упевненістю стверджувати, що ця відповідь є абсолютно неправильною, але спосіб її висловлення змушує мене трохи скептично ставитися до її обґрунтованості. Зокрема, заявляючи, що "Bash - це проста програма для користувальницького простору, і вона не може надати жодного з них", і посилаючись на підсистему Window для Linux як "нову функцію Bash", це звучить так, що ця відповідь ґрунтується на абсолютно помилковому припущенні, що всі Microsoft зробили був портовим ударом для Windows. Так не сталося. Вони розробили цілий інтерфейс ядра Linux, який працює над ядром Windows: msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32

7

Станом на оновлення Creator (опубліковано 13 червня 2017 року), ви можете запускати нативні файли Windows у прямому форматі WSL. Це означає, що якщо ви вже встановили Docker для Windows, ви можете просто викликати dockerбінарні файли, встановлені під C:\Program Files. Оскільки вони закінчуються .exeнайпростішим варіантом - створити псевдоніми. Щось таке у вашому .bashrcмає працювати:

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

Це створює псевдоніми для всіх файлів у 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

Одне застереження: ви отримаєте повідомлення про помилку типу " Неможливо перекласти поточний робочий каталог ", якщо запустити з каталогу Linux. Просто cdв каталог Windows (наприклад /mnt/c/Users/YourUsername), і ви повинні бути хорошими.


Здається, це не підбирає змінні середовища bash у файли YML, складені докер. Будь-яка ідея для цього?
Rüdiger Schulz

1
Це має сенс, оскільки ви посилаєтесь на dockerдвійковий файл Windows , і просто робите це через оболонку Linux. Я не впевнений, чи є хороший спосіб досягти цього.
dimo414

6

Після того, як Docker 1.12 буде випущений і клієнт Linux Docker відокремлений, ви зможете запустити докер- клієнт у Windows 10 bash.

Це може виглядати не так багато, якщо у вас є клієнт Docker Windows, але це корисно, якщо у вас є ланцюги інструментів Linux, які включають докер для його функціонування на стороні клієнта.


4

У Windows 10 Версія 1607 Build 1493.10 ви можете успішно встановити його на Ubuntu Bash, але він не працює :(

Проста "версія докера" скаже вам:

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?

Якщо ви запустите "sudo docker -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+.

Так що це, безумовно, пробка з боку башти.

Тим не менш, ви можете встановити Docker для Windows, і він працює як шарм, ви, очевидно, можете розгорнути Linux-сервери та все необхідне.

> 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

Станом на вересень 2016 року №

У всіх поточних реалізаціях Docker для Windows використовується віртуалізація, Docker 1.12 використовує гіпервізор у Windows - це усуває перевагу контейнізації над віртуалізацією.

Докер потребує більше, ніж просто використання системних дзвінків Linux.

Для цього потрібні групи управління процесами (cgroups), файлову систему (aufs), що може складатись, а також інші системи на базі Linux за межами ядра.

Ні групи, ні ауфи не є ядром Windows 10.

Тут є реалізація Windows Server 2016: https://msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server .. але це запустить лише деякі служби Windows, наприклад IIS, а не Ubuntu


2

На даний момент Docker не працює в поточній збірці (14316) - припускаючи, що ви можете встановити його.

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

Дивовижно! Будь ласка, продовжуйте намагатися.
Хокі

Схоже, це може бути пов’язано з тим, як працює розподіл пам’яті в голангу (про який написано Докер): groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/…
Тимофі Мід

Моя просто зависає назавжди після команди.
wieczorek1990,

1

Від: 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
Це доповнюється тим, що тепер ви можете запустити докер-клієнт для linux в bash, тому уникайте використання PowerShell, якщо ви цього не використовуєте
Carlos Rafael Ramirez

1
Буде цікаво подивитися, чи розширюють вони це до роя докера.
Хокі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.