适用于 Linux 的 Windows 子系统 (WSL) 2 是由 Microsoft 构建的完整 Linux 内核,它允许 Linux 发行版在不管理虚拟机的情况下运行。通过在 WSL 2 上运行 Docker Desktop,用户可以利用 Linux 工作区并避免同时维护 Linux 和 Windows 生成脚本。此外,WSL 2 还改进了文件系统共享和启动时间。
Docker Desktop 使用 WSL 2 中的动态内存分配功能来改善资源消耗。这意味着 Docker Desktop 仅使用所需的 CPU 和内存资源量,同时允许 CPU 和内存密集型任务(如构建容器)运行得更快。
此外,使用 WSL 2,在冷启动后启动 Docker 守护程序所需的时间要快得多。
1. 先决条件
在打开 Docker 桌面 WSL 2 功能之前,请确保具有:
- 至少为 WSL 版本 1.1.3.0.,但理想情况下是最新版本的 WSL,以避免 Docker Desktop 无法按预期工作。
- 认识了适用于 Windows 的 Docker 桌面系统要求.
- 在 Windows 上安装了 WSL 2 功能。有关详细说明,请参阅Microsoft 文档.
提示
为了获得更好的 WSL 体验,请考虑启用 WSLautoMemory回收自 WSL 1.3.10(实验性)起可用的设置。
此功能增强了 Windows 主机在 WSL 虚拟机中回收未使用内存的能力,从而确保提高其他主机应用程序的内存可用性。此功能对 Docker Desktop 特别有用,因为它可以防止 WSL VM 在 Docker 容器映像生成期间在 Linux 内核的页面缓存中保留大量内存(以 GB 为单位),而不会在 VM 中不再需要时将其释放回主机。
2. 打开 Docker 桌面 WSL 2
重要
若要避免在 Docker Desktop 上使用 WSL 2 时出现任何潜在冲突,必须在安装 Docker Desktop 之前卸载直接通过 Linux 发行版安装的任何以前版本的 Docker 引擎和 CLI。
- 下载并安装最新版本的适用于 Windows 的 Docker Desktop.
- 按照通常的安装说明安装 Docker Desktop。根据你使用的 Windows 版本,Docker Desktop 可能会在安装过程中提示你打开 WSL 2。阅读屏幕上显示的信息,然后打开 WSL 2 功能以继续。
- 从 Windows的“开始”菜单启动 Docker Desktop。
- 导航到 Settings。
- 在 General 选项卡中,选择 Expose daemon on tcp://localhost:2375 without TLS,暴露 2375 端口
- 在 General 选项卡中,选择 Use the WSL 2 based engine 。如果已在支持 WSL 2 的系统上安装了 Docker Desktop,则默认情况下会打开此选项。
- 选择 Apply & Restart。
现在,docker
命令可以使用新的 WSL 2 引擎在 Windows 上工作。
3. 在 WSL 2 发行版中启用 Docker 支持
WSL 2 向 Windows 添加了对“Linux 发行版”的支持,其中每个发行版的行为都类似于 VM,但它们都运行在单个共享 Linux 内核之上。
Docker Desktop 不需要安装任何特定的 Linux 发行版。docker
CLI 和 UI 都可以在 Windows 上正常工作,无需任何其他 Linux 发行版。但是,为了获得最佳的开发人员体验,我们建议至少安装一个额外的发行版并启用 Docker 支持:
- 确保分发在 WSL 2 模式下运行。WSL 可以在 v1 或 v2 模式下运行分发。若要检查 WSL 模式,请运行:
wsl.exe -l -v
- 要将 Linux 发行版升级到 v2,请运行:
wsl.exe --set-version (distro name) 2
- 若要将 v2 设置为将来安装的默认版本,请运行:
wsl.exe --set-default-version 2
- Docker Desktop 启动后,转到 Settings > Resources > WSL Integration。
- Docker-WSL 集成在默认 WSL 分发上启用,即Ubuntu的.若要更改默认 WSL 发行版,请运行:
wsl --set-default <distro name>
- Docker-WSL 集成在默认 WSL 分发上启用,即Ubuntu的.若要更改默认 WSL 发行版,请运行:
- 选择 Apply & Restart。
注意
Docker Desktop 安装两个专用的内部 Linux 发行版和 .第一个 (
docker-desktop
) 用于运行 Docker 引擎 (docker-desktop
),而第二个 (docker-desktop-data
) 用于存储容器和映像。两者都不能用于一般开发。
原文链接:Docker Desktop WSL 2 backend on Windows | Docker Docs
4. 在 WSL 2 中安装和配置 Docker 客户端
打开你的 WSL 2 终端(比如 Ubuntu)。
你不需要安装 Docker 引擎,因为它已在 Windows 上运行。但你可能需要安装 Docker 客户端以便于在 WSL 2 终端中管理容器。
安装 Docker 客户端的命令通常为 sudo apt install docker-ce-cli。
如果已经安装了引擎,则先卸载所有,再重新安装客户端
先查询安装了哪些
1 2 3 4 5 |
dpkg -l | grep -i docker ii docker-compose 1.29.2-1 all define and run multi-container Docker applications with YAML ii docker.io 24.0.5-0ubuntu1~22.04.1 amd64 Linux container runtime ii python3-docker 5.0.3-1 all Python 3 wrapper to access docker.io's control socket ii python3-dockerpty 0.4.1-2 all Pseudo-tty handler for docker Python client (Python 3.x) |
卸载
1 2 |
sudo apt-get purge docker.io docker-compose sudo apt-get purge python3-docker python3-dockerpty |
重新安装 docker-ce-cli
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
sudo apt-get update sudo apt-get upgreade sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce-cli |
为了让 Docker 客户端在 WSL 2 中与 Windows 的 Docker Desktop 通信,你需要确保 WSL 2 可以通过环境变量 DOCKER_HOST 访问 Docker 引擎。通常这是自动配置的,但如果需要,你可以手动添加 export DOCKER_HOST=tcp://localhost:2375 到你的 ~/.bashrc 或相应的 shell 配置文件中。
1 |
export DOCKER_HOST=tcp://localhost:2375 |
5. 验证安装
在 WSL 2 终端里,运行 docker run hello-world。这应该能够运行并显示一条消息,证明 Docker 客户端能够通过 Docker Desktop on Windows 控制 Docker 容器。
1 |
docker run hello-world |
如果没有启动Widnows 下的 Docker Desktop,则会显示:
1 2 3 |
docker run hello-world docker: Get "http://localhost:2375/_ping": dial tcp 127.0.0.1:2375: i/o timeout. See 'docker run --help'. |
如果运行成功,就会显示如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world c1ec31eb5944: Pull complete Digest: sha256:a26bff933ddc26d5cdf7faa98b4ae1e3ec20c4985e6f87ac0973052224d24302 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ |
查看 Windows Desktop Containers 下面会有 hello-world 的镜像