Docker 运行 是在 WSL 内还是连接回 Windows?

Is Docker running within WSL or connecting back to Windows?

在 WSL 中成功安装 Docker 后,如果我 运行 标准 Docker 命令,我会收到连接错误。无论是否使用 sudo 运行都会在所有示例中产生相同的结果。

root@SUR002731165154:~# sudo docker info
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

root@SUR002731165154:~# sudo docker version
Client:
Version:      1.13.1
API version:  1.26
Go version:   go1.7.5
Git commit:   092cba3
Built:        Wed Feb  8 06:42:29 2017
OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

但是,如果我在命令中添加 -H localhost:2375 我可以 运行 Docker 没问题。 Docker 是连接到我的本地主机 Windows 10 机器还是 运行 在 WSL 本地连接,或者两者兼而有之?

root@SUR002731165154:~# docker -H localhost:2375 version
Client:
Version:      1.13.1
API version:  1.26
Go version:   go1.7.5
Git commit:   092cba3
Built:        Wed Feb  8 06:42:29 2017
OS/Arch:      linux/amd64

Server:
Version:      1.13.1
API version:  1.26 (minimum version 1.12)
Go version:   go1.7.5
Git commit:   092cba3
Built:        Wed Feb  8 08:47:51 2017
OS/Arch:      linux/amd64
Experimental: true

root@SUR002731165154:~# docker -H localhost:2375 info
Containers: 11
Running: 0
Paused: 0
Stopped: 11
Images: 8
Server Version: 1.13.1
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1
runc version: 9df8b306d01f59d3a8029be411de015b7304dd8f
init version: 949e6fa
Security Options:
seccomp
Profile: default
Kernel Version: 4.9.8-moby
Operating System: Alpine Linux v3.5
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.934 GiB
Name: moby
ID: 4LYM:R5T5:6CPZ:Z2KC:YQ4R:NGN4:V6SR:DF7E:YPYO:7FHY:EQW5:2T7W
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: 13
Goroutines: 21
System Time: 2017-02-28T18:54:13.7726687Z
EventsListeners: 0
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false

Docker 守护程序不能在 WSL 下 运行,因为它没有实现必要的内核 ABI。如果您 运行宁 Docker Windows,您可能正在连接到它管理的 Hyper-V 虚拟机。

因为它在不同的机器上,您将无法将 WSL 目录装载为 Docker 卷,但您可以从 WSL 目录构建映像。这是因为在构建时,客户端会创建一个 tarball 并将其发送到守护进程。

这是一种解决方法,即在 WSL 中对 windows 使用 Docker。

只需将以下内容添加到您的 WSL .bashrc 文件中。

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
export PATH="$PATH:/mnt/c/Program\ Files/Docker/Docker/resources/bin"
alias docker=docker.exe
alias docker-compose=docker-compose.exe

参考:https://blog.jayway.com/2017/04/19/running-docker-on-bash-on-windows/

如其他答案所述,Docker 无法在 WSL 中安装和托管,但可以直接从那里作为任何 Windows 可执行文件使用。

它可能只需要额外的努力就可以在没有那些讨厌的 .exe 扩展的情况下使用: Bash on Windows - alias for exe files。 链接的解决方法提供了一个随时可用的自定义脚本,可以轻松创建符号链接。与 bash 别名不同,符号链接可以在非交互式 shell 脚本中自由使用。


对于 Windows,还有一种从 WSL 连接到 Docker 的方法,如 https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly 中所述的远程主机。

If you’re wondering “why not just run docker.exe and docker-compose.exe from Docker for Windows directly in WSL?”, that’s due to a bug with running Docker or Docker Compose interactively in that environment. The TL;DR is you can’t run anything in the foreground with interactive mode, which makes it unusable for real web development.

但遗憾的是,那里没有提到确切的错误症状。 而我至今没有面对它。