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

2016-11-04 07:52:59 +08:00
 rogwan

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

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

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

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

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

docker 的优势比这多多了

不然为什么有虚拟机还要用 docker ?
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
2016-11-04 09:48:37 +08:00
@deadEgg 实际上安全作用很小,这个是另外一个话题

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

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

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

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

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

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

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

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

但对于足够简单的项目,不用容器也复杂不了多少。
janxin
2016-11-04 18:07:46 +08:00
@poke707 在集群上做容器编排简直就是小公司噩梦…

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

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

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

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

© 2021 V2EX