最近,Microsoft宣布了一个本机运行在Windows 10上的Ubuntu Linux用户模式的Beta。该模式可以在Windows上运行以ELF格式编译的二进制文件(与需要编译的cygwin不同)。 />我的问题是:您可以在新的Windows 10(Ubuntu)bash用户空间上本地运行Docker吗?
#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
评论
这不是“仅仅” 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正在开发的新子系统的情况下运行带有其他内核的系统