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

实在没理解 docker 或 vagrant 是怎么统一 [开发] 环境的

  •  
  •   only0jac · 2017-09-06 23:28:12 +08:00 · 9553 次点击
    这是一个创建于 2636 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网上搜的博客帖子,都说可以解决开发环境统一的问题

    比如,公司新来了个员工,通过 docker 可以很快把他的电脑环境弄成和其他人一样的,不需要再去安装 sdk 之类

    我疑问的是,假如我们是在 windows 下做 python web 开发

    用 docker 的话,我将 python 的安装包和相应的库( flask django 等)打包进 docker,那别人是不是直接使用我这个镜像就可以有和我一样的开发环境?

    他是不是不用再在电脑上装 python 的安装包和相应库了?

    如果不用的话,他用 pycharm 等工具,怎么本地运行这个 web 项目? pycharm 的运行是需要配置 py 的安装路径吧?

    如果后期我又安装了一个库,比如 requests,很小,他是不是又得更新 docker 镜像?

    谢谢大家

    48 条回复    2017-09-08 15:13:34 +08:00
    terry0314
        1
    terry0314  
       2017-09-06 23:37:27 +08:00   ❤️ 1
    JamesPan
        2
    JamesPan  
       2017-09-06 23:43:33 +08:00
    先把编译器什么的放到镜像里,这样子就统一了构建工具链;然后把 Vim/Emacs 放到镜像里,就统一了开发工具链(逃
    songdezu
        3
    songdezu  
       2017-09-06 23:50:44 +08:00
    docker 在 windows 上要虚拟机吧, 占大量内存性能又烂, 新人来了还是老实让他配置和你相同的环境安装依赖包 本机开发吧
    heimeil
        4
    heimeil  
       2017-09-06 23:53:35 +08:00 via Android
    开发的统一靠的是版本管理工具,将 Dockerfile 加入版本管理,所有的系统依赖都在 Dockerfile 中配置,代码肯定要统一,Dockerfile 也就统一了,Docker 镜像也就统一了。
    binux
        5
    binux  
       2017-09-06 23:56:35 +08:00
    从来没有从 IDE 中运行过程序
    only0jac
        6
    only0jac  
    OP
       2017-09-06 23:59:30 +08:00
    @JamesPan 老哥……

    @terry0314 谢谢,这样的话,运行岂不是运行在 docker 里?要更新的话岂不是更麻烦

    @songdezu 目前有这种感觉,win10 不需要虚拟机,只是感觉配置起来的麻烦程度,不如配个开发环境

    @heimeil 开发的统一靠的是版本管理工具???不太理解
    only0jac
        7
    only0jac  
    OP
       2017-09-07 00:00:50 +08:00
    @binux 因为 pycharm 等 ide 工具栏就直接有个运行按钮,多方便,总比自己去控制台下输入 python xxx.py 强吧?
    wenzhoou
        8
    wenzhoou  
       2017-09-07 00:16:32 +08:00 via Android
    同样想知道。😁
    changnet
        9
    changnet  
       2017-09-07 00:44:24 +08:00   ❤️ 1
    你要用 win 并且用 IDE 调试的话,应该不太好整,至少我不会怎么弄。像我们公司做 C++、lua、php 这种开发的,都是用的一个文本编辑器。把 mysql、gcc、g++和一大堆依赖库全扔进 docker,然后把 docker 打包。新人来了,让他装一下 docker 的环境,然后挂载这个 docker 压缩包就可以了,把本机的源代码目录挂载到 docker 里。改了代码,直接在 shell 里编译一下运行,调试也是用的 shell。

    当然,这只是我的私人项目,在公司和家里同步用的。我公司其实没用 docker。
    yuanfnadi
        10
    yuanfnadi  
       2017-09-07 00:55:10 +08:00
    @JamesPan 活捉。催更。都快 2 个月没更新了。(逃
    JamesPan
        11
    JamesPan  
       2017-09-07 01:00:56 +08:00
    @yuanfnadi 在写了在写了,这两天发😂
    JamesPan
        12
    JamesPan  
       2017-09-07 01:07:52 +08:00   ❤️ 2
    @only0jac 别不信。。。vagrant 就是给你一个脚本,让你控制怎么从虚拟机镜像开始一步一步构建出目标环境,然后让你在虚拟机里开发,所谓的 docker 能统一开发环境也是一样,把开发工具都打包到 docker 镜像里,然后把代码挂载到容器里,用镜像里打包好的工具开发
    PythonAnswer
        13
    PythonAnswer  
       2017-09-07 01:19:54 +08:00
    不喜欢在 ide 里跑东西。ide 主要搞搞调试、重构什么的。
    orderc
        14
    orderc  
       2017-09-07 01:55:11 +08:00   ❤️ 1
    在 windows 下做开发,但是在 Linux 下运行程序。
    popbones
        15
    popbones  
       2017-09-07 06:25:26 +08:00   ❤️ 1
    我是这样的,比如我写个 Flask 的 API,用 PyCharm,项目本身的依赖主要是考 venv 来管理,然后项目有 Dockerfile 可以在 Docker 中运行,当然项目所有代码包括 venv 和 Dockerfile 都是由 Git 来管理的。

    开发调试工程中,比如需要用到数据库,缓存等其他系统组件,这些就可以由 Docker 或 Docker-compose 启动相应组件,而不需要安装相应的版本并确认配置到宿主机。

    开发调试完成,测试 Docker 镜像,运行正常,推到 Registery。

    另外你要是实在是想用 PyCharm,但是程序跑在 Docker 里,估计可以挂在本地目录到 Docker 镜像,然后从 PyCharm 远程 attach 到 Docker 中的 Python 进程调试,不过真心何苦呢。
    carlclone
        16
    carlclone  
       2017-09-07 07:11:13 +08:00 via Android
    自己用一遍就知道了。。。不是什么高深的东西
    songjiaxin2008
        17
    songjiaxin2008  
       2017-09-07 07:50:22 +08:00 via iPhone   ❤️ 2
    docker 是用来 scale 的,vagrant 做开发环境更合适。
    only0jac
        18
    only0jac  
    OP
       2017-09-07 08:28:20 +08:00 via Android
    @changnet mysql 之类的我们用测试服务器,那这样的话还不如直接安装个 sdk,在安装库文件,这样更省事

    @JamesPan 这对大工程来说很方便,对个人项目似乎有点杀鸡用牛刀了

    @popbones 感觉项目小的话是不是就没必要这么折腾了
    UnisandK
        19
    UnisandK  
       2017-09-07 08:43:10 +08:00   ❤️ 2
    Pycharm 配置 Python 安装路径的时候不是有 docker 和 vagrant 的支持吗

    7654
        20
    7654  
       2017-09-07 08:51:37 +08:00
    哈哈,我们的系管直接封装了 Win 系统,输入域帐号开箱即用
    PythonAnswer
        21
    PythonAnswer  
       2017-09-07 08:57:55 +08:00 via Android
    开发环境还是 linux 配 docker 爽。
    liuxu
        22
    liuxu  
       2017-09-07 08:57:55 +08:00
    你就把他们想象成打包好的 ghost 系统吧
    JingW
        23
    JingW  
       2017-09-07 09:38:04 +08:00
    是是,Docker 似乎解决的是开发时把整个系统运行起来的问题
    但是 IDE 还是在 windows 里面啊,为了 IDE 正常工作,一定还要再装一套东西在系统里吧?这个问题似乎不是 docker 或者 vagrant 打算解决的?
    only0jac
        24
    only0jac  
    OP
       2017-09-07 10:15:56 +08:00 via Android
    @UnisandK 还能这样……那岂不是直接可以本地运行 docker 中的 py 程序了?多谢

    @7654 系管是系统管理员么……

    @liuxu ghost,那我能把 pycharm 打包进去吗,2333

    @PythonAnswer 本地开发时使用 docker,部署到服务器也需要吗 docker 吗,如果是的话能否不用?毕竟小内存
    7654
        25
    7654  
       2017-09-07 10:19:41 +08:00
    @only0jac #24 就是系统管理员,IT 运维及桌面支持部门
    liuxu
        26
    liuxu  
       2017-09-07 10:30:09 +08:00
    @only0jac
    可以,你要是给系统装了桌面,用 vnc 链接,vagrant 就是 vbox 系统镜像
    PythonAnswer
        27
    PythonAnswer  
       2017-09-07 10:34:21 +08:00
    @only0jac docker 做分发比较好. 你服务器不想跑 docker, 那就只用 vagrant 即可.
    hronro
        28
    hronro  
       2017-09-07 10:47:05 +08:00
    想用 Docker,就别用 windows 做开发了吧,换 mac 或者 Linux。
    fy
        29
    fy  
       2017-09-07 11:13:09 +08:00
    docker 做什么开发环境统一,就不是用来干这个的。
    vagrant 好多了,占用资源也很低
    fy
        30
    fy  
       2017-09-07 11:13:48 +08:00
    然后 mac 下 docker 和 win 貌似一样也是先要跑一个虚拟机好像,2333
    bk201
        31
    bk201  
       2017-09-07 14:09:32 +08:00
    环境都一样了,怎么踩坑成长(雾
    Alex6
        32
    Alex6  
       2017-09-07 15:34:36 +08:00   ❤️ 2
    vagrant 就是跑一个虚拟机起来,开发时首先需要启动这个虚拟机。不过远端和本地可以做目录映射,文件自动同步。本地(例如:windows )代码修改,自动同步到服务器,远端环境( Linux )执行。虚拟机上安装了完整的执行环境。

    docker 容器需要在一个虚拟机(例如 Linux )上安装执行,可以安装各种服务的 docker 镜像,比如 nginx 服务,可以通过端口映射和目录挂载让容器镜像和容器(虚拟机)关联起来。本地(例如:windows )这样可以访问虚拟机 80 端口,实际上是访问的 docker 镜像的 nginx 服务。虚拟机上并没有真的安装 nginx。

    本地开发推荐用 vagrant 吧,毕竟执行环境不会天天变,而且打包为.box 文件,迁移起来也比较方便。docker 还是更好的用于自动化测试,PaaS 服务
    aleung
        33
    aleung  
       2017-09-07 19:29:27 +08:00 via Android   ❤️ 1
    正好刚写了一篇博客,讲我们是怎样基于 docker 创建统一开发环境的。我这儿是用 node.js ,但其他的环境也是可以一样弄的。https://aleung.github.io/blog/2017/09/07/docker-dev-env/
    aleung
        34
    aleung  
       2017-09-07 19:29:59 +08:00 via Android
    only0jac
        35
    only0jac  
    OP
       2017-09-07 20:59:53 +08:00 via Android
    @aleung 感谢,不过有个地方不明白,最后那里

    将源代码 git clone 的本地目录,里面包括了定义 docker 环境的 docker-compose.yml 和定义 node.js 项目的 package.json。

    代码克隆到本地,能通过 docker 中的环境运行?
    param
        36
    param  
       2017-09-08 01:58:43 +08:00 via Android   ❤️ 1
    我去,我给楼主写了一大堆,提交之后不见了。。??
    param
        37
    param  
       2017-09-08 02:01:08 +08:00 via Android   ❤️ 1
    从新开始写。这里很多人忽略了 docker register 的角色,其实实现高效的工作流需要配合 ci 服务器。
    param
        38
    param  
       2017-09-08 02:05:06 +08:00 via Android   ❤️ 1
    多数时候不需要手动执行 docker build 来构建镜像,而是让 ci 服务器来操作。你的项目使用 git 来管理,当你写完代码 git push 到远端后,ci 服务器便会自动对你的版本进行测试、编译等工作,最后让 ci 服务器来执行 docker build 构建出相应版本的 docker 镜像。需要为每个版本构建一个 docker 镜像,之后要部署的时候,爱部署哪个版本就用哪个比较的镜像。
    param
        39
    param  
       2017-09-08 02:09:00 +08:00 via Android   ❤️ 1
    ci 服务器构建出一个镜像之后要 docker push 到 docker register。
    在开发时,如果不想再开发机上安装运行环境,可以直接把项目源码 clone 下来,同时把镜像也 pull 下来,再把源码目录挂载进镜像里面。假如你需要发送 requests 请求,那么你的 requests 这个库安装在 docker 镜像里面,而真正执行发送请求逻辑的项目代码直接放在宿主机上并挂载进 docker 镜像里。pycharm 已经支持直接使用 docker 镜像里的 Python 库。
    param
        40
    param  
       2017-09-08 02:12:07 +08:00 via Android   ❤️ 2
    至于,你往项目里添加了 requests 库后,你的同事是否需要更新镜像?答案是肯定的。当你把 requests 添加到 requirements.txt ,把代码 git push 到远端后,ci 服务器会构建出一个含有 requests 库的 docker 镜像,之后 ci 服务器把这个镜像 docker push 到 docker registry,这时你的同事只需要 docker pull,几秒便可更新完镜像。
    aleung
        41
    aleung  
       2017-09-08 08:54:48 +08:00 via Android   ❤️ 1
    @only0jac 代码目录是 mount 到容器的 volume 里的,在容器里的路径是 /project
    only0jac
        42
    only0jac  
    OP
       2017-09-08 09:12:26 +08:00
    @param 多谢,这么一说 docker 确实效率高,可前提是还要配置好一系列的工作流是吧,没太接触过 ci 服务器,我也很想能 git push 了能自动更细,现在只会自动 check out 源码,得好好学学了,请问下如果个人项目想要搭建一个方便的工作流,比如,我本地 git push 后,除了你说的那些,还能在正式服务器上自动更新到最新版本并重启服务,这种有什么简洁的资料吗?十分感谢!

    @aleung 多谢,明白了:)
    mritd
        43
    mritd  
       2017-09-08 09:57:34 +08:00 via iPhone
    没见过所谓的 docker 统一开发环境的,不知道这种说法从哪出来了,感觉有点逗,docker 主要是用来做微服务的,同时它可以统一测试环境与生产环境,一般用 docker 的上层肯定有编排工具,比如 k8s swarm mesos dcos 啥的,所谓的统一开发环境就别逗了,除非你开发全是 linux,然后全 vim 开发
    mritd
        44
    mritd  
       2017-09-08 10:01:23 +08:00 via iPhone
    还有 docker 在 ci 这一块还不错,譬如 gitlabci 在 build 不同项目的时候可以使用不同的基础镜像,方便切换 build 环境,docker 出现以后,传统交付物从代码或者编译后的 部署文件如 jar 包等变成了 docker 镜像,所有的发布部署都基于镜像,镜像内包含运行环境,从而实现测试生产环境统一
    jhsea3do
        45
    jhsea3do  
       2017-09-08 10:53:46 +08:00
    开发环境好像不能统一的,你用 IDE,他用 VIM,我用 SUBLIME ? 你用 WIN,我用 LINUX,他用 MAC,除非大家都是做 Linux Server 端开发,另外库版本依赖用私服解决。

    DOCKER 主要是加快迭代速度, 让各位高效(累死)的更新。

    以前做一次集成测试的环境部署要开发和运维开会才能做的,现在运维把发布的开关交给开发,整坏了随时重来。
    zhouyou457
        46
    zhouyou457  
       2017-09-08 11:34:21 +08:00
    最多统一一下使用的 IDE 和环境变量,为啥要全部统一,一个新人连个环境都搭不好还开发啥,除非直接上来就要求做东西,不然试用三个月是干啥的,就是让他熟悉环境和开发节奏的啊。。非得像个保姆一样什么都给他准备好了再开发嘛。。这对公司对新人都不好吧,,
    aleung
        47
    aleung  
       2017-09-08 12:46:42 +08:00 via Android
    你们说开发环境不能统一,是你们还没有做到这个程度
    param
        48
    param  
       2017-09-08 15:13:34 +08:00 via Android
    @only0jac docker hub 实际上支持自动 build,它可以监视 GitHub 和 bitbucket,当你提交代码之后可以自动 build 出镜像并发布在 docker hub。如果不喜欢用 docker hub 也可以用第三方的服务或者自己搭建。至于部署,我觉得在生产服务器上还是应该手动部署,测试服务器上可以自动部署。docker hub 支持在 build 出镜像后发出通知到你的服务器上,你的服务器接收到通知就更新镜像就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3587 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:11 · PVG 19:11 · LAX 03:11 · JFK 06:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.