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

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

我的理解是,在其他操作系统上运行 docker 的主要限制是实现这一点的 Linux 网络容器。(当然对于 Mac 而言)。

最近微软宣布的 beta 值UbuntuLinux的用户模式在 Windows 10 上本地运行。这可以在 Windows 上运行以 ELF 格式编译的二进制文件(与需要编译的 cygwin 不同)。

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

答案1

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

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

自版本 17.03.1-ce-win12 (12058) 起,您必须检查在没有 TLS 的情况下在 tcp://localhost:2375 上公开守护进程允许 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 的 2.1.0.1(37199)版本的 Docker Desktop 进行了测试:

$ 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 和docker 引擎中C:\dir可见。您可以永久克服它:/mnt/c/dir/c/dir/

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

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

更新

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

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

更新

该脚本和 Unix Sockets 的使用包含在企鹅的 pengwin-setup。

问候

答案2

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

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

事实

  • Windows 10 现在可以运行各种 Linux 程序(其中包括 Bash shell 和各种文本实用程序)。这些不是移植版(即重新编译的版本,例如赛格威), 他们是一样的ELF 二进制文件在典型的 Linux 系统上运行。在本例中,它们取自 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)的项目 - 请参阅此Docker 博客条目从 2015 年 8 月开始。但是,与上面的 FreBSD 移植不同,这将是一个允许 Docker 在 Windows 上运行 Windows 映像的移植,而不是在 Windows 上运行 Linux 映像。感谢 Rоry McCune 指出这一点。

答案3

第一个内部预览版昨天发布。我尝试安装 docker,但失败,如下所示: docker 失败

因此,看起来,对于第一个预览版,它目前无法工作。然而,正如许多人猜测的那样,它可能会在未来的版本中工作。

答案4

创作者更新(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

这将为目录中的所有文件创建别名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),就可以了。

相关内容