Можете ли вы запустить Docker изначально в новом пользовательском пространстве Windows 10 (Ubuntu) bash?

126

Насколько я понимаю, основным ограничением запуска docker в других ОС были контейнеры Linux Network, которые делали это возможным. (Конечно, для Mac).

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

Мой вопрос: можете ли вы запускать Docker изначально в новом пользовательском пространстве Windows 10 (Ubuntu) bash?

Hawkeye
источник
4
Это не просто bashпользовательское пространство. Это реальное, достаточно полное пользовательское пространство Linux, но без X Windows, то есть только с текстом. Говоря «bash», достаточно хорошо передает текстовое ограничение ..
MSalters
Я что-то пропустил? Это действительно было распространено? На данный момент я знаю об этом только как о себе.
Майкл Хэмптон
2
Я думаю, что это не будет ясно, пока они не выпустят это (AFAIK это даже не доступно для инсайдеров Windows), однако стоит отметить, что Microsoft и Docker работают над тем, чтобы родным образом
подключить
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, оба контейнера типов могут управляться клиентом Docker Linux в пользовательское пространство bash.

Начиная с версии 17.03.1-ce-win12 (12058) вы должны установить флажок « Демон Expose» на tcp: // localhost: 2375 без TLS, чтобы позволить клиенту Docker Linux продолжить связь с демоном 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

Конечно, вы можете установить 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

Или используя Python Pip

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

И завершение Bash. Лучшая часть:

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 после внесения изменений в wsl.conf, чтобы WSL считывал ваши изменения при запуске.

ОБНОВИТЬ

От: Что нового для командной строки в Windows 10 версии 1803

Сокеты Unix Сокеты Unix не поддерживаются в Windows, и теперь они есть! Вы также можете общаться через сокеты Unix между Windows и WSL. Одним из замечательных преимуществ этого является то, что он позволяет WSL запускать Linux Docker Client для взаимодействия с Docker Daemon, работающим в Windows.

ОБНОВИТЬ

Этот сценарий и использование Unix сокетов были включены в Pengwin pengwin-установке «s.

С уважением

Карлос Рафаэль Рамирес
источник
3
Здравствуйте @ joel-Pearson, докер состоит из двух частей: движка и клиента. Движок запускается в Windows с помощью Docker Toolbox (на основе VirtualBox) или Docker для Windows (на основе Hyper-V), оба официально поддерживаются командой докеров. Механизм Docker еще не работает в пользовательском пространстве bash. Клиент Docker в Windows может быть запущен в cmd, powershell или cygwin. Этот ответ говорит о способе запуска докер-клиента в пользовательском пространстве bash. Почему? Лично я предпочитаю Баш, отделочные работы. Я согласен, что вопрос касается движка докера, но я нашел его, когда искал клиента, и многие люди делают то же самое.
Карлос Рафаэль Рамирес
1
Я только что проверил его, и он работает для меня 1.12 :) Очень рад, что теперь я могу серьезно заняться Windows.
Зак Рассел
2
Попробовал ваши инструкции в Bash на Ubuntu для Windows, получил сообщение «Не удается подключиться к демону Docker. Демон docker работает на этом хосте?». Вы пропустили несколько шагов?
mpen
5
По состоянию на февраль 2017 года это все еще единственный путь.
hdave
3
После июня 2017 года вы можете запустить Docker для исполняемых файлов Windows из оболочки Bash . Вместо установки Docker-клиента вы можете использовать docker.exeнепосредственно для запроса / взаимодействия с подсистемой Docker. Однако обратите внимание, что докер для Windows будет использовать переменные и конфигурации Windows.
Хайме
51

На данный момент (апрель 2016 г.) ответ таков:

Мы еще не знаем (но, вероятно, нет).

