"sudo systemctl enable docker" 不可用:在 WSL2 上启动时自动 运行 Docker(使用 "sysvinit" / "init" 命令或解决方法)

"sudo systemctl enable docker" not available: Automatically run Docker at boot on WSL2 (using a "sysvinit" / "init" command or a workaround)

我在 WSL2 上使用 Ubuntu(不是在 Docker 桌面上)。

根据 How to fix docker ‘Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?’ on Ubuntu,我可以使用

在启动时自动启动 docker 守护进程
sudo systemctl enable docker

而不是在每次启动时重新启动它

sudo systemctl start docker

这两个命令都避免了“无法连接到位于 unix:///var/run/docker.sock 的 Docker 守护进程。docker 守护进程是否 运行ning?”。

当使用两者中的任何一个时,我得到

Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable docker

并且测试 运行 表明,docker 尚未 运行ning:

docker run hello-world 

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. See 'docker run --help'.

之前的一些步骤,此时我也收到了不同的信息:

System has not been booted with systemd as init system (PID 1). Can't operate.Failed to connect to bus: Host is down"

这把我带到了 Fixing "System has not been booted with systemd as init system" Error:

Reason: Your Linux system is not using systemd How to know which init system you are using? You may use this command to know the process name associated with PID 1 (the first process that runs on your system):

ps -p 1 -o comm=

It should show systemd or sysv (or something like that) in the output.

ps -p 1 -o comm= 给了我 init.

根据这个和这个 table

Systemd command
    Sysvinit command

systemctl start service_name
    service service_name start

systemctl stop service_name
    service service_name stop

systemctl restart service_name
    service service_name restart

systemctl status service_name
    service service_name status

systemctl enable service_name
    chkconfig service_name on

systemctl disable service_name
    chkconfig service_name off

我可以选择service docker start到运行docker,效果很好。但是我找不到像“systemd”的“sysvinit”的 sudo systemctl enable docker 之类的东西。我希望它像:

sudo service docker enable

但是“启用”不适用于“sysvinit”/“init”。

虽然 sudo service docker startsudo systemctl start docker 一样工作,但没有使用“启用”的命令。目前,每当我启动 WSL2 时,我都需要 运行 sudo service docker start

问题:

使用 sudo service docker ... 到达 sudo systemctl enable docker 的命令是什么,或者如果不存在,这里有什么解决方法可以在打开时自动启动 docker Ubuntu 在 WSL2 上?

对“在 WSL2 上打开 Ubuntu 时自动启动 docker 的解决方法是什么?

的简短回答
  • 选项 1: 在 Windows 11 上,将必要的命令添加到 /etc/wsl.conf 中的 [boot] 部分:

    [boot]
    command="service docker start"
    
  • 选项 2: 在 Windows 10 上,运行 在您的 user[=73] 中的必要命令=] 启动脚本(例如 .profile)。首先检查服务是否 运行ning,例如:

    wsl.exe -u root -e sh -c "service docker status || service docker start"
    

    这比我之前的回答(下面的选项 3)更好,因为它不需要修改 sudoers。这利用了 wsl.exe 命令可以从 WSL 内部 运行 的事实,使用 -u root 选项 运行 命令作为 root 没有密码。

    注意:如果由于某种原因此命令失败,您的默认 WSL 分发可能与您预期的不同。检查 wsl.exe -l -v 的输出。您可以使用 wsl.exe --setdefault <distro_name> 更改默认发行版或调整上面的命令行以使用 -d <distro_name>.

    指定发行版
  • 选项 3:(旧答案,此处供后代使用):visudo 或向 /etc/sudoers.d 添加规则以允许您的用户运行 没有密码的命令:

    username ALL = (root) NOPASSWD: /usr/sbin/service docker *
    

    然后编辑您的 .profile 以添加:

    sudo service docker status || sudo service docker start
    

更多详情:

如您所见,WSL 不包含任何 systemd 支持,也不包含对在启动时启动服务的任何直接支持。

首先,WSL 子系统不会在 Windows 启动时启动,而是仅在用户启动登录会话时启动。因此,如果没有任何真正的“系统启动”,init.d 或 systemd 启动就没有多大意义。

此外,用户可能有多个 WSL instances/distributions 运行ning,如果你这样做(就像我一样),那么你真的不想要 all 服务来自 all 实例 运行ning 在每次启动时(虽然,更新的答案,Windows 11 现在给了我们这个选项)。

对于 Docker,但是,您是 运行ning Docker Desktop with WSL2 integration,还是直接安装到 WSL2 实例中?对于 Docker 桌面,我昨天 运行 在另一个关于如何在 Windows 启动时启动 Docker 桌面守护程序的问题中

您还可以在用户登录时通过 Windows 任务管理器启动 WSL2 实例,并通过任务管理器中的 wsl -u root service docker start 之类的东西 运行 启动脚本。

请注意,在 Windows boot 似乎不起作用,但是,(仅 login)因为Windows 似乎会在几秒钟后终止任何未绑定到活动用户的 WSL 实例(即使服务在后台 运行ning)。您可以使用 PowerShell Invoke-WmiMethod 解决此问题,例如 ...

powershell.exe Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList 'wsl',虽然我还没有彻底测试过。

这适用于 WSL ubuntu。

之前 服务--状态-所有 [-] ssh

服务 ssh 启动

service --status-all [+] ssh