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

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

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

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

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

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

事实

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

这个猜测

所以问题是Docker需要的系统调用(对于chroot和命名空间等)是否被实现。 答案是这可能是“不”。 Docker需要用于进程和资源pipe理以及进程隔离的相当复杂的(和Linux特有的)function。 尽pipe可能在Windows上复制所有这些内容,但这将是一个很大的工作,而且由于这个Windowsfunction的目标似乎在​​运行Linux用户空间程序,似乎他们不太可能完成所有的工作(并且保密) 。

但是,就我所知,没有任何明确的信息。

现有的Docker端口

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

  • 有一个FreeBSD的Docker端口 。 它被称为“实验”,但似乎在原则上工作。 它可以使用来自Docker存储库的未经修改的Docker容器,这意味着它实际上为图像提供了一个类似Linux的主机环境。
  • 有一个将Docker移植到Windows(特别是Windows Server 2016)的项目正在进行中 – 请参阅2015年8月的Docker博客 。但是,与上面的FreBSD端口不同,这将是Docker在Windows上运行Windows映像的端口,不是Windows上的Linux映像。 感谢Rory McCune指出了这一点。

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

安装用于Windows的Docker: https : //docs.docker.com/docker-for-windows/如果你想使用Windows Containers,而不是Linux Containers,那么types容器可以由bash用户空间中的linux docker客户端来pipe理。

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

按着这些次序:

 cd wget https://download.docker.com/linux/static/stable/x86_64/docker-17.09.0-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 

将相应的variables添加到.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.16.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 

我已经使用Hyper-V的17.06.0-ce-win19(12801)版Docker for Windows进行了testing:

 ~$ docker version Client: Version: 17.09.0-ce API version: 1.32 Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:39:28 2017 OS/Arch: linux/amd64 Server: Version: 17.09.0-ce API version: 1.32 (minimum version 1.12) Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:45:38 2017 OS/Arch: linux/amd64 Experimental: true 

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

添加卷时要小心。 pathC:\dir将在WSL上显示为/mnt/c/dir ,并由docker引擎显示为/c/dir/ 。 你可以永久解决它(见BashOnWindows 问题 )

 sudo mkdir /c sudo mount --bind /mnt/c /c 

问候

第一个内幕预告昨天发布。 我试图安装docker,但它失败,如下所示: 码头工人失败

所以它会出现,第一次预览它目前不工作。 但是,正如很多人所猜测的那样,它可能会在未来的版本中发挥作用。

不,这是不可能的。

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

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

这些都是在Linux中实现的所有内核function。 不幸的是,他们中的大多数在Windows中没有类似的function来代替(在Windows内核中微软实现的Linux子系统中)。 所有这些都需要由操作系统提供。

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

考虑到你有一个Docker Windows客户端,这听起来可能听起来不太像,但是如果你有Linux工具链,包括Docker的客户端function的话,这将会非常有用。

截至创build者更新 (2017年6月13日公开发布),您可以直接在WSL中运行本机Windows可执行文件。 这意味着如果你已经安装了Docker for Windows,你可以简单地调用C:\Program Files下安装的docker二进制C:\Program Files 。 由于它们以.exe结尾,最简单的select是创build别名。 在.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目录中的所有文件创build别名:

 $ 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 ),你应该是好的。

在Windows 10的版本1607年build立1493.10您可以成功安装在Ubuntu Bash,但它不工作:(

一个简单的“docker版本”会告诉你:

 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方面的一个制止者。

不过,你可以安装Docker for Windows ,它的function就像一个魅力,显然你可以部署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 

Docker目前没有在当前版本中工作(14316) – 假设你可以安装它。

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

截至2016年9月,

目前所有Docker上的实现都使用虚拟化,Docker 1.12在Windows中使用虚拟机pipe理程序,从而消除了虚拟化的集装箱优势。

Docker需要的不仅仅是使用Linux系统调用。

它需要进程控制组(cgroups),可堆栈文件系统(aufs)以及内核之外的其他基于Linux的系统。

在Windows 10内核中,cgroup和aufs本身都不是。

这里有一个Windows Server 2016的实现: https: //msdn.microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server ..但是这只会运行一些Windows服务,例如IIS,而不是Ubuntu

来自: 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!)