当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

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

最近,Microsoft announced在Windows 10上本地运行的Ubuntu linux user mode的beta版。这可以在Windows上运行以ELF格式编译的二进制文件(不同于cygwin需要编译)。

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

最佳办法

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

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

从版本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在WSL上将显示为/mnt/c/dir,在docker引擎中显示为/c/dir/。您可以永久克服它:

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

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

更新

来自:What’s new for the Command Line in Windows 10 version 1803

Unix Sockets Unix Sockets weren’t supported on Windows, and now they are! You can also communicate over Unix sockets between Windows and WSL. One of the great things about this is it enables WSL to run the Linux Docker Client to interact with the Docker Daemon running on Windows.

更新

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

问候

次佳办法

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

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

事实

  • Windows 10现在可以运行各种Linux程序(包括Bash shell和各种文本实用程序)。这些不是端口(即重新编译的版本,例如在Cygwin中),它们与在典型Linux系统上运行的ELF binaries相同。在这种情况下,它们取自Ubuntu。

  • 为实现此目的,Windows 10已被修改为接受Linux系统调用(syscall),并能够加载和运行ELF二进制文件(comment by Scott Hanselman)。这意味着可以运行未修改的Linux可执行文件,它们将按需加载未修改的共享库,而Windows将它们作为Windows进程运行。

  • 每当这样的Linux程序想要与内核交互时,它都会发出系统调用(或让库执行)。 (大概)这是与在Linux上运行的唯一区别:在Linux上运行时,Linux内核处理这些调用。在Windows 10上,Windows 10内核会执行此操作。

炒作

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

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

现有的Docker端口

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

  • 有一个Docker port for FreeBSD。它被标记为”experimental”,但似乎在原则上起作用。它可以使用Docker存储库中未修改的Docker容器,这意味着它实际上为映像提供了Linux-like主机环境。

  • 有一个项目正在进行中,以将Docker移植到Windows(特别是Windows Server 2016)-请参见2015年8月的Docker blog entry。但是,与上面的FreBSD端口不同,该端口将允许Docker在Windows而不是Linux上运行Windows映像。 Windows上的图像。感谢RоryMcCune指出这一点。

第三种办法

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

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

第四种办法

不,这是不可能的。

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

  • chroot

  • 命名空间:

    • PID

    • 用户数

    • 网络

    • 坐骑

    • 悉尼科技大学

    • IPC

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

第五种办法

Creator Update(于2017年6月13日公开发布)开始,您可以直接在WSL中运行本机Windows可执行文件。这意味着,如果您已经安装了Docker for Windows,则只需调用安装在C:\Program Files下的docker二进制文件即可。由于它们以.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),您就可以了。

第六种办法

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

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

第七种办法

在Windows 10版本1607内部版本1493.10中,您可以在Ubuntu Bash上成功安装它,但是它不起作用:(

一个简单的”docker version”会告诉您:

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方面的一个障碍。

但是,您可以安装Docker for Windows,它的工作原理非常简单,您可以明显地部署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

第八种办法

截至2016年9月,

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

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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11508.html,未经允许,请勿转载。