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

时间:2017-12-28 13:48:56

标签: windows docker windows-subsystem-for-linux

我试图在WSL上运行Docker失败。我按照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?

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

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?

9 个答案:

答案 0 :(得分:11)

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

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

此链接有效,因为从版本 Windows 10 Creators更新 ,可以从Bash运行Windows可执行文件。如果Windows版本是Windows 10 Creators Update之前的版本,则可以尝试solution explained in this blog

答案 1 :(得分:9)

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

等待接下来几周内为所有人提供的下一个Windows 10功能版本!

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

此刻,您无法在WSL中运行dockerd和实际的docker运行时。尽管绝非如此,但这意味着将来将不可能。

仍然可以使用WSL的docker客户端来控制Windows²泊坞窗守护程序及其容器。

在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。

答案 4 :(得分:1)

给出的答案已过期。 按照该博客中链接到该博客的说明进行操作: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

就是这样。可以。

答案 5 :(得分:1)

对于Windows 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将TCP用于Docker,因此您需要将docker文件链接到Windows中的docker.exe。

答案 6 :(得分:0)

  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上。

答案 7 :(得分:0)

似乎Docker是否可以在WSL上正常运行可能取决于许多因素,因此某些系统上的正确答案可能并不适合所有人。对我来说,直到安装WSL2后,我才能使其正常运行。WSL2需要Windows 10内部版本,当前只能通过注册Windows Insider程序(截至2020年5月)才能使用。在网上搜索并尝试了多种方法失败后,我终于遇到this article,它对我来说是正确的答案。

对我来说,有两个警告:1.我必须在我的BIOS中启用“虚拟化”(用于运行虚拟机),以及2.安装docker-compose的最终命令似乎无效,所以I followed this

*最后,我应该注意,Docker桌面将无法在Windows 10家庭版上运行,因此WSL2是我系统上的唯一选择。

答案 8 :(得分:0)

创建NAT链失败:iptables失败

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

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