关于wsl2 安装docker后无法启动的问题

本文介绍了解决WSL中使用service启动服务失败,涉及iptables错误的解决方案。通过替换iptables为iptables-legacy,开启IPv4转发,并重启WSL以修复服务启动问题。

wsl中是不能用systemctl来进行启动服务的,只能用service
但是service启动失败
看了下日志

time="2022-07-27T21:23:46.131907580+08:00" level=info msg="stopping healthcheck following graceful shutdown" module=libcontainerd
failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain:  (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables):  RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1
 (exit status 4))

说的是iptables的问题,这个之前在github中提到过#1105
解决方法如下:
首先将iptables用iptables-legacy替换

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

然后,开启ipv4的包转发功能

sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf

最后在powershell中重启wsl

wsl --shutdown

这样再打开wsl之后就能顺利启动了

<think> 根据用户查询和之前的对话历史,用户现在明确要解决“WSL2Docker守护进程无法启动”的问题。结合引用内容,我们需要整合解决方案。以下是关键步骤: 1. **问题根源分析**(根据引用[1][2][4]): - WSL2的Ubuntu默认没有`systemd`,因此不能使用`systemctl`管理服务(见引用[4]的报错示例)。 - 通过`apt install docker-ce`安装Docker可能依赖`systemd`,导致无法启动(引用[2])。 - 官方推荐使用`get-docker.sh`脚本安装(引用[2])或Docker Desktop for Windows(引用[2][5])。 2. **解决方案**: - **方法1:使用官方脚本重装Docker(推荐)** 引用[2]提到`get-docker.sh`会以非systemd方式安装: ```bash curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh ``` 安装启动命令为: ```bash sudo service docker start # 使用sysvinit方式启动 ``` - **方法2:修复iptables配置(引用[1])** 若已安装启动失败(报错`Cannot connect to the Docker daemon`),需更新iptables: ```bash sudo update-alternatives --set iptables /usr/sbin/iptables-legacy sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy sudo service docker start ``` - **方法3:通过Docker Desktop管理(引用[2][5])** 直接安装Docker Desktop for Windows并启用WSL2集成: - 安装后打开Docker Desktop设置 → General → 勾选"Use the WSL 2 based engine"。 - 在Resources → WSL Integration中启用对应Ubuntu分发。 3. **验证与自启动配置**: - **验证运行**(引用[3][4]): ```bash docker run hello-world ``` - **设置自启动**(引用[1][5]): WSL2不支持`systemd`,需借助第三方工具(如`genie`)或Windows计划任务触发: ```bash # 在Ubuntu中创建启动脚本 echo "sudo service docker start" >> ~/.bashrc ``` 或使用开源工具如[wsl-systed](https://github.com/nullpo-head/wsl-distrod)(引用[5])。 4. **权限问题处理**(引用[4]): - 避免每次使用`sudo`,将用户加入docker组: ```bash sudo usermod -aG docker $USER newgrp docker # 立即生效 ``` ### 总结步骤 1. 优先尝试**重装Docker**(官方脚本)或修复**iptables**。 2. 考虑使用**Docker Desktop**简化管理。 3. 配置**自启动**和**用户权限**。 §§相关问题§§ 1. WSL2中如何配置Docker开机自启动2. Docker Desktop和WSL2集成的具体步骤是什么? 3. 如何解决`iptables`相关错误导致Docker启动失败? 4. 为什么WSL2不支持`systemd`?有哪些替代方案? [^1]: wsl2安装docker问题汇总及设置随系统自启动。解析:这个说明docker没有正常启动,这个原因主要是wsl2造成的,所以直接使用命令sudo service docker start是无法成功启动docker服务的,这里需要更新iptables的相关配置(具体为什么这样做我不太懂,只知道确实有效),具体可参考这里:解决WSL2的ubuntu20.04中安装docker出现无法连接的问题(Cannot connect to the Docker daemon)_wsl2安装ubuntu的docker不行-优快云博客 [^2]: docker wsl2启动不了_win10利用WSL2安装docker2种方式。注意:不同于完全linux虚拟机方式,WLS2下通过apt install docker-ce命令安装docker无法启动,因为WSL2方式的ubuntu里面没有systemd。上述官方get-docker.sh安装dockerdockerd进程是用ubuntu传统的init方式而非systemd启动的。3.2 Docker Desktop for windows方式 [^3]: WSL2配置docker。 3.设置wsl 2的Ubuntu访问docker root@afeicomputer:~# docker -v Command 'docker' not found, but can be installed with: apt install docker.io root@afeicomputer:~# [^4]: 解决 Docker 无法连接守护进程的问题。以下是一些常用的启动和管理 Docker 守护进程的代码示例: # 启动 Docker 守护进程 sudo systemctl start docker # 重启 Docker 守护进程 sudo systemctl restart docker # 停止 Docker 守护进程 sudo systemctl stop docker # 查看 Docker 守护进程状态 sudo systemctl status docker # 将用户添加到 docker 组 sudo usermod -aG docker $USER 最佳实践 定期检查 Docker 守护进程状态:使用 systemctl status docker 或 service docker status 命令定期检查 Docker 守护进程的运行状态,确保其正常工作。合理配置 Docker 权限:避免使用 sudo 执行所有 Docker 命令,将用户添加到 docker 组,提高使用便利性。备份重要配置文件:如 /etc/docker/daemon.json,在进行配置更改前备份,以防配置错误导致 Docker 无法正常工作。 常见问题 1. systemctl start docker 报错 System has not been booted with systemd as init system (PID 1). Can't operate. [^5]: 探索高效开发的新境界:WSL2 系统守护进程自动启动工具。在这个快速发展的技术世界里,高效的跨平台开发环境成为了开发者们的必需品。WSL2(Windows Subsystem for Linux 2)无疑是微软为开发者提供的一个强大的工具,它允许我们在Windows系统上无缝运行Linux环境。现在,有一款开源项目将WSL2的体验提升到了新的高度——通过自动启动系统守护进程,让WSL2更加贴近完整的Linux体验。 项目简介 </think>### 解决WSL2Docker守护进程无法启动的方法 根据引用内容,WSL2环境下Docker无法启动的核心原因是**缺少systemd支持**和**iptables配置问题**(引用[1][2][4])。以下是分步解决方案: --- #### 方法1:修复iptables配置(推荐优先尝试) 1. **更新iptables配置** ```bash sudo update-alternatives --set iptables /usr/sbin/iptables-legacy sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy ``` 2. **手动启动Docker服务** ```bash sudo service docker start # 使用sysvinit方式启动(引用[1]) ``` --- #### 方法2:重新安装Docker(适合首次安装失败) 1. **卸载现有Docker** ```bash sudo apt remove docker.io docker-ce sudo rm -rf /var/lib/docker ``` 2. **通过官方脚本安装** ```bash curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 自动适配WSL2的init方式(引用[2]) ``` --- #### 方法3:使用Docker Desktop集成(最稳定方案) 1. **安装Docker Desktop for Windows** - 从[官网](https://www.docker.com/products/docker-desktop)下载安装包 - 安装时勾选 **"Enable WSL 2 Windows Features"**(引用[2]) 2. **启用WSL2后端** - 打开Docker Desktop → Settings → General → 勾选 **"Use the WSL 2 based engine"** - 在 **Resources → WSL Integration** 中启用你的Ubuntu分发(引用[5]) --- #### 权限问题处理(所有方法通用) ```bash sudo usermod -aG docker $USER # 将当前用户加入docker组(引用[4]) exec newgrp docker # 立即生效 ``` --- #### 验证是否成功 ```bash docker run --rm hello-world # 成功则显示Hello消息 ``` 输出应包含: `Hello from Docker! This message shows your installation appears to be working correctly.` --- ### 关键说明 1. **避免使用systemctl命令** WSL2不支持systemd,执行`sudo systemctl start docker`会报错: `System has not been booted with systemd...`(引用[4]) 2. **自启动配置** 在`~/.bashrc`末尾添加: ```bash if service docker status 2>&1 | grep -q "is not running"; then sudo service docker start >/dev/null 2>&1 fi ``` 或在Windows计划任务中创建开机启动任务(引用[5]) > **故障排查提示**:若仍失败,检查`/var/log/docker.log`中的错误日志,常见问题是缺少`cgroup`支持或内核版本过低(需WSL2内核≥4.19)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值