运行 Docker Ubuntu Windows Linux 的子系统

Run Docker on Ubuntu on Windows Subsystem for Linux

我曾尝试 运行 Docker 在 WSL 上失败。我已经按照 install Docker on Ubuntu 的步骤在 WSL 上安装了 Docker,但是当我执行 docker ps 时,出现以下错误:

docker ps    
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

查看 docker 日志我发现了这个:

level=warning msg="Running modprobe nf_nat failed with message: `modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.0-43-Microsoft/modules.dep.bin'\nmodprobe: WARNING: Module nf_nat not found in directory /lib/modules/4.4.0-43-Microsoft`, error: exit status 1"
time="2017-12-28T12:07:23.227671600+01:00" level=warning msg="Running modprobe xt_conntrack failed with message: `modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.4.0-43-Microsoft/modules.dep.bin'\nmodprobe: WARNING: Module xt_conntrack not found in directory /lib/modules/4.4.0-43-Microsoft`, error: exit status 1"
Error starting daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain: iptables failed: iptables -t nat -N DOCKER: iptables v1.6.0: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
 (exit status 3)

知道如何在 WSL 上 运行 Docker 吗?

最后,我可以通过一种简单的方式在 WSL 上 运行 Docker:您需要先安装 运行 Docker Engine on Windows 和然后只需在 Ubuntu bash 上创建一个符号 link 指向 Windows 可执行文件:

sudo ln -s /mnt/c/Program\ Files/Docker/Docker/resources/bin/docker.exe /usr/bin/docker

此 link 有效,因为从版本 Windows 10 Creators Update 可以 运行 Windows 个来自 Bash 的可执行文件。如果您的 Windows 版本早于 Windows 10 Creators Update,您可以尝试 solution explained in this blog

尝试 运行 Linux dockerd 守护程序与 WSL 不太可能工作,Docker Linux 需要 Linux 运行 的内核,而 WSL 是实现 Linux 系统调用的 Windows 内核,允许您 运行 Linux 程序。

相反,您应该安装 docker for windows,它支持使用嵌入式 Linux VM(Hyper-V 或 VirtualBox,具体取决于您的版本)的 Linux 容器。安装 docker 的 Windows 版本后,您将拥有可以从各种命令行访问的 docker 客户端,包括 cmd 和 bash.

好消息!真正的 linux Docker 守护进程在 build 17134 上运行良好,因此不再需要 Windows Docker 或 Hyper-V。我正在测试 Release Preview 环上的构建,我刚刚在 WSL 内的 linux 容器内编译了 docker 源代码,没有问题!

请等待下一个 Windows 10 功能版本,它将在接下来的几周内为所有人发布!

此时此刻,您无法 运行 dockerd 和 WSL 中的实际 docker 运行 时间。虽然不是,但代表以后不可能了。

您仍然可以使用 WSL 中的 docker 客户端来控制您的 Windows² docker 守护进程及其容器。

在 WSL 中,只需执行 export DOCKER_HOST='tcp://localhost:2375'。此外,在您的 Windows² Docker 设置中允许 TCP 访问。现在您可以执行 docker ps 并在 Windows² 上查看由 dockerd 提供支持的容器。

如果您 Cannot connect to the Docker daemon at tcp://localhost:2375. Is the docker daemon running?,这意味着您没有在 Windows 上的 Docker 设置中启用 TCP 访问。

² 实际上 Windows 根本不支持 Docker。 Hyper-V "Moby" Linux 实例在 Windows.

上启用 Docker
  1. 安装"Docker for windows".
  2. "Docker for windows" > settings > general 启用 expose on tcp//*** without TLS.
  3. 运行 按照 sybsystem 上的代码片段安装 docker cli
DOCKERVERSION=18.03.1-ce
curl -fsSLO https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKERVERSION}.tgz \
&& tar xzvf docker-${DOCKERVERSION}.tgz --strip 1 -C /usr/local/bin docker/docker \
&& rm docker-${DOCKERVERSION}.tgz
  1. export DOCKER_HOST='tcp://localhost:2375'在 sybsystem 上。

给定的答案已过时。 按照同一博客中的说明进行操作,链接到 post:Running Docker containers on Bash on Windows。解决方法还是很简单的。

  • 在 Windows
  • 上安装 docker
  • 将以下行添加到 WSL 上的 .bashrc、.zshrc、.whateverrc 中
export PATH="/mnt/c/Program\ Files/Docker/Docker/resources/bin:$PATH"
alias docker=docker.exe
alias docker-compose=docker-compose.exe

就是这样。有效。

对于 Window 10 - 内部版本 1909

这对我有用。 运行 WLS 中的这些命令 Ubuntu.

$ sudo ln -s /mnt/c/Program\ Files/Docker/Docker/resources/bin/docker.exe /usr/bin/docker
$ alias docker='docker.exe'
$ alias docker-compose=docker-compose.exe

Windows不允许WSL为Docker使用TCP,所以你需要linkdocker文件到docker.exe中windows.

似乎 Docker 在 WSL 上是否正常运行可能取决于许多因素,因此在某些系统上的正确答案可能并不适用于所有系统。对我来说,在安装 WSL2 之前,我无法将其正确设置为 运行,这需要 Windows 10 版本,目前只能通过注册 Windows Insider Program(截至2020 年 5 月)。在网上搜索并尝试了多种方法都失败后,我终于找到了 this article,它为我提供了正确的答案。

这篇文章对我来说有两个警告:1. 我必须在我的 BIOS 中启用 "virtualization"(对于 运行ning 虚拟机),以及 2. 安装 docker-compose 似乎不起作用,所以 I followed this.

*最后,我要注意 Docker 桌面版不会 运行 在 Windows 10 家庭版上,所以 WSL2 是我系统上的唯一选项。

failed to create NAT chain: iptables failed

使用 --iptables=false 尝试 运行 dockerd 服务(考虑添加 -D 进行调试)。

--iptables Enable addition of iptables rules (default true)

试试这个命令

sudo docker pull mcr.microsoft.com/mssql/server:2019-latest

在执行之前更改您的 mssql 服务器的版本。

在我的案例中,问题与 wsl 的版本有关。 我将其更改为版本 2 并重新安装了 Ubuntu-20.04 和 docker,一切正常。

wsl --set-default-version 2