在Windows子系统Linux上运行Ubuntu上的Docker

And*_*rez 15 windows docker windows-subsystem-for-linux

我试图在WSL上运行Docker失败.我按照在Ubuntu安装Docker的步骤安装了WSL上的Docker,但是当我执行时,docker ps我收到以下错误:

docker ps    
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Run Code Online (Sandbox Code Playgroud)

看着码头日志我发现了这个:

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

知道如何在WSL上运行Docker?

And*_*rez 21

最后,我可以轻松地在WSL上运行Docker:首先需要在Windows上安装和运行Docker Engine,然后在Ubuntu bash上创建一个指向Windows可执行文件的符号链接:

sudo ln -s /mnt/c/Program\ Files/Docker/Docker/resources/bin/docker.exe /usr/bin/docker
Run Code Online (Sandbox Code Playgroud)

此链接有效,因为从Windows 10 Creators Update版本可以从Bash运行Windows可执行文件.如果Windows版本是Windows 10 Creators Update之前的版本,则可以尝试本博客中介绍解决方案

  • 对于 Windows build 1903,此解决方案对我来说不起作用,但 WSL 终端中的命令“docker.exe”工作正常。所以我只是创建了一个别名 `alias docker='docker.exe'`。 (2认同)
  • 有用!谢谢。在创建新符号链接之前,我必须使用“sudo rm /usr/bin/docker”删除现有符号链接。 (2认同)

ken*_*orb 17

创建 NAT 链失败:iptables 失败

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

--iptables启用添加 iptables 规则(默认 true)

  • 我尝试了这个,但现在收到“无法启动守护程序:初始化网络控制器时出错:创建默认“桥”网络时出错:权限被拒绝”错误(与“无法启动守护程序:初始化网络控制器时出错:获取控制器时出错”相反)实例:无法创建 NAT 链 DOCKER:iptables 失败:iptables -t nat -N DOCKER:iptables v1.8.4(旧版):无法初始化 iptables 表 \`nat':表不存在(是否需要 insmod? )` 我之前遇到的错误) (11认同)
  • 要在服务执行期间使用它,您需要将 `"iptables": false` 添加到 daemon.json 文件 (2认同)

Ale*_* A. 12

就我而言,问题与wsl. 我将其更改为版本 2并重新安装了 Ubuntu-20.04 和 docker,一切正常。

wsl --set-default-version 2
Run Code Online (Sandbox Code Playgroud)

  • 我的天啊。为了得到这个答案,我查了很多答案。是的,启用了 WSL 2(为什么 Win 10 不是默认的 2???)重新安装了 Ubuntu 和 Docker,“无法连接到 Docker 守护进程...”错误消失了!无需安装 Docker Desktop(不再免费)。 (2认同)

ono*_*oma 9

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

只需等待下一周即将发布的下一个Windows 10功能版本!

  • 是的,好消息!不幸的是,`docker-compose` 仍然不起作用。 (2认同)
  • 我的操作系统是 17134.684,无法启动 docker 并出现错误“启动守护程序时出错:初始化网络控制器时出错:获取控制器实例时出错:无法创建 NAT 链 DOCKER:iptables 失败:iptables -t nat -N DOCKER:iptables v1.6.1:可以't initialize iptables table `nat': 表不存在(你需要 insmod 吗?)也许 iptables 或你的内核需要升级。” (2认同)

BMi*_*tch 5

尝试使用 WSL 运行 Linux dockerd 守护进程不太可能成功,Linux 的 Docker 需要一个 Linux 内核才能运行,而 WSL 是实现 Linux 系统调用以允许您运行 Linux 程序的 Windows 内核。

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


Mar*_*ssy 5

给出的答案已过时。请按照该博文中链接的同一博客中的说明进行操作:在 Windows 上的 Bash 上运行 Docker 容器。解决办法还是很简单的。

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

就是这样。有用。