Факты

  • Windows 10 теперь может запускать различные программы для Linux (среди них оболочка Bash и различные текстовые утилиты). Это не порты (т.е. перекомпилированные версии, как, например, в Cygwin ), это те же двоичные файлы ELF, которые работают в типичной системе Linux. В этом случае они были взяты из Ubuntu.
  • Чтобы сделать это возможным, Windows 10 была модифицирована, чтобы принимать системные вызовы Linux (системные вызовы) и иметь возможность загружать и запускать двоичные файлы ELF ( комментарий Скотта Хансельмана ). Это означает, что можно запускать немодифицированные исполняемые файлы Linux, они будут загружать свои неизмененные общие библиотеки по мере необходимости, а Windows будет запускать их как процессы Windows.
  • Всякий раз, когда такая программа Linux хочет взаимодействовать с ядром, она выполняет системный вызов (или позволяет библиотеке сделать это). Это (предположительно) единственное отличие от работы в Linux: при работе в Linux ядро ​​Linux обрабатывает эти вызовы; в Windows 10 ядро ​​Windows 10 делает это вместо этого.

Спекуляция

Таким образом, вопрос заключается в том, были ли реализованы системные вызовы, которые нужны Docker (среди прочего, для chroot и пространств имен). Ответ на это, скорее всего, "нет". Docker требует довольно сложной (и специфичной для Linux) функциональности для управления процессами и ресурсами, а также для изоляции процессов. Хотя, вероятно, возможно воспроизвести все это в Windows, это будет много работы, и, поскольку цель этой функции Windows, похоже, заключается в запуске программ пользовательского пространства Linux, кажется маловероятным, что они сделали всю работу (и держали ее в секрете) ,

Однако, насколько я могу судить, точной информации в любом случае нет.

Существующие порты Docker

Конечно, если Microsoft решит, что им нужна поддержка Docker в Windows 10, они, вероятно, смогут ее предложить. Есть некоторый прецедент для портирования Docker на другое ядро:

  • Есть порт Docker для FreeBSD . Он помечен как «экспериментальный», но в принципе работает. Он может использовать немодифицированные контейнеры Docker из репозитория Docker, то есть фактически обеспечивает Linux-подобную среду хоста для образов.
  • Существует проект для переноса Docker на Windows (в частности, Windows Server 2016) - см. Эту запись в блоге Docker с августа 2015 года. Однако, в отличие от порта FreBSD, описанного выше, это будет порт, который позволяет Docker запускать образы Windows в Windows, не образы Linux на Windows. Спасибо Рори МакКьюну за указание на это.
sleske
источник
1
Обновление: в блоге MSDN появилась статья на эту тему: Обзор подсистемы Windows для Linux .
Слеск
На сегодняшний день это возможно с Hyper-V: tutorials.ubuntu.com/tutorial/…
Ник Свитинг
Я проголосовал просто потому, что ответ с более высоким голосом более полезен, чем предположение, что может быть, он охватывает то, что есть.
Джеймс
13

Первый предварительный просмотр был опубликован вчера. Я попытался установить Docker, но это не удается из-за следующего: отказ докера

Таким образом, кажется, что для первого предварительного просмотра в настоящее время он не работает. Однако, как полагают многие, это может сработать в будущем выпуске.

CodedBeard
источник
5
Хорошая идея на самом деле попробовать это. Одна вещь: не могли бы вы добавить текст скриншота как фактический текст (терминал Ubuntu поддерживает копирование и вставку). «Настоящий» текст обладает многочисленными преимуществами (его легче читать, он поддерживает программы чтения с экрана, может сканироваться поисковыми системами)
sleske
Некоторое обновление: я смог полностью установить докер на мой компьютер, на котором выполнялось последнее годовщину обновления. Но 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?
потерпеть
Похоже, это работает сейчас: tutorials.ubuntu.com/tutorial/…
Ник Свитинг
13

Нет, это невозможно.

Docker нужно несколько вещей для запуска контейнеров:

  • корневой
  • Пространства имен для:
    • PID
    • пользователей
    • сеть
    • кронштейны
    • ОТС
    • IPC

