环境说明
环境:win10企业版 + ubuntu 18.04 lts [wsl]
win10安装docker for windows
现在 docker 有专门的 win10 专业版系统的安装包,需要开启hyper-v。
开启 hyper-v
程序和功能
启用或关闭windows功能
选中hyper-v
安装docker for windows
最新版 docker for windows
下载地址: https://docs.docker.com/v17.09/docker-for-windows/install/
点击 get docker for windows [stable],并下载 windows 的版本:
安装完成后,docker 会自动启动。通知栏上会出现个小鲸鱼的图标,这表示 docker 正在运行。
桌边也会出现三个图标,入下图所示:
我们可以在命令行执行 docker version
来查看版本号,docker run hello-world
来载入测试镜像测试。
如果没启动,你可以在 windows 搜索 docker 来启动:
启动后,也可以在通知栏上看到小鲸鱼图标:
子系统安装docker安装
没啥问题
1
|
2
3
4
5
6
|
leenhem@desktop-7sreo20:~$ sudo apt-get install docker.io
reading package lists... done
building dependency tree
reading state information... done
docker.io is already the newest version (18.09.7-0ubuntu1~18.04.4).
0 upgraded, 0 newly installed, 0 to remove and 111 not upgraded.
|
使用 有问题 [无法正常使用]
官网释疑
1
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
leenhem@desktop-7sreo20:~$ docker ps
cannot connect to the docker daemon at unix:///var/run/docker.sock. is the docker daemon running?
leenhem@desktop-7sreo20:~$ sudo /etc/init.d/docker status
* docker is not running
leenhem@desktop-7sreo20:~$ sudo /etc/init.d/docker start
* starting docker: docker [ ok ]
leenhem@desktop-7sreo20:~$
leenhem@desktop-7sreo20:~$ sudo /etc/init.d/docker status
* docker is running
leenhem@desktop-7sreo20:~$ sudo /etc/init.d/docker status
* docker is not running
你会发现这个docker怎么都启动不了,那现在怎么办?一定要先看日志(/var/log/docker.log )
leenhem@desktop-7sreo20:~$ tail /var/log/docker.log -n 100
time="2019-10-22t11:58:25.436968100+08:00" level=info msg="ccresolverwrapper: sending new addresses to cc: [{ unix:///var/run/docker/containerd/containerd.sock 0 <nil>}]" module=grpc
time="2019-10-22t11:58:25.437359900+08:00" level=info msg="clientconn switching balancer to \"pick_first\"" module=grpc
time="2019-10-22t11:58:25.437703900+08:00" level=info msg="pickfirstbalancer: handlesubconnstatechange: 0xc420769030, connecting" module=grpc
time="2019-10-22t11:58:25.438698400+08:00" level=info msg="pickfirstbalancer: handlesubconnstatechange: 0xc420769030, ready" module=grpc
time="2019-10-22t11:58:25.559058900+08:00" level=info msg="[graphdriver] using prior storage driver: overlay2"
time="2019-10-22t11:58:25.719182400+08:00" level=info msg="graph migration to content-addressability took 0.00 seconds"
time="2019-10-22t11:58:25.719593400+08:00" level=warning msg="your kernel does not support cgroup memory limit"
time="2019-10-22t11:58:25.719660300+08:00" level=warning msg="unable to find cpu cgroup in mounts"
time="2019-10-22t11:58:25.719697200+08:00" level=warning msg="unable to find blkio cgroup in mounts"
time="2019-10-22t11:58:25.719732900+08:00" level=warning msg="unable to find cpuset cgroup in mounts"
time="2019-10-22t11:58:25.719888000+08:00" level=warning msg="mountpoint for pids not found"
time="2019-10-22t11:58:25.721991900+08:00" level=info msg="stopping healthcheck following graceful shutdown" module=libcontainerd
time="2019-10-22t11:58:25.722045300+08:00" level=info msg="stopping event stream following graceful shutdown" error="context canceled" module=libcontainerd namespace=plugins.moby
time="2019-10-22t11:58:25.723869300+08:00" level=info msg="pickfirstbalancer: handlesubconnstatechange: 0xc420769030, transient_failure" module=grpc
time="2019-10-22t11:58:25.724042800+08:00" level=info msg="pickfirstbalancer: handlesubconnstatechange: 0xc420769030, connecting" module=grpc
error starting daemon: devices cgroup isn't mounted
初步结论:应该win10内核无法完全模拟linux的cgroup和aufs组件
|
官网解释【解决方案】
[cross post] wsl interoperability with docker
https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly
1
|
2
3
4
|
apt install screenfetch
screenfetch
脚本: https://files.cnblogs.com/files/rgqancy/wsl.js ,下载后另存为txt
|
建立中继
现在安装go,我们可以构建继电器。在下面的命令中,请确保使用您的windows用户名替换:
1
|
2
|
go get -d github.com/jstarks/npiperelay
goos=windows go build -o /mnt/c/users/administrator/go/bin/npiperelay.exe github.com/jstarks/npiperelay
|
我们现在已经为windows构建了中继,但我们希望它可以从wsl内部调用。为此,我们创建一个符号链接。确保使用您的windows用户名替换:
1
|
|
sudo ln -s /mnt/c/users/administrator/go/bin/npiperelay.exe /usr/local/bin/npiperelay.exe
|
我们将使用socat来帮助启用中继。安装socat,这是一种允许两点间数据双向流动的工具(稍后详细介绍)。抓住这个包裹:
1
|
|
sudo apt install socat
|
最后一步
随着socat的安装和可执行文件的构建,我们只需要将几件事情串起来。我们将制作一个shell脚本来激活我们的功能。我们将把它放在用户的主目录中。去做这个:
1
|
2
3
4
|
#make the file
touch ~/docker-relay
#add execution privileges
chmod +x ~/docker-relay
|
打开我们用你最喜欢的文本编辑器创建的文件(比如vim)。将其粘贴到文件docker-relay中:
1
|
2
|
#!/bin/sh
exec socat unix-listen:/var/run/docker.sock,fork,group=docker,umask=007 exec:"npiperelay.exe -ep -s //./pipe/docker_engine",nofork
|
保存该文件并关闭它。docker-relay脚本将docker管道配置为允许docker组访问。要以普通用户身份运行(不必为每个docker命令附加'sudo'),请将您的wsl用户添加到docker组。在ubuntu中:
1
|
|
sudo adduser <your wsl user> docker
|
测试一下吧!
打开一个新的wsl外壳以确保您的组成员身份被重置。在后台启动中继:
1
|
|
sudo ~/docker-relay &
|
现在运行docker命令来测试水域。你应该被相同的输出迎接,就像你从windows运行命令一样(并且注意你不需要在命令前加'sudo'!)
注意
要提前启动docker for windows
原理图
使docker客户端在wsl下运行以与docker for windows通信存在一个基本问题:wsl客户端通过unix套接字理解ipc,而docker for windows通过命名管道理解ipc。这就是socat和npiperelay.exe发挥作用的地方–这是这两种不相交ipc形式之间的中介。socat理解如何通过unix套接字进行通信,npiperelay理解如何通过命名管道进行通信。socat和npiperelay都了解如何通过stdio进行通信,因此它们可以彼此通信。
总结
以上所述是小编给大家介绍的win10子系统ubuntu(wsl) 安装docker的教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!原文链接:https://blog.csdn.net/leenhem/article/details/102677632