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


126

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

最近,Microsoft宣布了一个本机运行在Windows 10上的Ubuntu linux 用户模式的beta版。它可以在Windows上运行以ELF格式编译的二进制文件(不同于cygwin需要编译)。

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


4
这不是“仅仅”一个bash用户空间。这是一个真实,相当完整的Linux用户空间,但是没有X Windows,即仅文本。说“庆典”通信的纯文本的限制相当好..
MSalters

我错过了什么?这实际上分发了吗?此刻,我只知道它是蒸气器。
迈克尔·汉普顿

2
我认为,直到他们发布这个(据我所知它甚至可用于Windows内部人士还)就不是很清楚但值得注意的是微软和码头工人是在把码头工人到Windows本身,被释放旁边的Windows服务器2016的工作
Rоry McCune 2016年

1
@RоryMcCune:有趣。但是,根据2015年8月的Docker博客文章,这将是允许Docker在Windows上运行Windows映像而不是Windows上的Linux映像的端口。
sleske '16

2
确实,这就是Windows本机docker的目的。集装箱化的本质是,你不能运行其他内核的系统,而无需在一些虚拟化添加或(可能),微软正在开发这种新的子系统
Rоry麦克卡尼

Answers:


103

在Windows的Ubuntu / Debian的WSL中​​,您可以将Windows的Docker Desktop用作引擎,将Linux的Docker用作客户端。通过TCP连接它们。

安装适用于Windows的Docker桌面:https : //hub.docker.com/editions/community/docker-ce-desktop-windows 如果要使用Windows容器而不是Linux容器,则这两种类型的容器都可以由Linux docker客户端在bash用户空间。

