WSL2中的Alpine中不使用Docker Desktop安装Docker

4
“Docker Desktop未在WSL1下运行是不可能的”(原文链接),因此我正在尝试按照这篇文章的方法在WSL2 Alpine中运行Docker。
然而,我并没有那么幸运,无法让它正常工作。完整日志如下。
请问有人知道哪里出了问题吗?
整个过程都是在alpine/v3.15下完成的(从https://apps.microsoft.com/store/detail/alpine-wsl/9P804CRF0395?hl=en-us&gl=US安装)。 Downloading : https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/x86_64/alpine-minirootfs-3.15.0-x86_64.tar.gz
% apk del docker-cli docker-ce docker-openrc docker-compose docker
ERROR: No such package: docker-ce

% apk del docker-cli docker-openrc docker-compose docker
(1/17) Purging containerd-openrc (1.5.11-r2)
(2/17) Purging iptables-openrc (1.8.7-r1)
(3/17) Purging ip6tables-openrc (1.8.7-r1)
(4/17) Purging docker-openrc (20.10.16-r0)
(5/17) Purging docker (20.10.16-r0)
(6/17) Purging docker-engine (20.10.16-r0)
(7/17) Purging containerd (1.5.11-r2)
(8/17) Purging runc (1.1.2-r1)
(9/17) Purging ip6tables (1.8.7-r1)
(10/17) Purging tini-static (0.19.0-r0)
(11/17) Purging docker-cli (20.10.16-r0)
(12/17) Purging ca-certificates (20211220-r0)
Executing ca-certificates-20211220-r0.post-deinstall
(13/17) Purging libseccomp (2.5.2-r0)
(14/17) Purging iptables (1.8.7-r1)
(15/17) Purging libnftnl (1.2.1-r0)
(16/17) Purging libmnl (1.0.4-r2)
(17/17) Purging device-mapper-libs (2.02.187-r2)
Executing busybox-1.34.1-r3.trigger
OK: 11 MiB in 22 packages

% sudo apk add docker --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community
-ash: sudo: not found

% apk add docker --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
(1/17) Installing ca-certificates (20211220-r0)
(2/17) Installing libseccomp (2.5.2-r0)
(3/17) Installing runc (1.1.2-r1)
(4/17) Installing containerd (1.6.4-r2)
(5/17) Installing containerd-openrc (1.6.4-r2)
(6/17) Installing libmnl (1.0.4-r2)
(7/17) Installing libnftnl (1.2.1-r0)
(8/17) Installing iptables (1.8.7-r1)
(9/17) Installing iptables-openrc (1.8.7-r1)
(10/17) Installing ip6tables (1.8.7-r1)
(11/17) Installing ip6tables-openrc (1.8.7-r1)
(12/17) Installing tini-static (0.19.0-r0)
(13/17) Installing device-mapper-libs (2.02.187-r2)
(14/17) Installing docker-engine (20.10.16-r0)
(15/17) Installing docker-openrc (20.10.16-r0)
(16/17) Installing docker-cli (20.10.16-r0)
(17/17) Installing docker (20.10.16-r0)
Executing docker-20.10.16-r0.pre-install
Executing busybox-1.34.1-r3.trigger
Executing ca-certificates-20211220-r0.trigger
OK: 238 MiB in 39 packages

% service docker restart
 * WARNING: docker is already starting

% service docker status
 * You are attempting to run an openrc service on a
 * system which openrc did not boot.
 * You may be inside a chroot or you may have used
 * another initialization system to boot this system.
 * In this situation, you will get unpredictable results!
 * If you really want to do this, issue the following command:
 * touch /run/openrc/softlevel

% touch /run/openrc/softlevel
touch: /run/openrc/softlevel: No such file or directory

% service openrc start
 * service: service `openrc' does not exist

% service docker-openrc start
 * service: service `docker-openrc' does not exist
2个回答

4
你可以按照你链接的博客文章中所述,直接运行Docker 守护进程:
sudo dockerd

然后切换到另一个WSL Alpine实例并运行Docker客户端命令。

但是,要使用OpenRC Docker服务,您有两个选项。

首先,您可以启动OpenRC,然后手动启动Docker服务:

openrc default
rc-service docker start # or service docker start

或者您可以将Docker服务添加到默认的运行级别中(一次性),然后它将在该运行级别中每次启动OpenRC时运行:

一次性:

rc-update add docker default

然后,要使用默认运行级别启动OpenRC,这也会运行Docker:

openrc default

实际上,你遇到的唯一问题就是 OpenRC 没有被先初始化。通常,这会在 Alpine 的 init 过程中完成,但 WSL 自己的 /init 正在运行。


确实!感谢您提供又一份高质量的答案!由于无法使其正常工作,我转而使用WSL2 Ubuntu,并遇到了一个进一步的问题 - https://stackoverflow.com/questions/72418707/sharing-docker-daemon-between-wsl-instances。所有这些都是相关的,因此我认为将其链接在此处也会很有帮助。如果您有时间,请看一下。谢谢。 - xpt
1
应该将以下内容添加到/etc/wsl.conf文件中,以便[boot] command="openrc default"自动启动openrc。 - undefined

2
指出两个方向。
第一个是快速简便的方法。切换到无守护进程的容器引擎,如lxc或podman,并以非root用户身份运行您的容器。
第二个是强制WSL表现得像一个虚拟机。这可以通过编辑/etc/wsl.conf并添加以下内容来实现启动openrc init子系统:
[boot]
command="openrc default"

还可以通过/etc/network/interface添加一个回环设备:
auto lo
iface lo inet loopback

注意事项:
在进入wsl环境时,必须使用--login参数。简单地使用wsl -d Alpine docker ...命令将不会执行引导序列。然而,一旦创建了登录shell,后续的wsl -d Alpine docker ...命令将按预期工作,因为已经执行了openrc。
简而言之,将wsl视为一个包装器只有在创建登录shell后才有效,但使用podman时不会出现此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接