Это все функции ядра, которые реализованы в Linux. К сожалению, большинство из них не имеют аналогичной функции в Windows для использования в качестве замены (ни в подсистеме Linux, которую Microsoft реализовала в ядре Windows). Все это должно быть предоставлено ОС.

Florin Asăvoaie
источник
4
На самом деле, в Windows есть пространства имен для пользователей, Mounts и IPC. Пользовательские пространства имен требуются для Active Directory, пространства имен монтирования и пространства имен IPC требуются для многопользовательской работы. По сути, в диспетчере объектов ядра в Windows всегда были пространства имен, начиная с самого первого выпуска Windows NT, так что это не так уж странно.
MSalters
3
А с помощью Служб удаленных рабочих столов объекты Session активно используют эти пространства имен для обеспечения одновременной работы. Это не значит, что у вас есть вся необходимая инфраструктура, но есть основные части. Что касается того chroot, поймите, что среда Ubuntu уже имеет другой корень, чем WIN32.
MSalters
6
На самом деле, я думаю, что слишком рано, чтобы ответить на это в любом случае. Как описано в комментарии Скотта Хансельмана , ядро ​​Windows 10 теперь принимает системные вызовы Linux. Таким образом, вопрос в том, были ли реализованы системные вызовы, которые нужны Docker (для chroot и пространств имен) или нет. Хотя ответ скорее всего «нет», насколько я могу судить, точной информации в любом случае нет.
Слеське
1
@sleske прав, этот вопрос не отвечает на данный момент, и сказать «нет, это не может» без каких-либо реальных указаний на то, что разработчики работают над пространством linux в вдовах, довольно самонадеянно.
Райан
2
Я не знаю достаточно, чтобы с уверенностью утверждать, что этот ответ совершенно неверен, но то, как он сформулирован, заставляет меня скептически относиться к его обоснованности. В частности, заявив, что «Bash - простая программа пользовательского пространства, и она не может предоставить ни одну из них», и ссылаясь на Подсистему Windows для Linux, как «новая функция Bash», звучит так, будто этот ответ основан на абсолютно ложном предположении, что все Microsoft делала был порт bash для 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), и вы должны быть хорошими.

dimo414
источник
Похоже, что эти переменные окружения bash не попадают в файлы YML docker-compose. Есть идеи для этого?
Рюдигер Шульц,
1
Это имеет смысл, поскольку вы вызываете dockerдвоичный файл Windows и просто делаете это через оболочку Linux. Я не уверен, есть ли хороший способ сделать это.
dimo414
6

Как только Docker 1.12 выпущен и клиент Docker Linux отделен, вы сможете запустить Docker клиент в Windows 10 bash.

Это может показаться не таким уж большим, если у вас есть клиент Docker для Windows, но это полезно, если у вас есть наборы инструментов Linux, которые включают в себя Docker для его функциональности на стороне клиента.

mixja
источник
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 Servers и все, что вам нужно.

> 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, что устраняет преимущество контейнеризации над виртуализацией.

Docker нужно больше, чем просто использовать системные вызовы Linux.

Ему нужны группы управления процессами (cgroups), наращиваемая файловая система (aufs), а также другие системы на основе Linux вне ядра.

Ни cgroups, ни aufs изначально не включены в ядро ​​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
lgj
источник
Потрясающие! Пожалуйста, продолжайте пытаться.
Ястребиный глаз
Похоже, это может быть связано с тем, как происходит распределение памяти в golang (на котором написан Docker): 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!)
gavenkoa
источник
2
Это дополняется тем фактом, что теперь вы можете запускать докер-клиент для linux в bash, поэтому избегайте использования PowerShell, если вы его не используете
Карлос Рафаэль Рамирес
1
Будет интересно посмотреть, масштабируют ли они это до роя докеров.
Ястребиный глаз