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

Haw*_*eye 127 windows ubuntu lxc docker windows-10

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

最近,Microsoft 宣布了在 Windows 10 上本地运行的Ubuntu linux用户模式的测试版。这可以在 Windows 上运行以 ELF 格式编译的二进制文件(与需要编译的 cygwin 不同。)

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

Car*_*rez 104

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

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

从 17.03.1-ce-win12 (12058) 版本开始,您必须在没有 TLS 的情况下检查tcp://localhost:2375 上的 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
Run Code Online (Sandbox Code Playgroud)

或者

env DOCKER_HOST=tcp://0.0.0.0:2375 ./docker ps
Run Code Online (Sandbox Code Playgroud)

要使其永久化:

mkdir ~/bin
mv ~/docker/docker ~/bin
Run Code Online (Sandbox Code Playgroud)

.bashrc 中添加相应的变量

export DOCKER_HOST=tcp://0.0.0.0:2375
export PATH=$PATH:~/bin
Run Code Online (Sandbox Code Playgroud)

当然,你可以安装 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
Run Code Online (Sandbox Code Playgroud)

或者使用 python pip

sudo apt-get install python-pip bash-completion
sudo pip install docker-compose
Run Code Online (Sandbox Code Playgroud)

和 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
Run Code Online (Sandbox Code Playgroud)

我已经使用 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**
Run Code Online (Sandbox Code Playgroud)

添加卷时要小心。该路径C:\dir/mnt/c/dir在 WSL 和/c/dir/docker 引擎上可见。您可以永久克服它:

sudo bash -c "echo -e '[automount] \nroot = /'>/etc/wsl.conf"
Run Code Online (Sandbox Code Playgroud)

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

更新

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

Unix 套接字 Windows 不支持 Unix 套接字,现在支持了!您还可以在 Windows 和 WSL 之间通过 Unix 套接字进行通信。这样做的好处之一是它使 WSL 能够运行 Linux Docker 客户端以与运行在 Windows 上的 Docker 守护程序进行交互。

更新

此脚本和 Unix 套接字的使用包含在Pengwin的 pengwin-setup 中。

问候

  • 截至 2017 年 2 月,这仍然是唯一的方法。 (5认同)
  • 你好@joel-pearson,docker 有两个部分:引擎和客户端。该引擎使用Docker Toolbox(基于VirtualBox)或Docker for Windows(基于Hyper-V)在Windows中运行,两者均由Docker团队官方支持。Docker 引擎尚未在 bash 用户空间中运行。Windows 中的 Docker 客户端可以在 cmd、powershell 或 cygwin 中运行。这个答案说的是在 bash 用户空间中运行 docker 客户端的方法。为什么?我个人更喜欢 bash,完成工作。我同意这个问题是关于 docker 引擎的,但是我在寻找客户端时发现了它,而且很多人也是这样做的。 (3认同)
  • 2017 年 6 月之后,您可以[从 bash shell 运行 *docker for windows* 可执行文件](https://blog.jayway.com/2017/04/19/running-docker-on-bash-on-windows/) . 您可以直接使用 `docker.exe` 来查询/交互 docker 子系统,而不是安装 docker 客户端。但是,请注意 windows 的 docker 将使用 windows 变量和配置。 (3认同)
  • 在 Windows 上的 Ubuntu 上的 Bash 中尝试了您的说明,得到“无法连接到 Docker 守护程序。docker 守护程序是否在此主机上运行?”。您是否缺少某些步骤? (2认同)

sle*_*ske 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 内核处理这些调用;在 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)的项目正在进行中 - 请参阅2015 年 8 月的这篇Docker 博客条目。但是,与上面的 FreBSD 端口不同,这将是一个允许 Docker 在 Windows 上运行 Windows 映像的端口,不是 Windows 上的 Linux 映像。感谢 R?ry McCune 指出这一点。


Flo*_*aie 13

不,这是不可能的。

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

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

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

  • 实际上,我认为现在回答这个问题还为时过早。如 [Scott Hanselman 的评论](http://www.hanselman.com/blog/DevelopersCanRunBashShellAndUsermodeUbuntuLinuxBinariesOnWindows10.aspx#a71f8d4b-d9e6-4a0c-af9b-46ae2f6d60b1) 所述,Windows 10 系统调用现在接受 Linux。所以问题是 Docker 需要的系统调用(用于 chroot 和命名空间)是否已实现。虽然答案可能是“否”,但据我所知,无论哪种方式都没有明确的信息。 (6认同)
  • 实际上,Windows 确实为用户、挂载和 IPC 提供了命名空间。Active Directory 需要用户命名空间,多用户操作需要挂载命名空间和 IPC 命名空间。从根本上说,Windows 中的内核对象管理器一直有命名空间,从第一个 Windows NT 版本开始,所以这并不奇怪。 (4认同)
  • 而对于远程桌面服务,Session 对象会主动使用这些命名空间来提供并发操作。这并不意味着您拥有所有必需的基础设施,但主要部分都在那里。至于`chroot`,意识到Ubuntu环境已经有一个不同于WIN32的root。 (3认同)
  • 我知道的不够多,无法自信地说这个答案是完全错误的,但它的措辞方式让我有点怀疑它的有效性。特别是声明“Bash 是一个简单的用户空间程序,不能提供任何这些”并将适用于 Linux 的 Window 子系统称为“新的 Bash 功能”,这听起来像是这个答案是基于完全错误的假设,微软所做的一切是端口 bash 到 Windows。那不是发生的事情。他们开发了一个完整的 Linux 内核接口,运行在 Windows 内核之上:https://msdn.microsoft.com/en-us/commandline/wsl/about (2认同)

小智 13

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

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

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

dim*_*414 7

Creator Update(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
Run Code Online (Sandbox Code Playgroud)

这会为目录中的所有文件创建别名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
Run Code Online (Sandbox Code Playgroud)

一个警告:如果从 Linux 目录运行,您将收到一条错误消息,例如“无法转换当前工作目录”。只需cd进入 Windows 目录(例如/mnt/c/Users/YourUsername),您应该就可以了。


mix*_*xja 6

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

考虑到您拥有 Docker Windows 客户端,这听起来可能并不多,但如果您拥有包含 docker 的 Linux 工具链作为其客户端功能,这将非常有用。