我是后端开发一枚,之前一直用 Windows + Vagrant + Linux 虚拟机(VirtualBox) 搭配开发环境,一直用的挺好也挺爽;但这种方案有一个问题,就是开发环境(无 Docker )、测试环境( Docker )和生产环境( Docker )不是一致的,代码即使在组内所有开发人员的开发环境中都能正常工作,到了测试环境和生产环境仍可能出问题(我自己就遇到过一两次这种情况),所以开发环境也打算上 Docker 。
不过,前两天做了一些调研,据说 Docker For Windows 比较坑,不论是用 WSL2 backend 还是 Hyper-V backend (两种 backend 好像都是通过在 Hyper-V 虚拟机中跑的 docker ),那替代方案是什么?是 Windows + Vagrant + Linux 虚拟机(VirtualBox) + Docker 么?这个方案原理上好像和 docker-machine 异曲同工,使用上有没有什么坑呢?懂的老哥们帮忙解答一下呗,或者赐教一下更好的方案。
![]() |
1
gzlock 297 天前 ![]() 先用,遇到问题再解决问题
wsl2 + docker 与服务器的 ubuntu+docker 没啥区别 |
![]() |
3
cheng6563 297 天前 ![]() 坑都是 hyper-v 的,反正我是用回虚拟机了,vmware 只快照不关机还是凑合能用的。
开发环境上 docker 是嫌编译不够慢吗 |
![]() |
4
thedrwu 297 天前 via Android
wsl2 自带的 dockerd 就挺好用, 如果是最新的 wsl Ubuntu22.04 需要换成 legacy 的 iptables 。
|
![]() |
6
zx900930 297 天前 ![]() wsl2 + docker 有一个非常恶心的 bug
https://github.com/docker/for-win/issues/12654 你通过 socket 进行 bind mount 的 volume, 在 windows 每次重新启动后, 会变成空的 具体表现为你用 portainer 的 docker compose 创建的容器, 每次 windows 重启后, 都会被初始化, 因为 bind mount 的文件夹是空的. 只能手动 recreate 有问题的文件夹. 如果你不用 socket, 而是直接用 WSL 的命令行创建容器, 就没有问题, 然而这样创建的容器你用 portainer 是灰色的管理不了的. 你要对容器进行任何操作只能连入 WSL 打命令.... |
![]() |
7
zx900930 297 天前
打错字了, 是 recreate 有问题的容器
|
![]() |
9
zx900930 297 天前 ![]() 个人建议, 宿主机 4c8t 或以上, RAM 在 32G 或以上的无脑虚拟机.
比 WSL2 少无数的坑 比如 固定 ip 的问题 网络 bridge 的问题 容器与宿主机应用互通的问题 mount 的问题 你要轻量使用或者是搞开发, 偶尔开着用用, 可以 WSL2 |
![]() |
11
BeautifulSoap 297 天前 ![]() wsl2 做主力开发的表示,最坏的选择就是用了 Docker For Windows(wsl2 backend)之后,把代码等文件放 windows 里挂载到 docker 。会导致各种各样奇奇怪怪的问题
次一点的是把所有文件放 wsl2 里,在 wsl2 中挂载文件到 docker ,然后用 windows 的 IDE 去访问 wsl2 中的文件,虽然这么做 docker 挂载问题不大了,但 wsl2 和 windows 的文件交互性能很差(毕竟通过网络共享的),总体体验一般 最优的解是,把所有文件放 wsl2 里,然后直接在 wsl2 里装 docker ,最后 IDE 也装到 wsl2 里。这是目前为止体验最好的选择。而且因为所有操作都在 wsl2 中完成,有着纯粹的 linux 环境体验 至于怎么在 wsl2 里跑 GUI 程序,windows11 直接用 wsl-g 开箱即用,windows10 的话装个 xserver 就行了 |
![]() |
12
zx900930 297 天前
@BeautifulSoap 其实搞开发 wsl2 无所谓, 坑比较少
坑多的是拿来搞生产. systemd 不能用, 各种基于 sokcet 的操作都有各种 bug, 不说 portainer 这种 webui, 就连 watchtower 这种, 用 socket 升级个镜像, 然后新的镜像生成的容器就有几率出问题( 你在纯 linux+docker 下绝对不会出现这种问题 还有涉及到网络管理方面的 wsl2 的问题更是多到吐, 原因就是 wsl2 的网络实现已经是微软都维护不来的屎山了. 你如果只用 wsl2 来编译调试, 使用一些比较强大的 linux 命令行工具的话, wsl2 还是不错的. |
13
mitu9527 OP @BeautifulSoap 叫我回头研究研究。我之前看到了一种方案,虚拟机配置两个网卡,一个固定 ip ,一个 host-only ,然后 vscode remote 到虚拟机做开发。
|
![]() |
14
Buges 297 天前 via Android ![]() 直接手动开虚拟机装 docker 就行了,不需要 vagrant 。当然最好还是直接 host 系统用 Linux 。
|
15
mitu9527 OP @Buges 个人觉得用 Vagrant 做一些 linux 初始准备工作还是有点用的,也可以快速的把 linux 虚拟机分发给别人,不过用处确实没有之前那么大了。
|
![]() |
16
killva4624 297 天前 ![]() vmware linux docker ,或者 vscode + remote docker daemon 吧,省掉未知的折腾。
|
17
mitu9527 OP @killva4624 嗯,准备用虚拟机中装 docker 。
|
18
leaves98 296 天前
小白请问一下,可以不安装 docker desktop ,直接在 wsl2 里安装 docker engine 吗?两种方式有什么区别呢?
|