V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
rogwan
V2EX  ›  Python

Python Web 项目(如 django, flask)有必要上 Docker 吗?感觉 virtualenv 的环境隔离已经够用了啊

  •  1
     
  •   rogwan · 2016-11-04 07:52:59 +08:00 · 8256 次点击
    这是一个创建于 2976 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Docker 的主要优势是能让开发环境和生产环境保持一致,部署时也能方便扩容。

    Python Web 项目,用 virtualenv 来隔离一个独立的环境,在 mac , linux , win 三种开发环境下,也都能隔离出一个通用的开发环境和依赖库文件。在部署生产机也用相同的 virtualenv 环境,包括扩容,也很干净方便。

    现在都是用的云主机,实际上是在硬件上虚拟的计算环境,再在这个虚拟的环境中,再用 docker 虚拟一个开发环境,来开发和部署 Python web 项目,有必要吗?比 virtualenv 环境优势在哪儿?

    21 条回复    2016-11-09 10:55:09 +08:00
    kanezeng
        1
    kanezeng  
       2016-11-04 08:15:24 +08:00
    刚开始用 Python 做项目不知道我对 virtualenv 的理解对不对。 VirutalEnv 你要先有服务器,然后在上面配好虚拟的环境,然后再部署自己的程序,对么?
    docker 的话,写好 dockerfile 之后,这些是可以自动的,所以你需要自动化环境的时候就很方便,比如临时需要自动增加减少服务器的实例之类的
    KKKKKK
        2
    KKKKKK  
       2016-11-04 08:29:07 +08:00 via Android
    virtualenv 只是用来隔离 Python 版本,做不到其他的隔离。
    pc10201
        3
    pc10201  
       2016-11-04 09:18:56 +08:00
    virtualenv 做到包隔离, pyenv 能做 python 版本隔离, docker 的隔离性更好,但是有一些 openvz 的 vps 不支持
    tolerance
        4
    tolerance  
       2016-11-04 09:23:27 +08:00
    一个项目用 python2.7,另一个用 python3.5
    smartdie
        5
    smartdie  
       2016-11-04 09:24:12 +08:00
    建议了解一下持续交付之类运维的知识,如果放在开发上, docker 确实好处不明显。
    wyntergreg
        6
    wyntergreg  
       2016-11-04 09:31:34 +08:00
    Docker 的主要优势是能让开发环境和生产环境保持一致,部署时也能方便扩容。

    这是虚拟环境的主要优势,不是 docker 的优势

    docker 的优势比这多多了

    不然为什么有虚拟机还要用 docker ?
    deadEgg
        7
    deadEgg  
       2016-11-04 09:44:41 +08:00
    “ Docker 的主要优势是能让开发环境和生产环境保持一致”

    这句话理解起来有偏差。

    Docker 的主要优势的是让 生产环境和理想生产环境一致。

    简单理解可以是同一个虚拟环境,所以方便大规模部署,比如分布式。

    这仅仅是交付上的,如果有大规模计算的话存在 docker 的编排系统会更好地对多容器的策略管理

    回答楼主问题

    1. 现在都是用的云主机,实际上是在硬件上虚拟的计算环境,再在这个虚拟的环境中,再用 docker 虚拟一个开发环境,来开发和部署 Python web 项目,有必要吗

    如果同一个程序需要部署 1000 台主机,假如这 1000 台主机是同时有硬件和软件差异的, docker 可以提供一致性的条件

    2. 比 virtualenv 环境优势在哪儿

    假设这样一个场景,如果同一个程序需要部署 1000 台主机,假如这 1000 台主机是同时有硬件和软件差异的,你的 python 程序对系统软件有需求(比如需求特定操作系统依赖) ,那你需要对 1000 台都去 cherk 这个依赖的正确性。

    再假设这样一个场景,如果你的环境被黑了, docker 也可以提供一个更安全的环境。
    janxin
        8
    janxin  
       2016-11-04 09:48:37 +08:00
    @deadEgg 实际上安全作用很小,这个是另外一个话题

    其实 Virtualenv 比较麻烦的一个点在于如果需要 C/C++依赖时这个就很麻烦了,就像 @deadEgg 提到的那样,对运维带来的收益比开发大得多。
    rogwan
        9
    rogwan  
    OP
       2016-11-04 10:21:03 +08:00
    @deadEgg 从两个角度分开去看, Docker 优势又都不怎么突出了啊:
    1 、关于开发环境和生产环境的一致性:用 venv 也可以解决“我本机上跑通了的啊,怎么线上挂了”的问题 。
    2 、云主机的部署和运维:也不需要每台机器装系统&配置环境,直接镜像部署就可以,也比较方便的。
    9hills
        10
    9hills  
       2016-11-04 10:48:11 +08:00
    python-lxml 等一票 c/c++依赖表示 virtualenv 只能说是很一般的隔离。。。
    phithon
        11
    phithon  
       2016-11-04 11:30:58 +08:00
    @rogwan
    一看你就没装过 pillow 、 python-lxml 、 psycopg2 。昨天还有人跟我反馈他在 centos 上死也装不好 psycopg2 。
    楼上说得对~
    timothyqiu
        12
    timothyqiu  
       2016-11-04 11:34:22 +08:00
    virtualenv 只是用来隔离不同工程所需的不同的依赖的。
    deadEgg
        13
    deadEgg  
       2016-11-04 12:21:25 +08:00
    @rogwan

    1. 11 楼回复正解
    2. 镜像部署相比 docker 有缺点,缺点在于分布式的粒度没有 docker 小, docker 他的实现不是基于虚拟化而是基于 chroot 、 namespace 、 cgourp 这些存在于本机内核的环境隔离(所以很轻量),比如说一台物理机你跑虚拟化的资源肯定比不上 docker 的资源占用小。
    rogwan
        14
    rogwan  
    OP
       2016-11-04 12:39:00 +08:00
    @deadEgg 你说到要点上了,我知道差别啦,赞
    qweweretrt515
        15
    qweweretrt515  
       2016-11-04 12:45:37 +08:00
    docker 是一个文本文件,里面写好了命令,在服务器执行一下,然后你就去喝咖啡, 你的项目会自动部署好

    你用 pyv 还要自己一个命令一个命令的弄半天

    这就是差距
    lightening
        16
    lightening  
       2016-11-04 17:57:18 +08:00
    没什么必须的。适合自己的就是最好的。

    Docker 的优势是一个用一个 Dockerfile 可以方便的 scale 出任意台一样的主机。

    缺点是你需要付出额外的成本来进行配置。每个 container 要做成 stateless 的,数据库要用外置。如果你的项目很小,这个是额外的麻烦。

    多台主机部署和运维可以用 Ansible 啊。也不一定要 Docker 。
    param
        17
    param  
       2016-11-04 17:58:08 +08:00 via Android
    用 docker 的好处,难道不是在 PostgreSQL 、 Redis 、 elastic search 这些组件上吗?全都 docker 化了。
    param
        18
    param  
       2016-11-04 17:59:44 +08:00 via Android
    我在尝试用 docker-compose 部署 Django 项目
    poke707
        19
    poke707  
       2016-11-04 18:04:02 +08:00
    部署时好处比较明显,因为内部的复杂度都被容器屏蔽了。

    除非出于好奇或学习的目的,在使用这个或那个系统时是不需要关心内部的。

    但对于足够简单的项目,不用容器也复杂不了多少。
    janxin
        20
    janxin  
       2016-11-04 18:07:46 +08:00 via iPhone
    @poke707 在集群上做容器编排简直就是小公司噩梦…
    crossmaya
        21
    crossmaya  
       2016-11-09 10:55:09 +08:00
    docker 的好处不是环境统一,组件隔离吗!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2537 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:26 · PVG 19:26 · LAX 03:26 · JFK 06:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.