当前位置: 首页 > 知识库问答 >
问题:

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

云煌
2023-03-14

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

根据如何修复docker'Cannot connect to the Docker daemon at unix:///var/run/docker.sock.docker daemon正在运行吗?'在Ubuntu上,我可以在启动时使用

sudo systemctl enable docker

而不是每次开机时用

sudo systemctl start docker

这两个命令都避免了“无法连接到unix:///var/run/docker.sock.docker守护进程正在运行吗?".

当使用这两者中的任何一种时,我会

同步docker.service与SysV服务脚本的状态 /lib/systemd/systemd-sysv-install.执行: /lib/systemd/systemd-sysv-install启用docker

并且测试运行显示,该docker尚未运行:

docker run hello-world 

docker:无法连接到unix:///var/run/docker.sock.docker守护进程正在运行吗?。请参阅“docker run--help”。

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

系统尚未以systemd作为初始系统(PID 1)启动。无法操作。未能连接到总线:主机已关闭“

这让我修复了“系统未使用systemd作为init System启动”错误:

原因:您的Linux系统没有使用systemd如何知道您使用的是哪个init系统?您可以使用此命令了解与PID 1(系统上运行的第一个进程)相关联的进程名称:

ps -p 1 -o comm=

它应该在输出中显示systemd或sysv(或类似的东西)。

ps-p 1-o通信=给了我初始化。

根据这个和这个表

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,这是有效的。但是我找不到“sysvinit”的“systemd”的sudo systemctl启用docker之类的东西。我希望它是这样的:

sudo service docker enable

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

虽然sudo service docker start的工作方式类似于sudo systemctl start docker,但没有使用“使能”的命令。目前,每当我启动WSL2时,我都需要运行sudo service docker start

问题是:

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

共有2个答案

萧琛
2023-03-14

这适用于WSL ubuntu。

服务前——状态全部[-]ssh

服务ssh启动

服务--状态所有[]ssh

包嘉懿
2023-03-14

简短回答“在WSL2上打开Ubuntu时,自动启动docker的解决方法是什么?

>

  • 选项1:在Windows 11上,向wsl中的“引导”部分添加必要的命令。形态:

    [boot]
    command="service docker start"
    

    选项2:在Windows 10上,在用户启动脚本中运行必要的命令(例如. profile)。通过检查查看服务是否首先运行,例如:

    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更改默认发行版

    选项3:(旧答案,在这里为子孙后代):visudo或向/etc/sudoers添加规则。d要允许用户在没有密码的情况下运行命令,请执行以下操作:

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

    然后编辑您的<代码>。要添加的配置文件:

    sudo service docker status || sudo service docker start
    

    正如您所发现的,WSL不包括任何systemd支持,也不真正支持在引导时启动服务。

    对于初学者来说,WSL子系统不会在Windows启动时启动,而是仅在用户启动登录会话时启动。因此,如果没有任何真正的“系统启动”,init. d或systemd启动就没有太大意义。

    此外,用户可能有多个WSL实例/发行版正在运行,如果您正在这样做(就像我一样),那么您真的不希望所有实例的所有服务都在每次启动时运行(尽管更新后的答案是,Windows 11现在给了我们这个选项)。

    不过,对于Docker来说,您是在运行具有WSL2集成的Docker Desktop,还是直接安装到WSL2实例中?对于Docker Desktop,我昨天在另一个问题中遇到了这个问题,关于如何在Windows引导下启动Docker Desktop守护进程。

    您还可以在用户登录时通过Windows任务管理器启动WSL2实例,并通过任务管理器中的类似wsl-u根服务docker start的内容运行脚本。

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

    powershell。exe Invoke WmiMethod-Class Win32\u Process-Name Create-ArgumentList“wsl”,尽管我还没有彻底测试过这一切。

  •  类似资料:
    • 问题内容: 我想在Ubuntu启动时运行一个命令(在任何人登录之前): 我该怎么做? 问题答案: 您可以在启动结束时执行的脚本中添加命令。 在之前编写命令。之后写的任何内容都将永远不会执行。

    • 问题内容: 我有一种情况,我需要运行 一个 从窗户经常Linux shell命令(用不同的文件名)。我正在使用PuTTY和WinSCP来执行此操作(需要登录名和密码)。该文件通过WinSCP复制到linux机器中的预定义文件夹,然后从PuTTY运行命令。有没有一种方法可以使我通过程序自动执行此操作。理想情况下,我想从Windows右键单击该文件,然后发出命令,该命令会将文件复制到远程计算机,并以文

    • 问题内容: 我准备了一个docker-compose文件来部署带有数据库的容器: 没关系。但是现在我需要创建一个数据库并建立其结构。我需要执行一些sql命令。为了检查我是否能够做到这一点,我将其添加到服务中: 但是我遇到以下错误: 我感觉命令是在Sql Server实例启动之前执行的。我该如何解决?Sql Server启动后如何执行一些sql? 问题答案: 问题是在容器中仅执行一个命令。当您在其中

    • 问题内容: 我想知道是否有一种方法可以像使用bash的.bash_profile或.profile脚本那样在进入python shell时自动运行命令。我想自动导入一些模块,这样我每次跳入shell时都不必键入整个shebang。 谢谢, 问题答案: 是的,你可以使用环境变量来做到这一点所概述这里

    • 首发动物园管理员 动物园管理员起床了 开始Kafka 运行Kafka的解决方案是什么?