开始前使用wsl -l -v检测下自己的WSL版本确保是WSL2

本内容适合Ubuntu子系统,其他系统请参阅此教程

配置系统

# 替换国内源
sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list

# 切换旧版防火墙 选择 iptables-legacy
sudo update-alternatives --config iptables

# 配置DNSd
echo -e "[network]\ngenerateResolvConf = false\n" | sudo tee -a /etc/wsl.conf

# 启用systemctl,但是目前支持并不完善,可跳过这条
# echo -e "[boot]\nsystemd = true\n" | sudo tee -a /etc/wsl.conf

sudo unlink /etc/resolv.conf && echo 'nameserver 223.5.5.5' | sudo tee /etc/resolv.conf

# 设置时区
sudo rm /etc/localtime && sudo ln /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 设置sudo免密码
sudo vim /etc/sudoer
# 在%sudo ALL=(ALL:ALL) ALL 下面添加如下内容,将ubuntu改为你的用户名
# ubuntu ALL=(ALL) NOPASSWD:ALL
# 保存时使用 wq! 否则报错E45

# 更新系统
sudo apt update && sudo apt upgrade -y

重启wsl子系统

打开PowerShell,运行wsl --shutdown,然后再打开ubuntu终端

安装Docker

# 设置OS环境变量
. /etc/os-release

# 添加docker官方源
curl -fsSL https://download.docker.com/linux/${ID}/gpg | sudo tee /etc/apt/trusted.gpg.d/docker.asc
echo "deb [arch=amd64] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update

# 安装依赖
sudo apt install --no-install-recommends apt-transport-https ca-certificates curl gnupg2

# 安装docker
sudo apt install docker-ce docker-ce-cli containerd.io

# 添加当前用户至docker组
sudo usermod -aG docker $USER

# 修改镜像为国内源(可选)
  # 实测 阿里云的源是最快的
  # 需要登陆获取:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker && echo '{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn/"
  ]
}' | sudo tee /etc/docker/daemon.json

# 启动守护进程
sudo dockerd

另外打开一个ubuntu终端

# 测试docker
docker run --rm hello-world

# 输出以下内容恭喜你安装成功
# Unable to find image 'hello-world:latest' locally
# latest: Pulling from library/hello-world
# 2db29710123e: Pull complete
# Digest: sha256:faa03e786c97f07ef34423fccceeec2398ec8a5759259f94d99078f264e9d7af
# Status: Downloaded newer image for hello-world:latest

# Hello from Docker!
# ...

开机自启

创建自启动脚本,将以下内容写入/etc/rc.local

#!/bin/sh

# 在此输入开机运行的命令
mkdir /var/log/docker
nohup dockerd < /dev/null > /var/log/docker/dockerd.log 2>&1 &

给脚本可执行权限

sudo chmod 755 /etc/rc.local

以下内容在Win10的Powshell终端中运行

# 查看你的子系统ID,记住这个子系统ID
wsl -l -q
# Ubuntu-xx.xx

创建脚本,行为是开机自启动wsl与运行命令

将下面 Ubuntu-xx.xx 改成你使用的子系统ID

echo 'set object = createobject("wscript.shell")
object.run "wsl.exe --distribution Ubuntu-xx.xx --user root sudo /etc/rc.local", 0' > $HOME/run_wsl2_at_startup.vbs

方法1:放入自启动文件夹

在终端中输入以下内容

mv $HOME/run_wsl2_at_startup.vbs "$Env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup"

方法2:任务计划程序

Windows徽标键,搜索任务计划程序,点操作创建基本任务

名称:WSL自动启动和运行命令
下一步
选择 计算机启动时
下一步
下一步
程序或脚本:%USERPROFILE%\run_wsl2_at_startup.vbs
下一步
选中 当单机“完成”时,打开此任务属性的对话框。
完成
常规-安全选项
选中 不管用户是否登录都要运行
选中 使用最高权限运行

触发器-触发器
双击 启动时
选中 延迟任务时间
选择 30秒
确定 输入用户密码
确定

至此,我们用WLS实现了原生的基于Linux内核的Docker容器,和开机自启动功能!

随终端运行

如果你不想要开机运行,而希望在打开 WSL 终端后自动运行 Docker,你需要在你的 shell 启动文件中添加启动 Docker 的命令。这个文件可能是 .bashrc.zshrc,或者 .profile,这取决于你使用的 shell。下面是如何在 .bashrc 文件中添加 Docker 的启动命令:

  1. 打开终端。
  2. 使用你喜欢的文本编辑器打开 .bashrc 文件。如果你使用的是 vim,你可以输入 vim ~/.bashrc
  3. 在文件的末尾,添加这样的命令:service docker start。这会在每次你打开新的终端窗口时启动 Docker 服务。
  4. 保存并关闭文件。
  5. 为了使更改立即生效,你可以运行 source ~/.bashrc。或者,你可以关闭并重新打开你的终端窗口。

请注意,如果你需要使用 sudo 来启动 Docker(即 sudo service docker start),你需要确保在不输入密码的情况下可以运行此命令。你可以通过在 sudoers 文件中添加一行来实现这一点,这样就可以在没有密码的情况下运行 service docker start。你可以使用 sudo visudo 打开 sudoers 文件,然后添加这样的一行:

yourusername ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service docker start

yourusername 替换为你的用户名。然后保存并关闭 sudoers 文件。现在,即使在 .bashrc 文件中使用 sudo service docker start,你也不会被提示输入密码。

参考链接

  1. https://dev.to/bowmanjd/install-docker-on-windows-wsl-without-docker-desktop-34m9

  2. https://learn.microsoft.com/en-us/windows/wsl/wsl-config#systemd-support

  3. https://medium.com/swlh/how-to-run-ubuntu-in-wsl2-at-startup-on-windows-10-c4567d6c48f1