V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wanmyj
V2EX  ›  程序员

怎么实现把所有依赖都通过 docker image 加载,为不同的开发提供依赖基础

  •  
  •   wanmyj · 2023-05-14 18:35:14 +08:00 · 2494 次点击
    这是一个创建于 566 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这里引用一段 @masquerader 的在其他帖子里的回复

    我有 1 台 MBP ,1 台 8 代 U+8G RAM 轻薄 Windows 10 ,1 台 11 代 U+16G RAM 的轻薄 Windows 10 ,办公室 1 台 Windows 10 笔记本,此外还有 1 台装了 Linux 的机器。我的做法就是利用 Remote Development Container ,把项目的各种依赖弄到 Docker image 里,这样我随便拿起一台电脑就开始我的项目,无论电脑的配置有多渣( 8G 内存),无论电脑是不是装了.NET ,或者有些包对环境有依赖(我的项目的一个依赖包不提供 macOS 版本的原生库),或者是新买一台电脑,装上 VSCode 零设置就可以开始撸码。
    

    这个听起来非常 appealing and exciting ,但是 docker 在我之前使用更像是个应用部署工具,对 docker 部署开发环境理解尚浅。之前看一些文档时候,看到过有的开发会把 python ,git 等等一系列开发工具都装在 docker 里,我没想到 Remote Development Container 这一层,所以当时没有特别在意,只是闪过一个念头:他们为什么要这么做?现在看起来这个方式确实是提升开发效率和复用性非常有帮助的。所以开贴向老鸟学个艺,也互相交流。

    比如我现在需要做两个开发工作,在两台电脑 /服务器上。
    一个是 vue+express 的,用 pnpm 去下载package.json里有一堆 dependencies ,完成开发后,docker 打包部署;
    另一个是.Net 6 的开发,在 Windows 平台下安装 sdk ,用 msbuild.exe 去编译。

    我可以每个开发目录里新建一个 dockerfile ,把所有的依赖都通过 FROM 的方式加载进对应的开发 image 中,然而,我理解的是,这是我所说的“完成开发后,docker 打包部署”的部分,而不完全等同我想表的的在 docker 里开发,比如我想在容器内改代码,使用 git 提交代码,或者使用 python 运行测试脚本,这些工作我都是在容器外完成的,显然这不是 Remote Development Container ,最多只是 Remote Development 。

    抛砖引玉,多多指教

    18 条回复    2023-05-15 12:23:31 +08:00
    yinmin
        1
    yinmin  
       2023-05-14 18:52:06 +08:00   ❤️ 1
    Docker 做一个包含 ssh 及依赖库的 image ,然后从这个 image 生成容器,开发目录使用 volume 永久化到物理机上。
    VSCode 使用 SSH Remote 访问这个容器进行开发。

    举一个 python 的例子:
    1. 你选用一个官方的 python debian 镜像,加入 ssh 功能,然后生成自己的 image 。
    2. 从这个 image 生成容器,开发目录通过 volume 将开发目录永久化到物理机上。
    3. VSCode SSH Remote 连接这个容器,然后在开发目录里创建 python 虚拟环境。
    4. 然后欢快的开发。

    好处:
    1. 开发环境和运行环境都是用同一个 python 官方镜像,不会出现 windows 上开发 OK ,部署成 Docker 出问题的情况。
    2. 每个项目都是独立的 docker 容器,相互不干扰。
    3. 迁移方便,只要复制开发目录,重建容器即可。

    VSCode 好像除了 SSH Remote 还有一种直接操作本地 docker 容器的方法,这个没仔细研究过。
    wanmyj
        2
    wanmyj  
    OP
       2023-05-14 18:59:52 +08:00
    开发目录使用 volume 永久化到物理机上 --> 学到了

    PS: 第三步里的 VSCode SSH Remote 连接这个容器,这里说的是 remote 到这个 volume 对应的目录吧?还能直接 remote 到 image 里吗?
    yinmin
        3
    yinmin  
       2023-05-14 19:02:09 +08:00   ❤️ 1
    还有一种场景,一个团队 10 个人,考虑所有人都采用 ssh remote 开发的方式,开发环境集中到服务器上。

    方式一:在服务器上建 10 个虚拟机,1 人 1 个虚拟机 remote 开发,虚拟机比较重,占内存、磁盘空间都比较大;
    方式二:在服务器上建 10 个 docker 容器,1 人 1 个容器 remote 开发,占用资源比较小。

    方案二占优,某个同事开发环境搞坏了,recreate 容器即可;开发环境统一升级也方便,recreate 容器即可;备份也方便,将 10 个人的开发目录备份即可。
    yinmin
        4
    yinmin  
       2023-05-14 19:02:43 +08:00   ❤️ 1
    @wanmyj 不是的。remote 到容器的 ssh 端口。
    wanmyj
        5
    wanmyj  
    OP
       2023-05-14 19:13:41 +08:00 via iPhone
    @yinmin remote 到容器的 ssh👍

    一般来说,docker 应用类的 container 内生成的数据尽量和 image 隔离,但是开发环境下的 container 是不是允许修改 image 内容? 就像你说的第二种方案,每个人一个自己的 image ,并且这个 image 有自己独立的 volume 。那小明要提交更新的代码,必然会改变 volume 内容,其他人同步小明的提交,也会修改自己的 volume ,可以这么理解吗?
    yinmin
        6
    yinmin  
       2023-05-14 19:26:11 +08:00
    @wanmyj 基本就是这个意思。只是:
    1. 所有人使用的 image 是同一个,各自有自己的容器,各自的 volume 文件。git 也是同步各自的 volume 文件。
    2. remote ssh 开发,pc 上的 vscode 是直接修改容器里的代码文件(已 volume 到物理机),debug 时代码运行是跑在容器里的。
    wanmyj
        7
    wanmyj  
    OP
       2023-05-14 19:53:35 +08:00 via iPhone
    @yinmin 感谢大佬!
    0o0O0o0O0o
        8
    0o0O0o0O0o  
       2023-05-14 22:58:56 +08:00   ❤️ 2
    devcontainer 不正是你要的吗?

    - 有 spec https://containers.dev/implementors/spec/
    - 金主微软
    - vscode 极佳地支持
    - 有生态 https://containers.dev/collections
    - 有 codespace 所以也支持远程
    - 它的这个名为 features 的 feature (微软起名正常发挥)可以像叠积木一样配置环境 https://code.visualstudio.com/docs/devcontainers/containers#_dev-container-features
    darksword21
        9
    darksword21  
       2023-05-14 23:14:58 +08:00
    直接 nix 不行?
    dayeye2006199
        10
    dayeye2006199  
       2023-05-14 23:50:09 +08:00 via Android
    Nix vagrant 这类代码定义环境了解一下
    IvanLi127
        11
    IvanLi127  
       2023-05-15 00:56:46 +08:00 via Android
    8 楼说的开发容器应该就是 op 想要的、成熟的方案。
    woncode
        12
    woncode  
       2023-05-15 00:59:11 +08:00 via Android
    所有人的开发环境共用一个服务器,这样性能够用吗,或者说服务的配置得多高才能撑得住啊?
    TabGre
        13
    TabGre  
       2023-05-15 07:41:19 +08:00 via iPhone
    有个问题请教,试用远程机器容器开发,比如前端需要访问对应的页面 除了类似 tailscale 这样的方式,还有更简单的吗?
    hlwjia
        14
    hlwjia  
       2023-05-15 09:43:33 +08:00
    @0o0O0o0O0o 正解

    顺便:
    &list=PLj6YeMhvp2S5G_X6ZyMc8gfXPMFPg3O31
    yinmin
        15
    yinmin  
       2023-05-15 10:12:55 +08:00 via iPhone   ❤️ 1
    @0o0O0o0O0o 如果是本地的 docker desktop ,应该是 dev containers 方便。如果是远程服务器上的容器,微软建议 ssh remote 到远程物理机,然后用 dev containers 连远程 docker ,其实不如直接 ssh remote 连容器,本质是一样的,如果多人开发,ssh remote 连容器更安全。

    @woncode 如果开发 python flask 或者 node.js ,3-5 人 8 核 16 线程 32GB 内存,6-10 人 16 核 32 线程 64GB 内存,docker 里限制容器最多 4 个 cpu 4GB 内存。不适合 java 太重了。
    yinmin
        16
    yinmin  
       2023-05-15 10:23:34 +08:00 via iPhone
    我们做过一个内部测试,当时是直接把 vscode 的 code server 放容器里跑 flask ,直接浏览器访问容器里的 vscode server 进行开发。8 核 16 线程 cpu ,64GB 内存,每个容器限 2 个 cpu1GB 内存,同时开启了 80 个容器能一起跑 flask 开发,速度还凑合可用。

    使用 ssh remote 比 vscode server 轻很多,效果更好
    yinmin
        17
    yinmin  
       2023-05-15 11:38:38 +08:00 via iPhone   ❤️ 1
    @TabGre

    1. vscode 使用 ssh remote 会自动将服务器端口映射到 127.0.0.1 本地,浏览器直接访问即可;
    2. ssh 把服务器端口映射到 127.0.0.1 ;
    3. 做一个 nginx 反代,如果映射到公网,可以在 nginx 里配置认证。
    fllow
        18
    fllow  
       2023-05-15 12:23:31 +08:00 via iPhone
    GitHub 有一个 vscode 的插件,远程 web 访问本地 ssh 还不用开端口,安全又方便。推荐一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2756 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:38 · PVG 20:38 · LAX 04:38 · JFK 07:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.