题 你可以在新的Windows 10(Ubuntu)bash用户空间本地运行Docker吗?


我的理解是,在其他操作系统上运行docker的主要限制是使Linux网络容器成为可能。 (当然对于Macs)。

最近 微软宣布 一个测试版 Ubuntu的 Linux的 用户模式 在Windows 10上本机运行。这可以在Windows上运行以ELF格式编译的二进制文件(与需要编译的cygwin不同。)

我的问题是: 你可以在新的Windows 10(Ubuntu)bash用户空间本地运行Docker吗?


121
2018-04-04 10:16




这不是“只是”一个 bash 用户空间。它是一个真实的,相当完整的Linux用户空间,但没有X Windows,即只有文本。说“bash”很好地传达了纯文本限制。 - MSalters
我错过了什么?这实际上是分配的吗?目前我只知道它是蒸发器。 - Michael Hampton♦
我认为直到他们发布此内容还不清楚(AFAIK它甚至还不适用于Windows内部人员)但是值得注意的是,微软和Docker正在努力将Docker本地引入Windows,与Windows服务器一起发布2016 - Rоry McCune
@RöryMcCune:很有意思。但是,根据 这个Docker博客条目 从2015年8月起,这将是一个允许Docker运行的端口 视窗 Windows上的图像,而不是Windows上的Linux图像。 - sleske
确实这就是Windows原生docker的目的。容器化的本质是你不能运行其他内核的系统,没有添加一些虚拟化或(可能)微软正在开发的这个新子系统 - Rоry McCune


答案:


截至目前(2016年4月),答案是:

我们还不知道 (但可能不是)。

事实

  • Windows 10现在可以运行各种Linux程序(其中包括 他们是Bash shell和各种文本实用程序)。这些不是端口 (即重新编译的版本,例如在 Cygwin的), 他们是 相同 ELF二进制文件 在典型的Linux系统上运行。在 这种情况下,它们来自Ubuntu。
  • 为了实现这一点,Windows 10被修改为接受Linux系统调用(系统调用),并能够加载和运行ELF二进制文件(Scott Hanselman的评论)。这意味着可以运行未修改的Linux可执行文件,它们将根据需要加载未修改的共享库,Windows将它们作为Windows进程运行。
  • 每当这样的Linux程序想要与内核交互时,它就会发出一个系统调用(或者让一个库执行它)。这(可能)是在Linux上运行的唯一区别:在Linux上运行时,Linux内核处理这些调用;在Windows 10上,Windows 10内核代替了它。

猜测

所以问题是Docker需要的系统调用(用于chroot和命名空间等)是否已实现。答案是这可能是“不”。 Docker需要相当复杂(和特定于Linux)的功能来进行流程和资源管理以及进程隔离。虽然可能在Windows上复制所有这些,但这将是很多工作,并且由于此Windows功能的目标似乎是运行Linux用户空间程序,因此它们似乎不太可能完成所有工作(并保密) 。

但是,据我所知,没有任何确切的信息。 

现有的Docker端口

当然,如果微软决定在Windows 10中支持Docker,他们可能会提供它。将Docker移植到不同的内核有一些先例:

  • 有一个 FreeBSD的Docker端口。它被标记为“实验性”,但似乎在原则上起作用。它可以使用Docker存储库中未经修改的Docker容器,这意味着它实际上为图像提供了类似Linux的主机环境。
  • 有一个项目正在进行将Docker移植到Windows(特别是Windows Server 2016)的项目 - 请参阅此内容 Docker博客条目 但是,与上面的FreBSD端口不同,这将是一个端口,允许Docker在Windows上运行Windows映像,而不是Windows上的Linux映像。 感谢RöryMcCune指出这一点。

50
2018-04-05 07:15



更新:现在在MSDN博客上有一篇关于该主题的文章: 适用于Linux的Windows子系统概述。 - sleske
截至今天,Hyper-V可以实现: tutorials.ubuntu.com/tutorial/... - Nick Sweeting
我只是因为较高的投票答案比猜测可能是什么更有用,它涵盖的是什么。 - James


你可以使用Docker for Windows作为引擎,使用Docker for linux作为Windows上Ubuntu上Bash的客户端。通过TCP连接它们。

安装Docker for Windows: https://docs.docker.com/docker-for-windows/ 如果您想使用Windows容器而不是Linux容器,则两个类型容器都可以由bash用户空间中的linux docker客户端管理。

从版本17.03.1-ce-win12(12058)开始,您必须检查 在没有TLS的tcp:// localhost:2375上公开守护进程 为了使linux docker客户端继续通过TCP与windows docker守护进程通信

跟着这些步骤:

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

要么

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.22.0/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

我使用Hyper-V使用18.06.0-ce-win59(19098)版本的Docker for Windows测试了它:

~$ 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

看看客户端和服务器都说 OS / Arch:linux / amd64

添加卷时要小心。路径 C:\dir 将被视为 /mnt/c/dir 在WSL和as /c/dir/ 通过docker引擎。你可以永久克服它:

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

在对wsl.conf进行更改后,必须退出并重新加载WSL,以便WSL在启动时读取您的更改。

UPDATE

从: Windows 10版本1803中的命令行有什么新功能

Unix套接字   Windows上不支持Unix套接字,现在它们就是!您还可以在Windows和WSL之间通过Unix套接字进行通信。其中一个很棒的事情是它使WSL能够运行Linux Docker Client与Windows上运行的Docker守护进程进行交互。

问候


99
2017-07-19 22:05



