Windows 下使用 Docker 的一个疑问,懂的老哥们帮忙解答一下。

2022-06-06 21:46:29 +08:00
 mitu9527

我是后端开发一枚,之前一直用 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 异曲同工,使用上有没有什么坑呢?懂的老哥们帮忙解答一下呗,或者赐教一下更好的方案。

2212 次点击
所在节点    Docker
27 条回复
gzlock
2022-06-06 21:51:13 +08:00
先用,遇到问题再解决问题
wsl2 + docker 与服务器的 ubuntu+docker 没啥区别
mitu9527
2022-06-06 21:55:48 +08:00
@gzlock 额,我在 V2EX 里逛了好久,看到不少人反馈 Docker For Windows 不好用,觉得在这上面踩一边坑确实不值得,时间宝贵啊。
cheng6563
2022-06-06 21:58:28 +08:00
坑都是 hyper-v 的,反正我是用回虚拟机了,vmware 只快照不关机还是凑合能用的。
开发环境上 docker 是嫌编译不够慢吗
thedrwu
2022-06-06 22:01:10 +08:00
wsl2 自带的 dockerd 就挺好用, 如果是最新的 wsl Ubuntu22.04 需要换成 legacy 的 iptables 。
mitu9527
2022-06-06 22:01:20 +08:00
@cheng6563 主要还是为了追求一致性,不然就不折腾了。
zx900930
2022-06-06 22:20:37 +08:00
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 打命令....
zx900930
2022-06-06 22:21:56 +08:00
打错字了, 是 recreate 有问题的容器
mitu9527
2022-06-06 22:24:29 +08:00
@zx900930 docker 还没入门,看不太懂。就是调研了一番之后,感觉问题太多,才跑过来提问有没有更好的方案,我个人不太想把时间花在折腾这种问题上。
zx900930
2022-06-06 22:27:56 +08:00
个人建议, 宿主机 4c8t 或以上, RAM 在 32G 或以上的无脑虚拟机.
比 WSL2 少无数的坑
比如
固定 ip 的问题
网络 bridge 的问题
容器与宿主机应用互通的问题
mount 的问题

你要轻量使用或者是搞开发, 偶尔开着用用, 可以 WSL2
mitu9527
2022-06-06 22:41:02 +08:00
@zx900930 多谢!我的电脑硬件配置比较高,按照你的建议,虚拟机比较适合我。
BeautifulSoap
2022-06-06 22:47:42 +08:00
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 就行了
zx900930
2022-06-06 23:02:17 +08:00
@BeautifulSoap 其实搞开发 wsl2 无所谓, 坑比较少
坑多的是拿来搞生产.
systemd 不能用, 各种基于 sokcet 的操作都有各种 bug, 不说 portainer 这种 webui, 就连 watchtower 这种, 用 socket 升级个镜像, 然后新的镜像生成的容器就有几率出问题( 你在纯 linux+docker 下绝对不会出现这种问题

还有涉及到网络管理方面的 wsl2 的问题更是多到吐, 原因就是 wsl2 的网络实现已经是微软都维护不来的屎山了.

你如果只用 wsl2 来编译调试, 使用一些比较强大的 linux 命令行工具的话, wsl2 还是不错的.
mitu9527
2022-06-06 23:07:26 +08:00
@BeautifulSoap 叫我回头研究研究。我之前看到了一种方案,虚拟机配置两个网卡,一个固定 ip ,一个 host-only ,然后 vscode remote 到虚拟机做开发。
Buges
2022-06-06 23:50:13 +08:00
直接手动开虚拟机装 docker 就行了,不需要 vagrant 。当然最好还是直接 host 系统用 Linux 。
mitu9527
2022-06-07 07:37:23 +08:00
@Buges 个人觉得用 Vagrant 做一些 linux 初始准备工作还是有点用的,也可以快速的把 linux 虚拟机分发给别人,不过用处确实没有之前那么大了。
killva4624
2022-06-07 10:17:08 +08:00
vmware linux docker ,或者 vscode + remote docker daemon 吧,省掉未知的折腾。
mitu9527
2022-06-07 11:25:59 +08:00
@killva4624 嗯,准备用虚拟机中装 docker 。
leaves98
2022-06-07 13:32:28 +08:00
小白请问一下,可以不安装 docker desktop ,直接在 wsl2 里安装 docker engine 吗?两种方式有什么区别呢?
mitu9527
2022-06-07 15:35:50 +08:00
@leaves98 按照我的了解,原理上它们是一样的。
zx900930
2022-06-07 16:16:04 +08:00
@Buges 我也是这么觉得, host linux, windows 应用可以 wine 也可以虚拟机, 不过除了 exchange server 之类的重依赖 windows 的应用, 其它的大概都能找到 linux 下的平替

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/857686

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX