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

最近,Microsoft宣布了一个本机运行在Windows 10上的Ubuntu Linux用户模式的Beta。该模式可以在Windows上运行以ELF格式编译的二进制文件(与需要编译的cygwin不同)。 />我的问题是:您可以在新的Windows 10(Ubuntu)bash用户空间上本地运行Docker吗?

评论

这不是“仅仅” bash用户空间。这是一个真实,相当完整的Linux用户空间,但没有X Windows,即仅文本。说“ bash”可以很好地传达纯文本限制。.

我错过了什么?这实际上分发了吗?目前,我只知道它是汽具。

我认为,直到他们发布此版本(AFAIK,它甚至还不适用于Windows内部人员)之前,还不清楚,但是值得注意的是,微软和Docker正在努力将Docker本地引入Windows,与Windows Server 2016一起发布。

@RоryMcCune:有趣。但是,根据此Docker博客从2015年8月开始的条目,这将是允许Docker在Windows上运行Windows映像而不是Windows上的Linux映像的端口。
确实,这就是Windows本机docker的目的。容器化的本质是,您不能在没有添加其他虚拟化或(可能)没有添加Microsoft正在开发的新子系统的情况下运行带有其他内核的系统

#1 楼

在Windows的Ubuntu / Debian的WSL中​​,您可以将Windows的Docker桌面用作引擎,将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上检查Expose守护程序: / localhost:2375(不带TLS)以允许Linux Docker客户端继续通过TCP与Windows Docker守护程序进行通信

请遵循以下步骤: > or

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


将相应变量添加到.bashrc />
mkdir ~/bin
mv ~/docker/docker ~/bin


当然,您可以安装docker-compose

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


或使用python pip

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


Bash完成。最好的部分:

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


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

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


音量

添加音量时请多加注意。路径C:\dir在WSL上将显示为/mnt/c/dir,在docker engine中将显示为/c/dir/。您可以永久克服它:

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


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

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


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


更新

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

注意事项

评论


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

–卡洛斯·拉斐尔·拉米雷斯(Carlos Rafael Ramirez)
16年8月17日在13:27

我刚刚对其进行了测试,它在1.12上对我有效:)非常高兴现在能够在Windows上进行一些认真的开发。

–扎克·罗素(Zach Russell)
16-9-28在22:17

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

– mpen
16-10-9在20:17

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

–hdave
17年2月17日在19:35

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

– Jaime
17年9月16日在18:09

#2 楼

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

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

事实


Windows 10现在可以运行各种Linux程序(其中包括Bash shell和各种文本实用程序)。这些不是端口
(即重新编译的版本,例如在Cygwin中),它们是
与在典型Linux系统上运行的相同的ELF二进制文件。在这种情况下,它们取自Ubuntu。
为了实现这一点,对Windows 10进行了修改,使其可以接受Linux系统调用(syscalls),并能够加载和运行ELF二进制文件(Scott评论)。 Hanselman)。这意味着可以运行未修改的Linux可执行文件,它们将按需加载未修改的共享库,而Windows将作为Windows进程运行它们。或让图书馆来做)。 (大概)这是与在Linux上运行的唯一区别:在Linux上运行时,Linux内核处理这些调用。在Windows 10上,则由Windows 10内核代替。是否实施。答案是可能是“否”。 Docker需要相当复杂(特定于Linux)的功能来进行流程和资源管理以及流程隔离。尽管可以在Windows上复制所有这些内容,但是这将需要大量工作,并且由于此Windows功能的目标似乎是运行Linux用户空间程序,因此它们似乎不可能完成所有工作(并将其保密) 。

但是,据我所知,任何一种方式都没有确切的信息。

现有的Docker端口

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


FreeBSD有一个Docker端口。它被标记为“实验性”,但似乎在原理上起作用。它可以使用Docker存储库中未修改的Docker容器,这意味着它实际上为图像提供了类似Linux的主机环境。 2015年8月的博客条目。但是,与上述FreBSD端口不同,该端口将允许Docker在Windows上运行Windows映像,而不是Windows上的Linux映像。感谢RоryMcCune指出这一点。



评论


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

–sleske
16年4月28日在8:43

到今天为止,Hyper-V可以使用:tutorials.ubuntu.com/tutorial/…

–尼克·斯威汀(Nick Sweeting)
17-10-26在3:57



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

–詹姆斯
18年1月26日在19:32



#3 楼

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

因此,它似乎出现了,对于第一个预览版,当前不起作用。但是,正如许多人推测的那样,它可能在将来的版本中起作用。

评论


实际尝试一下的好主意。一件事:您能否将屏幕截图的文本添加为​​实际文本(Ubuntu终端支持复制和粘贴)。 “真实”文本具有许多优点(易于阅读,支持屏幕阅读器,可被搜索引擎抓取)

–sleske
16年4月11日在7:02

一些更新:我已经能够在运行最终周年更新的机器上完全安装docker。但是执行docker ps失败:获取http:///var/run/docker.sock/v1.18/containers/json:拨打unix /var/run/docker.sock:setsockopt:无效参数您是否要连接到没有TLS的启用TLS的守护程序?

– kumarharsh
16年8月4日在13:43

看起来现在可以正常工作:tutorials.ubuntu.com/tutorial/…

–尼克·斯威汀(Nick Sweeting)
17-10-26在3:59

#4 楼

不,这是不可能的。

Docker需要多个条件才能运行容器: br />
PID
用户
网络
安装
UTS
IPC



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

评论


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

– MSalters
16年4月4日在14:08

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

– MSalters
16年4月4日在14:13

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

–sleske
16年4月4日在15:02

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

–瑞安
16年4月4日在17:03

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

– Ajedi32
16年4月4日在20:00

#5 楼

从创建者更新(2017年6月13日公开发布)开始,您可以直接在WSL中运行本机Windows可执行文件。这意味着,如果您已经安装了Docker for Windows,则只需调用安装在docker下的C:\Program Files二进制文件即可。由于它们以.exe结尾,所以最简单的选择是创建别名。 .bashrc中的以下内容应该可以正常工作: />
一个警告:从Linux目录运行时,您会收到一条错误消息,例如“无法转换当前工作目录”。只需将DOCKER_BIN放入Windows目录(例如cd)就可以了。

评论


这似乎没有将bash环境变量纳入docker-compose YML文件中。有什么想法吗?

–RüdigerSchulz
17年9月10日在19:59

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

– dimo414
17年9月10日在21:13

#6 楼

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

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

#7 楼

在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服务器以及所需的一切。


#8 楼

截至2016年9月,No。

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

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

它还需要过程控制组(cgroup),可堆叠文件系统(aufs)以及内核之外的其他基于Linux的系统。 /> cgroups和aufs都不是Windows 10内核中的本地版本。 quick_start / quick_start_windows_server ..但这只会运行某些Windows服务,例如IIS,而不是Ubuntu

#9 楼

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

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


评论


太棒了!请继续尝试。

–霍基
16年4月13日在7:12

看起来这可能与golang(编写Docker的方式)中的内存分配方式有关:groups.google.com/forum/#!msg/golang-dev/EpUlHQXWykg/…

–提莫西·米德(Timothy Meade)
16年4月16日在17:35

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

–wieczorek1990
16年4月21日在19:01

#10 楼

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


评论


现在,您可以在bash中运行linux的docker客户端,从而补充了这一事实,因此,如果您不习惯

–卡洛斯·拉斐尔·拉米雷斯(Carlos Rafael Ramirez)
16年8月3日在15:06

看看他们是否将其扩展到docker swarm将会很有趣。

–霍基
16年8月6日在4:13