答案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,但失败,如下所示:
因此,看起来,对于第一个预览版,它目前无法工作。然而,正如许多人猜测的那样,它可能会在未来的版本中工作。
答案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
),就可以了。