Skip to content

WSL & Docker Desktop

标签
Docker
WSL
字数
1172 字
阅读时间
5 分钟

1 使用原因

  • 众所周知, VMware (VM) 被博通收购后, 取消了永久购买, 购买只有订阅制, (现在面向个人免费)
  • VirtualBox (VB) 在 Windows 上又有各种奇怪的报错问题, 例如 VB
  • 除了 VM/VB 之外, 流行的虚拟化平台还有 KVM (Kernel-based Virtual Machine)/QEMU/Proxmox VE/Hyper-V
    • KVM 是一个 Linux 内核模块,使得 Linux 成为一个虚拟化的 Hypervisor, 可以配合 QEMU 等工具进行使用
    • PVE 是一个基于 Debian 的开源虚拟化平台,它集成了 KVMLXC(轻量级容器)虚拟化,提供了强大的 Web UI 管理虚拟机和容器,非常适合构建虚拟化集群服务器
  • 所以在 Windows 下, 建议使用基于 Hyper-V 的 Windows Subsystem Linux (WSL), 配合 Docker 构建本地开发环境, 更可以通过 Docker Desktop 增强和 IDE 的集成效果. 虽然和其他虚拟机相比配置比较复杂, 但是绝对值得尝试

2 环境配置

2.1 WSL

2.2 Docker Desktop

3 应用场景

3.1 如果只使用 WSL 而不使用 Docker Desktop

  • 部署的时候就需要物理机先 push 到仓库, 然后 WSL 内部再 pull
  • 需要手动进行端口转发或者使用地址回环把虚拟机也变成 localhost, 容易和物理机产生端口冲突 (VSCode/IDEA 等主流 IDE 也有端口转发功能)WSL & Docker Desktop-IMG-20240924095417274
  • 需要安装 Portainer 等面板进行管理

WARNING

对于已经 push 的提交,使用 --hardrebase 修改历史会影响远程仓库的提交记录。具体如下:

  • git reset --hard:如果在本地重置到某个提交并推送(使用 git push --force),远程仓库的历史将会被覆盖,已推送的提交会从历史中消失。

  • git rebase:如果你在本地进行了变基并推送(同样使用 git push --force),远程仓库的历史也会被修改,变基后的新提交将替代原有的提交。

无论哪种情况,强制推送(--force)都会导致远程历史与本地历史不一致,因此在团队协作中使用时要特别小心,确保不会影响其他开发者的工作。

3.2 使用 WSL + Docker Desktop

  • 不需要手动连接 WSL, 通过 IDE 的插件可以使用 GUI 直接对 WSL 中的 docker 进行操作 (也可以通过 SSH 或 TCP 连接, 但是使用体验较差且 TCP 暴露端口有风险)WSL & Docker Desktop-IMG-20240924095102187
  • 由 Docker Desktop 使用 iptables 自动进行端口转发
  • 大部分 docker 的操作都可以直接通过 Desktop 现成的 GUI 进行操作 (部分功能付费, Portainer 有社区版可以免费使用. 各有优势, 自行取舍)WSL & Docker Desktop-IMG-20240924094726086

4 问题处理

4.1 Docker Compose

4.1.1 Win 和 Linux 的路径问题

4.1.1.1 ${PWD}
  • 因为使用 Docker Desktop 是直接把物理机的项目在 WSL 内运行, 挂载的时候可能出现无法读取到目录的问题
  • Dockerfiledocker-compose 文件中的路径都是相对于构建上下文(build context)的相对路径
    • 所以建议 compose 内指定上下文路径的时候使用相对的项目根目录, 同样传输到 Dockerfile 中的也是这个相对路径 WSL & Docker Desktop-IMG-20240920143517175
    • 如果使用挂载目录的方式进行数据持久化, 使用 ${PWD} 表示绝对路径, 因为 compose 不支持卷挂载的相对目录, 所以需要使用绝对路径或环境变量 WSL & Docker Desktop-IMG-20240925124515498

IMPORTANT

${PWD} 是类 Unix 操作系统中的一个环境变量,表示当前工作目录。当在 docker-compose 文件中使用时,它会动态插入执行 docker-compose 命令的目录的绝对路径。 在 Windows 上,${PWD} 在命令提示符 (cmd.exe) 中并不是原生可用的。然而,它可以在类似 Unix 的环境中使用,比如 Git Bash、PowerShell 或 Windows Subsystem for Linux (WSL)。例如,在 PowerShell 中,你可以使用 ${PWD} 来获取当前目录:

sh
$PWD.Path

在 Git Bash 或 WSL 中,${PWD} 的工作方式与类 Unix 系统类似。

4.1.1.2 相对路径
  • 也可以使用相对于 compose 的相对路径,但是本地和远程目录间不能有空格,使用冒号 : 分隔
  • ![[WSL & Docker Desktop-IMG-20241015144614431.png]]