它非常快,只需要几行 shell 脚本。也不需要在 WSL 2 中运行 systemd。
快速跳转: 演示视频
更喜欢视频?这是YouTube上此提示的录制版本。除了介绍以下步骤外,它还涵盖了“为什么”以及这样做的利弊。
这篇文章介绍了如何在 Ubuntu 20.04 和 22.04 上执行此操作,但它应该适用于任何支持运行 Docker 的发行版。我说“应该”是因为我没有亲自尝试过每个发行版,但没有任何迹象表明它不适用于其他发行版。
你将获得与 Docker Desktop 相同的便利性,例如能够在您选择的 Windows 浏览器中访问您在 Docker 中运行的任何 Web 服务,因为此功能是 WSL 2 的本机功能。卷的速度也快如闪电(可与原生 Linux 相媲美)。localhost
如果选择使用 KinD 或任何其他允许在没有 Docker Desktop 的情况下运行 Kubernetes 群集的工具,则还可以选择直接在 WSL 2 中运行 Kubernetes。
步骤 1:卸载 Docker Desktop
由于我们直接在 WSL 2 中安装 Docker,因此无需安装 Docker Desktop 即可完成此操作。
如果以前安装了 Docker Desktop,则可能还需要删除 Docker 添加到 WSL 2 的一些符号链接。
在我的机器上,它在我的 WSL 2 实例中添加了以下 2 个文件:~/.docker
lrwxrwxrwx 1 nick nick 30 Sep 16 2020 contexts -> /c/Users/Nick/.docker/contexts
lrwxrwxrwx 1 nick nick 35 Aug 21 17:24 features.json -> /c/Users/Nick/.docker/features.json
卸载 Docker Desktop 不会删除这些 Windows 路径,因此从技术上讲,事情仍然可以工作,但如果您稍后删除它们,当您尝试在 WSL 2 中运行大多数 Docker 命令时,您最终会收到错误,因为符号链接没有目标。Docker endpoint for "default" not found
步骤 2:在 WSL 2 中安装 Docker/Docker Compose v2
这是基于 Ubuntu 和 Debian 的发行版的精简版本:
# Install Docker, you can ignore the warning from Docker about using WSL
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add your user to the Docker group
sudo usermod -aG docker $USER
# Sanity check that both tools were installed successfully
docker --version
docker compose version
# Using Ubuntu 22.04 or Debian 10+? You need to do 1 extra step for iptables
# compatibility, you'll want to choose option (1) to use iptables-legacy from
# the prompt that'll come up when running the command below.
#
# You'll likely need to reboot Windows or at least restart WSL after applying
# this, otherwise networking inside of your containers won't work.
sudo update-alternatives --config iptables
如果您使用的是不同的发行版,则非常相似。Docker 提供了上述步骤的文档。这些步骤来自官方 Linux 安装指南:
- https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script
- https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user
- https://docs.docker.com/compose/install/linux/
步骤 3:确保 Docker 服务在 WSL 2 中运行
在撰写本文时,默认情况下,systemd 不会在 WSL 2 中启动。
我们不需要它,但如果你决定使用较新版本的 WSL 2 启用 systemd,则可以跳过整个步骤!
您所要做的就是将其放入 、.zprofile 或等效文件中:~/.profile
if grep -q "microsoft" /proc/version > /dev/null 2>&1; then
if service docker status 2>&1 | grep -q "is not running"; then
wsl.exe --distribution "${WSL_DISTRO_NAME}" --user root \
--exec /usr/sbin/service docker start > /dev/null 2>&1
fi
fi
这里的想法是,如果 Docker 服务尚未运行,它将启动。第一次运行时,它会挂起您的终端几秒钟。但是,即使您下次打开终端时关闭它,它也会立即打开,因为 Docker 已经在运行。关闭终端不会停止 Docker,只有重新启动 Windows 或完全关闭 WSL 才会停止。
您可以运行以查看 Docker 守护程序正在运行:ps aux | grep docker
root 8899 ... /usr/bin/dockerd -p /var/run/docker.pid
root 8908 ... containerd --config /var/run/docker/containerd/containerd.toml --log-level info
打开新终端后,您现在应该能够在没有 .顺便说一句,如果你想更深入地探索使用 Docker 的示例,我在 GitHub 上有一堆开源 Web 应用程序示例。docker run hello-world``sudo
提醒一下,WSL 2 仍然存在磁盘空间和内存未回收的问题。无论有没有 Docker Desktop,这都是一个问题。这篇文章介绍了如何控制内存和磁盘空间。
此外,如果您来自 Docker Desktop,并且想要调查磁盘上的映像和卷,则可以在 .您需要成为 root 用户。这是 Docker 在 Linux 上保存文件的默认位置。cd /var/lib/docker
演示视频
时间 戳
- 0:22 – 通过此设置,一切都运行顺利
- 0:53 – 为什么我最终从 Docker Desktop 切换
- 3:18 – 切换与 Docker 桌面许可证成本无关
- 3:56 – 为什么您可能希望继续使用 Docker 桌面
- 6:01 – 如果需要,您仍然可以在本地运行 Kubernetes 集群
- 7:09 – 遵循 Docker Linux 安装指南
- 8:25 – 将 WSL 2 用户添加到 Docker 组以在不使用 sudo 的情况下运行 Docker
- 9:44 – 使用 Docker 插件安装 Docker Compose v2
- 10:44 – 现在我们需要在 WSL 2 中运行 Docker 服务
- 11:19 – 一小段 shell 脚本以确保 Docker 启动
- 15:43 – 如何在 WSL 2 中运行 Docker?
你像这样运行Docker吗?请在下面的评论中告诉我!