你好@ joel-pearson,docker有两个部分:引擎和客户端。该引擎使用Docker Toolbox(基于VirtualBox)或Docker for Windows(基于Hyper-V)在Windows中运行,这两者均由docker团队正式支持。 Docker引擎尚未在bash用户空间中运行。 Windows中的Docker客户端可以在cmd,powershell或cygwin中运行。这个答案说的是在bash用户空间中运行docker客户端的方法。为什么?我个人更喜欢bash,完成工作。我同意这个问题是关于docker引擎的问题,但我在寻找客户端的过程中发现了它,很多人都这样做。 - Carlos Rafael Ramirez
我只是测试了它,它适用于我1.12 :)超级兴奋,现在能够在Windows上做一些认真的开发。 - Zach Russell
在Windows上的Ubuntu上用Bash试过你的指令,得到“无法连接到Docker守护进程。这个主机上是否运行了docker守护进程?”。你错过了一些步骤吗? - mpen
截至2017年2月,这仍然是唯一的方式。 - hdave
2017年6月之后,您可以 跑过 windows的码头工人 来自bash shell的可执行文件。您可以使用。而不是安装docker客户端 docker.exe 直接查询/交互docker子系统。但请注意,windows的docker将使用windows变量和配置。 - Jaime


第一个内幕预览昨天发布。我试图安装docker但它失败了以下内容: docker fail

所以看起来,对于第一个预览,它目前不起作用。然而,正如许多人推测的那样,它可能会在未来的版本中发挥作用。


12
2018-04-07 10:29



很酷 - 谢谢你的尝试! - Hawkeye
实际尝试这个的好主意。有一件事:请你把截图的文字添加为实际文本(Ubuntu终端支持复制和粘贴)。 “真实”文本有许多优点(更易于阅读,支持屏幕阅读器,可由搜索引擎抓取) - sleske
一些更新:我已经能够在运行最终周年更新的机器上完全安装docker。但做一个 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? - kumar_harsh
看起来现在有效: tutorials.ubuntu.com/tutorial/... - Nick Sweeting


不,这是不可能的。

Docker需要多个东西才能运行容器:

  • chroot环境
  • 命名空间:
    • PID
    • 用户
    • 网络
    • 坐骑
    • UTS
    • IPC

这些都是在Linux中实现的内核功能。不幸的是,它们中的大多数在Windows中没有类似的功能可用作替代品(也不是Microsoft在Windows内核中实现的Linux子系统)。所有这些都需要由操作系统提供。


11
2018-04-04 10:21



实际上,Windows确实有用户,Mounts和IPC的命名空间。 Active Directory需要用户命名空间,多用户操作需要mount命名空间和IPC命名空间。从根本上说,Windows中的内核对象管理器从第一个Windows NT版本开始就一直有名称空间,所以它并不奇怪。 - MSalters
使用远程桌面服务,Session对象主动使用这些命名空间来提供并发操作。这并不意味着您拥有所有必需的基础设施,但主要部分在那里。至于 chroot,意识到Ubuntu环境已经拥有与WIN32不同的根。 - MSalters
实际上,我认为现在回答这个问题还为时过早。如中所述 Scott Hanselman的评论,Windows 10内核现在接受Linux系统调用。所以问题是Docker需要的系统调用(用于chroot和名称空间)是否已实现。虽然答案可能是“不”,但就我所知,没有任何确切的信息。 - sleske
@sleske是对的,这个问题目前还没有回答,如果没有任何真实的迹象表明在寡妇的linux空间中工作的开发人员是什么,那就说“不可能”是非常冒昧的。 - Ryan
我不完全清楚地表明这个答案是完全错误的,但是它的表达方式让我对它的有效性持怀疑态度。特别声明“Bash是一个简单的用户空间程序,不能提供任何这些”,并将Linux的Window子系统称为“新的Bash功能”,这听起来像这个答案是基于所有微软所做的完全错误的假设是端口bash到Windows。那不是发生了什么事。他们开发了一个在Windows内核之上运行的完整Linux内核接口: msdn.microsoft.com/en-us/commandline/wsl/about - Ajedi32


截至 创作者更新 (2017年6月13日公开发布)您可以直接在WSL中运行本机Windows可执行文件。这意味着如果你已经安装了 适用于Windows的Docker 你可以简单地调用 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)你应该好。


6
2018-06-22 06:02



这似乎没有将bash环境变量提取到docker-compose YML文件中。有什么想法吗? - Rüdiger Schulz
这是有道理的,因为你正在调用Windows docker 二进制,只是通过Linux shell这样做。我不确定是否有一个很好的方法来实现这一目标。 - dimo414


一旦Docker 1.12发布并且Linux Docker客户端分离,您应该能够运行docker 客户 在Windows 10 bash中。

鉴于您拥有Docker Windows客户端,这听起来可能不是很多,但如果您拥有包含docker的Linux工具链以实现其客户端功能,那么它会很有用。


5
2018-04-29 09:31





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

所以这绝对是bash方面的阻碍。

不过,你可以安装 适用于Windows的Docker 它就像一个魅力,你可以明显地部署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
2017-08-12 21:38





截至2016年9月,编号

Windows上Docker的所有当前实现都使用虚拟化,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
2017-09-05 13:15





Docker当前不在当前版本(14316)中工作 - 假设您可以安装它。

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

1
2018-04-12 20:47



真棒!请继续尝试。 - Hawkeye
看起来这可能与内存分配在golang(编写Docker)中的工作方式有关: groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/... - Timothy Meade
我只是在命令后永远挂起。 - wieczorek1990


从: 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



现在你可以在bash中运行docker client for linux,这样就可以避免在不使用PowerShell的情况下使用PowerShell。 - Carlos Rafael Ramirez
看看他们是否将其扩展到docker swarm将会很有趣。 - Hawkeye