从版本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/`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

我已经使用Hyper-V使用Docker桌面的2.1.0.1(37199)版本对其进行了测试:

$ 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/docker引擎上可见。您可以永久克服它:

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

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

更新

来自:Windows 10版本1803中命令行的新增功能

Unix套接字 Windows上不支持Unix套接字,现在支持了!您还可以在Windows和WSL之间通过Unix套接字进行通信。这方面的一大优点是,它使WSL能够运行Linux Docker Client与Windows上运行的Docker Daemon进行交互。

更新

该脚本和Unix套接字的使用已包含在Pengwin的pengwin设置中。

问候


3
您好@ joel-pearson,码头工人有两个部分:引擎和客户端。该引擎在Windows上使用Docker Toolbox(基于VirtualBox)或Docker for Windows(基于Hyper-V)在Windows中运行,二者均得到Docker团队的正式支持。Docker引擎尚未在bash用户空间中运行。Windows中的Docker客户端可以在cmd,powershell或cygwin中运行。这个答案是在bash用户空间中运行docker客户端的方式。为什么?就我个人而言,我更喜欢bash,它可以完成工作。我同意这个问题是关于docker引擎的,但是我在寻找客户端时就发现了,很多人都这样做。
卡洛斯·拉斐尔·拉米雷斯

1
我刚刚对其进行了测试,它对我来说适用于1.12 :)能够在Windows上进行一些认真的开发感到非常兴奋。
扎克·罗素

2
在Windows上的Ubuntu上的Bash中尝试了您的说明,得到了“无法连接到Docker守护程序。Docker守护程序在此主机上运行吗?”。您是否缺少一些步骤?
mpen

5
截至2017年2月,这仍然是唯一的方法。
hdave

3
2017年6月之后,您可以从bash shell 运行docker以获取Windows可执行文件。无需安装docker客户端,您可以docker.exe直接使用来查询/交互docker子系统。但是,请注意,用于Windows的docker将使用Windows变量和配置。
Jaime

51

截至目前(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内核会处理这些调用;而在Linux上运行时,Linux内核会处理这些调用。在Windows 10上,由Windows 10内核代替。

炒作

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

但是,据我所知,这两种方式都没有确切的信息。

现有的Docker端口

当然,如果Microsoft决定希望Windows 10支持Docker,则他们可能会提供。将Docker移植到其他内核有一些先例:

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

1
更新:MSDN博客上现在有关于该主题的文章:Linux的Windows子系统概述
sleske '16

截至今天它可能带有Hyper-V:tutorials.ubuntu.com/tutorial/...
尼克斯威汀

我之所以投票,是因为投票率较高的答案比猜测可能的范围更有用,因为它涵盖了范围。
詹姆斯

13

昨天发布了第一份内部预览。我尝试安装docker,但失败,并显示以下内容: 码头工人失败

如此看来,第一次预览当前不起作用。但是,正如许多人推测的那样,它可能会在将来的版本中使用。


5
实际尝试一下的好主意。一件事:您能否将屏幕截图的文本添加为​​实际文本(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?
kumarharsh


13

不,这是不可能的。

Docker需要执行多项操作才能运行容器:

  • chroot
  • 命名空间:
    • PID
    • 用户数
    • 网络
    • 坐骑
    • 悉尼科技大学
    • IPC

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


4
实际上,Windows确实具有用于用户,挂载和IPC的名称空间。Active Directory需要用户名称空间,多用户操作需要安装名称空间和IPC名称空间。从根本上讲,从Windows NT的第一个发行版开始,Windows中的内核对象管理器就一直具有名称空间,因此并不奇怪。
MSalters '16

3
借助远程桌面服务,Session对象可以主动使用这些名称空间来提供并发操作。这并不意味着您拥有所有必需的基础架构,但是主要部分都在那里。至于chroot,请意识到Ubuntu环境已经具有与WIN32不同的根目录。
MSalters '16

6
实际上,我认为现在回答这两种方式为时尚早。如Scott Hanselman的评论中所述,Windows 10内核现在接受Linux系统调用。因此,问题在于,是否实现了Docker需要的系统调用(用于chroot和名称空间)。尽管答案可能是“否”,但据我所知,两种方法都没有确切的信息。
sleske '16

1
@sleske是正确的,此问题目前尚无法回答,并且在没有任何真实迹象表明在寡妇中从事Linux空间的开发人员正在做什么的情况下说“不行”是非常自负的。
Ryan

2
我还不足以自信地说这个答案是完全错误的,但是它的措辞方式使我对其有效性有些怀疑。特别要指出“ Bash是一个简单的用户空间程序,不能提供其中的任何一个”,并将Linux的Window Subsystem称为“新的Bash功能”,听起来这个答案是基于完全错误的假设,即所有Microsoft都这样做。将bash移植到Windows。没什么事 他们开发了在Windows内核之上运行的整个Linux内核接口:msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32 '16

7

创建者更新(2017年6月13日公开发布)开始,您可以直接在WSL中运行本机Windows可执行文件。这意味着,如果您已经安装了Docker for 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环境变量纳入docker-compose YML文件中。有什么想法吗?
鲁迪格·舒尔茨

1
这是有道理的,因为您要调用Windows docker二进制文件,而只是通过Linux Shell进行操作。我不确定是否有一个很好的方法来实现这一目标。
dimo414

6

一旦多克1.12释放,Linux的客户端泊坞窗分离,你应该能够运行泊坞窗客户端在Windows 10的bash。

鉴于您拥有Docker Windows客户端,这听起来可能并不多,但是如果您拥有包含Docker客户端功能的Linux工具链,这将非常有用。


4

在Windows 10版本1607内部版本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方面来讲,这绝对是一个障碍。

不过,您可以安装适用于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

截至2016年9月,

Windows上所有当前的Docker实施都使用虚拟化,Docker 1.12在Windows中使用虚拟机监控程序-因此消除了容器化优于虚拟化的优势。

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

它需要过程控制组(cgroup),可堆叠的文件系统(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


2

Docker当前无法在当前版本中运行(14316)-假设您可以安装它。

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

太棒了!请继续尝试。
Hawkeye

看来这可能与内存分配在golang中的工作方式有关(使用Docker编写):groups.google.com/forum
Timothy Meade

该命令发出后,矿井将永远吊死。
wieczorek1990 '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.