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

话说用 docker 当环境进行开发咋样?

  •  1
     
  •   Flands · 2020-04-11 00:14:55 +08:00 · 9216 次点击
    这是一个创建于 370 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在对比 mac 和 win 的优劣势(本帖不讨论),然后看到这个帖子

    https://www.v2ex.com/t/660818?p=2

    刚好这两天捣鼓 docker,现在感觉用搞个 image 当开发环境也可以啊。
    vscode 依旧打开宿主机的项目目录,然后在 container 里跑。
    项目成员的环境也能一致,不知道运行效率如何。

    78 条回复    2020-07-06 07:03:01 +08:00
    hoyixi
        1
    hoyixi   2020-04-11 00:17:08 +08:00
    这话说的,“用手机打打电话也可以啊”,可不是就是打电话的吗
    ostrichb
        2
    ostrichb   2020-04-11 00:17:30 +08:00 via Android
    毕竟是一个容器,效能总会有折扣。
    如果是 Linux 系统的话不会太明显。但是如果要在 Windows 里面运行的话,因为是虚拟机,所以说性能折扣会更大。
    WispZhan
        3
    WispZhan   2020-04-11 00:19:59 +08:00
    你要是个 Linux,我没话说。 一个 mac 一个 win,2 个 Docker 都是基于虚拟机这有什么好说的呢。
    Flands
        4
    Flands   2020-04-11 00:22:35 +08:00
    @ostrichb 那就 WSL2+docker =。=
    Flands
        5
    Flands   2020-04-11 00:30:20 +08:00
    @WispZhan 损失 20%以内的话能接受吧,搞 3700x 级别的 U 的话体验上应该没太大差距。
    来源 > https://www.reddit.com/r/docker/comments/7xvlye/docker_for_macwindows_performances_vs_linux/
    lululau
        6
    lululau   2020-04-11 00:32:44 +08:00
    说实话,真的搞不懂做 Java 开发的或者用其他语言做 Web 开发的为什么那么多钟情于把开发环境放在容器里。。。。。。
    Flands
        7
    Flands   2020-04-11 00:35:19 +08:00
    @lululau 因为环境配置麻烦啊,前端的 node-sass 没梯子的就要设置一堆东西,容器可以统一环境
    littlewing
        8
    littlewing   2020-04-11 00:37:27 +08:00
    win 和 mac 的 docker 都是开个虚拟机然后装上 linux,在 linux 上跑 docker
    jhdxr
        9
    jhdxr   2020-04-11 00:38:05 +08:00
    @lululau 看场景。举个例子,某些项目无法确定用户的环境到底怎样的,那么 docker 在中间做这么一层,可以规避掉不少坑。
    nvkou
        10
    nvkou   2020-04-11 00:47:17 +08:00 via Android   ❤️ 2
    性能不用考虑。你是开发,不是测试。
    脚本型语言比较适用,如 lamp 一把梭。Python
    编译型语言就算了吧。
    RRRSSS
        11
    RRRSSS   2020-04-11 04:54:52 +08:00
    可以,docker 当开发环境,那你代码怎么办,用 volume 映射么?不过我寻思至于么,你有这么多项目要用不同环境么?

    一般都是开发完了,上线的时候写个 Dockerfile 扔上去。
    ericgui
        12
    ericgui   2020-04-11 07:13:39 +08:00
    nodejs 啊,php 等,还是要本地安装的

    但是呢,mysql 啊,redis 等各种其他的,就可以用 docker 了

    这是我目前的使用模式
    lizheming
        13
    lizheming   2020-04-11 07:22:00 +08:00 via iPhone
    我们就是这么弄得呢,开发依赖打包到镜像,统一所有同学的依赖版本较少项目初始化的时间。
    cszchen
        14
    cszchen   2020-04-11 07:38:28 +08:00 via Android
    在 win 和 mac 下,磁盘读写很慢
    cszchen
        15
    cszchen   2020-04-11 07:39:41 +08:00 via Android
    补充一下,是在开发环境下,把项目目录映射到容器的情况下运行很慢。
    beginor
        16
    beginor   2020-04-11 07:47:19 +08:00 via Android
    尝试过, 确实会减少配置的时间, 统一配置,统一管理也是挺好的。

    但是只限于 Linux,Windows 和 Mac 用 docker 文件系统性能差,npm 和 git 问题挺, 最终放弃。
    lhx2008
        17
    lhx2008   2020-04-11 07:51:11 +08:00 via Android
    sql redis mongo 消息队列这些“环境”楼主怎么处理呢?
    wangxiaoaer
        18
    wangxiaoaer   2020-04-11 08:17:52 +08:00 via Android
    @jhdxr 这是部署的问题,只要最终应用容器化就行,不需要开发环境用容器。
    AlphaTr
        19
    AlphaTr   2020-04-11 08:28:09 +08:00 via iPhone   ❤️ 1
    就是这么干的,mysql 、nginx 、redis 等这类环境都是通过 docker 来做的;宿主机保持干净,开发环境重建也比较快
    pomelotea2009
        20
    pomelotea2009   2020-04-11 09:15:17 +08:00 via Android
    @AlphaTr 这三样我都是使用 zip 免安装包,还原或者重装系统后,几个指令就可以配好
    locoz
        21
    locoz   2020-04-11 09:19:18 +08:00 via Android
    当然可以啊,我以前 Windows 下开发的时候就是用的 docker 。
    先把环境用 docker file 配好,然后直接用 ide 的远程同步(或者直接整个目录映射进去)和调试功能进行开发,体验就是和 linux 上差不多。
    然后如果公司有测试环境之类的东西也是 docker 的话,直接改改 docker file 扔过去就能跑了,很方便。
    locoz
        22
    locoz   2020-04-11 09:20:29 +08:00 via Android
    运行效率其实还好,没啥明显的感觉,就是内存吃得多。
    MengiNo
        23
    MengiNo   2020-04-11 09:21:23 +08:00 via iPhone
    好奇怪 看到有几层楼说 本地使用自己环境 上线容器化。开发测试都没用过的环境就敢直接上线么... docker 最初不就是一为方便重装换机 多版本,二位不同开发者机器环境及线上线下问题。怎么开发反而都不用,仅仅线上使用,那有啥意义……
    anyc007
        24
    anyc007   2020-04-11 09:35:50 +08:00
    可以的啊,我先就是这样做的,很方便
    yannxia
        25
    yannxia   2020-04-11 09:48:36 +08:00
    @MengiNo 开发自测用,开发阶段不用。
    linvaux
        26
    linvaux   2020-04-11 09:48:58 +08:00
    个人没这习惯,而且感觉这种做法有点吃力不讨好
    Chingim
        27
    Chingim   2020-04-11 09:57:57 +08:00 via Android
    @Flands nodesass 为啥要配置一堆东西,项目里放一份.npmrc 就行了
    celeron533
        28
    celeron533   2020-04-11 10:03:56 +08:00
    如果你的项目有多个历史版本需要维护或者你反复横跳于多个项目组,而且各个项目都有不可调和的互斥依赖关系(如老版本在 java6,新版本在 java9 ),那么可以考虑容器实现。
    不然的话还是建议相对固定的本地开发环境比较好
    caola
        29
    caola   2020-04-11 10:04:48 +08:00
    现在用 WSL2 已经非常的爽了
    xuanbg
        30
    xuanbg   2020-04-11 10:09:11 +08:00
    用 docker 搞开发环境,真是天才的思路!!!

    像我这样愚笨的人,就只会用 docker 部署开发中的项目用来自测……
    jin7
        31
    jin7   2020-04-11 10:10:44 +08:00
    别问 实际体验再说 发现更麻烦自然会放弃 反正我是放弃了
    rockyou12
        32
    rockyou12   2020-04-11 10:14:29 +08:00
    @MengiNo 光是容器化后能上 k8s 就很有意义了,而且你们没有线上的测试环境嘛……不可能开发完,本地测完就直接部署到生产吧
    xdays
        33
    xdays   2020-04-11 10:41:04 +08:00
    我发现,多数开发在尝试用 docker 来跑开发环境最后都放弃了,因为你除了像以前一样安装开发环境所需要的依赖(构建 image 的时候),还得学会怎么用 docker, docker-compose,而这些东西如果你公司的生产环境没有用或者用了作为开发平常也接触不到生产环境,那用 docker 就是增加了额外的学习成本。所以说,这取决于开发对的 devops 的理解,如果有这种意识的话,那这个学习成本给整个开发部署的过程会带来很大的好处。

    回到你说的效率问题,win 我不清楚,docker for mac 依然存在性能问题,尤其是频繁改动文件的时候,系统 cpu 使用率极高,风扇狂转。
    rrfeng
        34
    rrfeng   2020-04-11 10:52:34 +08:00 via Android
    vs code docker remote 了解一下
    nvkou
        35
    nvkou   2020-04-11 10:59:23 +08:00 via Android
    @xdays 不是啊。一个人搞懂了就好了啊。docker file 一分发就行了。或者导出为文件,工友导入就是了。规则是自己定义的。而且构建 image 是容器里面的依赖,和宿主机无关。
    ljpCN
        36
    ljpCN   2020-04-11 11:06:20 +08:00 via Android
    大家都在说用 docker 做开发环境的合理性。我问个另外的问题:你打开宿主机的项目文件夹,那 vscode 识别到的是宿主机的开发环境,那代码提示什么的怎么办?(比如这是一个 Python 但你宿主机没装 Python 或者版本不一样)
    Symo
        37
    Symo   2020-04-11 11:28:16 +08:00
    @ljpCN 如果是 vscode 就更简单了, 直接使用 vscode remote for container
    fuis
        38
    fuis   2020-04-11 11:57:14 +08:00
    关于容器的运行效率,docker 当然是要在 Linux 下面跑。在 macOS 和 Windows 的 docker 都是虚拟机,有什么意义了。
    MengiNo
        39
    MengiNo   2020-04-11 12:03:31 +08:00
    @rockyou12 我个人是 docker 跑全程的,本地开发一个项目就是 用 vscode remote container 做一个镜像 然后在容器内部开发测试,提交后 ci/cd 也是用 drone 跑完最后做成一个镜像提交到 image repo 。 我感觉这样才是完整保证环境一致 即纵向每个步骤环境一致 横向每个开发人员环境一致。 不过的确现实情况下没有一个同事愿意搞这么一套 都是提交 dev 后把任务丢给测试 23333 。。。 只是我个人觉得 ci/cd 只能帮你发现测试用例的逻辑问题, 至于这个镜像怎么样 好像并没有什么好的方式,不过容器都是基于标准 base 制作的不太会出问题,可能是我多虑了。
    esw
        40
    esw   2020-04-11 13:30:56 +08:00
    我经常这样搞,因为平常做网络相关开发,经常需要搭建一些特定 topo 的模拟环境,不过环境一般放在服务器上,代码在本地写,然后用 fswatch + rsync 自动同步到服务器上,这样下来本地和服务器都不会因为文件 io 造成性能损失,体验非常好
    yuikns
        41
    yuikns   2020-04-11 13:47:02 +08:00
    @ljpCN 如果单纯说 python 。可以使用容器内部的 python 环境作为 python env 的。这个 python extension 是支持的
    hantsy
        42
    hantsy   2020-04-11 13:49:09 +08:00
    一般都是 Devops 准备,做到开发部署环境一致。

    代码编辑一般本地环境没有什么太大的问题。运行的时候,有的环境可以跑 Docker 也很方便,开发的依赖环境全部可以跑 Docker,比如 MySQL,Nigix 等。最终项目提供 Dockerfile,也在 CI 上 Build Docker Image, Push 到 Docker registry 。 在生产环境上完全使用 Docker 部署,做到一致性。
    drackzy
        43
    drackzy   2020-04-11 13:52:19 +08:00
    linux 下开发, 生产部署有问题才会本地起 docker 看下
    walker2laok
        44
    walker2laok   2020-04-11 13:56:28 +08:00
    那是相当于的疏忽,用了让人爱不释手!最近正好搭建 ROS 环境,折腾了两天也没成,最后在 hub.docker.com 上翻到了镜像,个把小时搞定环境.
    vicnicLight007
        45
    vicnicLight007   2020-04-11 13:59:37 +08:00 via iPhone
    @ericgui 本地 PHP 和动物 mysql 怎么搞一起?我现在是 php 也是容器
    ljpCN
        46
    ljpCN   2020-04-11 16:38:15 +08:00 via Android
    @yuikns 学到了
    dangyuluo
        47
    dangyuluo   2020-04-11 16:52:31 +08:00
    我们公司的开发环境完全是在 Docker 下的,用一个 wrapper 启动和停止,简直不要太好用!
    wweir
        48
    wweir   2020-04-11 18:21:51 +08:00
    完全可以,不过很多自定义的东西,光靠 dockerfile 很难定制出来,还是虚机才好使
    所以我选择每年花点小钱买个云虚机,然后开发环境走到哪里都是一致的
    nekochyan
        49
    nekochyan   2020-04-11 18:28:50 +08:00
    我们公司服务器好像就是,不过听后端老是抱怨调试 bug 非常麻烦。。。
    takashiki
        50
    takashiki   2020-04-11 19:39:57 +08:00
    现在 wsl2 backend 的 docker 确实非常舒服了
    tairan2006
        51
    tairan2006   2020-04-11 22:28:31 +08:00
    我记得以前不都是用 vagrant 搭建开发环境么。。
    ericgui
        52
    ericgui   2020-04-12 00:12:35 +08:00
    @vicnicLight007 你就 run 一个 mysql 的 container,然后就 localhost:3306 连接即可啊
    yeqizhang
        53
    yeqizhang   2020-04-12 03:00:39 +08:00 via Android
    为啥我理解的环境开发,和开发环境不一样呢……
    使用某个环境开发,不是就是在这个环境下写代码的意思?
    开发环境不是项目开发人员一起部署自测的一个环境吗,类比测试环境……
    imycc
        54
    imycc   2020-04-12 06:41:54 +08:00
    win10+linux (本地虚拟机)+docker (跑在 linux 上)
    开发时候用 vim/vscode 写代码,环境配置都在 linux 上,代码挂载到容器里


    做 web 前后端开发跟一些简单的运维工作,从 15 年开始都是这么用的。
    工作配置的台式机 i7+16G,不做压力测试的话,跑 web 应用完全足够。

    好处嘛,就是方便管理环境,之前负责的项目包括六七个小服务,三个人在开发,不用 docker 的话很难统一大家的开发环境,外包 QA 要运行你的环境也很麻烦。
    踩过的坑是容器内的软件版本比线上的新,线上的版本是固定的,而容器在构建的时候有时候会重新装包,有一次 php 小版本升了一点,在编码问题上表现不一致,新功能上线之后没有效果,两个人查了半天。。
    imycc
        55
    imycc   2020-04-12 06:45:18 +08:00
    说起来现在本地开发很少自己配置服务了,dockerhub 上找个合适的镜像,略微调一下配置就可以用。
    A 项目的 mysql 跟 B 项目的 mysql 分开跑不同容器,开发哪个项目就起哪个,不用担心搞乱。

    最多的时候自己经手了四个项目(都是内部平台),一个个配置环境真的要死
    swulling
        56
    swulling   2020-04-12 09:36:45 +08:00 via iPhone
    vscode remote for docker 了解下
    falcon05
        57
    falcon05   2020-04-12 09:51:29 +08:00 via iPhone
    这玩意在 win 和 mac 搞开发都很别扭,一方面是性能,甚至比 vagrant 虚拟机还耗资源,另一方面很多操作跟用原生 docker 还不一样,甚至做不来,除非开发环境本身就是用 Linux 。
    sagaxu
        58
    sagaxu   2020-04-12 10:04:35 +08:00 via Android
    上 docker 不是为了大规模容器编排吗?开发环境上不上都行,如果从干净系统开始,半个小时你都搭不好,你可能需要 docker 。我搭开发环境,取决于下载 IDE 的时间,其它都是 apt install 搞定。
    aleung
        59
    aleung   2020-04-12 10:05:34 +08:00 via Android
    在我们团队里已经用了几年了。以 nodejs 后端开发为主,但其他技术栈同理。见我以前写的 blog: https://aleung.github.io/blog/2017/09/07/docker-dev-env/
    cheng6563
        60
    cheng6563   2020-04-12 10:11:02 +08:00 via Android
    @lululau 还有就是懒得搞 systemd 做服务,用个容器挂载程序包启动当服务用了
    NeinChn
        61
    NeinChn   2020-04-12 13:50:39 +08:00
    @lululau
    蛤蛤蛤,不带你这么黑的
    搞 Java 开发的应该大部分都不用 Docker 做开发环境,毕竟 OSX 本地能跑何苦跑在远程开发机 /Docker 上
    把 Docker 做开发机最开心的那一批不都是 C++/Python(尤其是依赖了只支持 linux so 的那种)/Go 的么
    pangliang
        62
    pangliang   2020-04-12 20:29:31 +08:00
    对"开发环境" 怎么定义?
    开发的时候写代码的"地方"? 开发的时候运行代码的"地方"?
    那确实没必要; 本机就能跑

    但是仅仅是代码能运行, 项目就能运行了么?
    比如 mysql, kafka, redis 怎么办? 搞台低配服务器?远程连慢了点吧?
    公司找一台机器装好大家都用? 貌似可以哦, 不错哦
    但是是不是还需要考虑考虑如何满足开发者"离线"或者"在家办公"需求?

    维护一个 docker-compose, 利大于弊
    NeinChn
        63
    NeinChn   2020-04-12 21:14:08 +08:00
    @pangliang
    稍微规模大一点的公司
    如果需要多人协作共同开发,都是有公共的 dev 环境支持的,不需要自己用 docker 装什么基础组件 MySQL/Redis/Kafka
    都会用 VPN 连接内网再开发的,公网直连就是作死
    docker-compose 几乎没什么用.
    唯一需要自己安装的就是自己项目的 debug 运行环境,所以开发环境才可能需要 docker.大规模部署也可以 docker
    只是几个人的小项目就不说了,喜欢怎么玩怎么玩...
    pangliang
        64
    pangliang   2020-04-12 22:34:00 +08:00
    @NeinChn
    vpn 连内网的, 恭喜你进入的都是好公司, 不需要居民楼做办公室的创业公司的网络状况
    sxfscool
        65
    sxfscool   2020-04-13 08:55:07 +08:00
    之前有试过,volume 挂载的文件更新慢,就是 docker 里编辑保存了,在宿主机看还是没变化,重启 docker 后才会变,这一点比较烦,自己比较菜也不知道是为什么
    God365
        66
    God365   2020-04-13 10:36:47 +08:00
    @pangliang
    vpn 连内网的, 恭喜你进入的都是好公司, 不需要居民楼做办公室的创业公司的网络状况 +1
    JingW
        67
    JingW   2020-04-13 13:42:00 +08:00
    docker 里面跑 vscode 的话,UI 怎么出来呢?我记得 X11 出来的速度是非常慢的,尤其是 vscode 这种基于 electron 的东西
    julyclyde
        68
    julyclyde   2020-04-13 20:24:46 +08:00
    把短生命周期的容器,当作长生命周期的虚拟机来用
    是一种常见错误
    Flands
        69
    Flands   2020-04-13 23:53:33 +08:00
    @RRRSSS 感觉很多环境是通用的,一个容器里可以运行几个项目

    @ericgui nodejs 不用,vscode 从目录下找 modules 里的包。其他的语言还没试过,主要是让编辑器能从容器内找环境就行
    @cszchen @beginor 在一块固态硬盘上测试结果
    [email protected]:/data/code/fio-master# time dd if=/dev/zero of=/testw.dbf bs=4k count=100000 oflag=direct
    100000+0 records in
    100000+0 records out
    409600000 bytes (410 MB, 391 MiB) copied, 14.6767 s, 27.9 MB/s

    [email protected]:/data/code/fio-master# dd if=/dev/zero of=./largefile bs=1M count=1024
    1024+0 records in
    1024+0 records out
    1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.56453 s, 193 MB/s

    [email protected]:/data/code/fio-master# dd if=./largefile of=/dev/null bs=4k
    262144+0 records in
    262144+0 records out
    1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.0241 s, 214 MB/s


    AS SSD 测试,大概数据
    连续读写 500/200
    4K 25/55


    @lhx2008 服务直接搭啊

    @locoz @MengiNo @esw @aleung 类似 Golang 这种咋识别包呢?外部的那种,纠结这个问题,用 jetbrains 的软件

    @caola @takashiki WSL2 + docker ?为啥不直接用 docker 啊?多一层 wsl 有啥好处嘛?

    @xdays 你需要升级配置,9750H 以上吧。。

    @JingW vscode 运行在宿主机,代码映射到容器内

    @julyclyde 无状态容器解决环境问题,如果环境需要变更则修改 dockerfile
    takashiki
        70
    takashiki   2020-04-14 10:20:51 +08:00
    @Flands #69 windows 上的 docker 之前是通过虚拟机实现的,现在通过 wsl 基本就是原生,是少了一层
    Flands
        71
    Flands   2020-04-14 11:04:37 +08:00
    @takashiki wsl 实现也是 Hyper-V,docker 一样是这个啊,应该差不多吧。
    takashiki
        72
    takashiki   2020-04-14 11:28:18 +08:00
    @Flands #71 查了下 wsl2 确实是基于 Hyper-V 架构,个人感觉比原本的 docker 好用的点在于:
    1. 直接使用 wsl 资源,得益于 wsl 的动态资源申请策略,可以直接使用整台机器的全部资源
    2. 直接使用 wsl 文件系统,不用 VHD 以及配置驱动器共享之类的
    3. wsl2 目前的使用体验十分接近原生,基于 wsl2 的 docker 使用感觉就和在 linux 系统上基本一致,启动速度比原先基于 Hyper-V 快很多
    locoz
        73
    locoz   2020-04-14 18:34:22 +08:00
    @Flands #69
    “类似 Golang 这种咋识别包呢?外部的那种,纠结这个问题,用 jetbrains 的软件”
    不清楚,我现在没用 Windows 做开发机了,之前 Python 是可以通过设置 Pycharm 远程调试的方式读取到 Docker 中的 Python 解释器的,Goland 应该也可以。
    RRRSSS
        74
    RRRSSS   2020-04-14 18:56:35 +08:00
    @Flands 那你可以这么搞,Docker 启动容器只做环境,代码用 volume 映射进去。这样的话,脚本语言还行,编译语言怎么弄,我还不清楚。
    beginor
        75
    beginor   2020-04-14 19:46:12 +08:00 via Android
    @Flands docker 在 Linux 系统上太大没什么问题, 但是在 Mac 和 Win 上需要依赖虚拟化,CPU 和磁盘性能会打折扣。

    尤其是在使用卷映射时,磁盘 IO 是个大问题,dd 连续读写和实际使用不同, 运行 `npm ci` `webpack build --prod` `ng build --prod` 这些大量小文件读写时的性能是远远不如原生平台
    leohxj
        76
    leohxj   290 天前
    完了,连环境都搞不定了。
    dioxide
        77
    dioxide   284 天前
    @beginor 这是 docker 和 mac 两者在设计上的特点造成的组合使用的硬伤么? 还是说 docker 的的 mac 版本在不断迭代改进,只是目前不稳定?
    beginor
        78
    beginor   284 天前 via Android
    这个只能说是设计上的问题。

    docker 在 Mac 上是虚拟机,使用 NFS 挂载本地卷,性能肯定不如原生磁盘

    如果以后 Mac 上也有原生 docker 的话,我想得有点儿多了, 这也不是不可能
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1113 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:16 · PVG 07:16 · LAX 16:16 · JFK 19:16
    ♥ Do have faith in what you're doing.