Docker 是怎样解决 package dependency 问题的?

2014-12-10 12:34:30 +08:00
 DjvuLee
比如我的一个应用程序依赖python3.0,但是我即将部署的OS上默认安装的是python2.5的。那么Docker是怎样解决这个依赖问题的?我自己发布的时候,把这个Python3.0打包进去?

我在Docker的github官网上看到这样的描述:
Docker solves dependency hell by giving the developer a simple way to express all their application's dependencies in one place, and streamline the process of assembling them

不太理解具体是怎样实现的?我给出我需要的环境依赖,其他由Docker来下载并配置好?
3544 次点击
所在节点    Docker
14 条回复
binux
2014-12-10 13:02:29 +08:00
把这个Python3.0打包进去
icylogic
2014-12-10 13:24:41 +08:00
python 官方有 3.3 和 3.4 的dockerfile,改一下 version以后 build 一个自己的 3.0 image 应该就可以了。
DjvuLee
2014-12-10 13:36:31 +08:00
@binux 如果多个程序都有这样一个类似的需求,那是每个程序都需要打包一个呢?这样的话,那很浪费空间了。还是说程序之间会共享呢?
icylogic
2014-12-10 13:47:57 +08:00
@DjvuLee image 之间没有关系,一般来讲除非遇到这种用 python 3.0 的非主流需求,否则,比如 python 3.3 或者 3.4 或者 2.7 你可以直接在dockerfile里一句 from python:3.3 解决
fwee
2014-12-10 14:11:33 +08:00
@DjvuLee 没错,硬盘不值钱。就算你一个container 1G,一台服务器上部署20个app才20G
binux
2014-12-10 14:13:36 +08:00
@DjvuLee 层可以共享,可以叠加,但是不能混合,比如你可以基于 unbuntu 的层,做一个 python3.0 的层,再基于 python3.0 做各个程序,这时候的 python3.0 可以共享。

但是你不能做一个 python3.0 的层,同时需要 mysql,这时不能把 mysql 混进来,只能在 python3.0 的层上装 mysql,或者在 mysql 的层上装 python3.0
xiaket
2014-12-10 16:06:58 +08:00
@binux 貌似如果有mysql, 则应将mysql放到单独的container里.
DjvuLee
2014-12-10 17:09:06 +08:00
@fwee 哈哈~看来有钱,就是任性!
DjvuLee
2014-12-10 17:11:49 +08:00
@fwee 硬盘是不值钱。但是如果app体积很大,那么下载,上传或者迁移都很耗费网络流量吧!今天的data center里面网络还是一个很稀缺的资源。不知道Docker在这方面有没有一些什么策略?
DjvuLee
2014-12-10 17:15:14 +08:00
@binux 如果是叠加的话,底层的进行了变更,还是有可能导致上层应用出现问题吧?虽然这个场景还是会比以前好很多。
DjvuLee
2014-12-10 17:17:25 +08:00
@xiaket Docker允许上层基于多个底层不?比如我一个Docker App同时基于MySQL和Python3.0的层,就像多继承一样。
xiaket
2014-12-11 11:32:51 +08:00
@DjvuLee don't
siteshen
2014-12-31 10:54:01 +08:00
@DjvuLee 上传下载image是一次性的,参照不用docker时搭建服务器环境,比如安装 mysql, redis,架构确定了后,基本一个月不会变的。

叠加的话,底层是“不会”变的,虽然你可以从一个历史commit里新增内容,但某一个commit里面的内容 **永远** 不会变。参考 git 里面的历史纪录,尽管可以 git commit --amend 但 amend 之后是另外一个commit,ID和原来的commit不同。
siteshen
2014-12-31 11:11:26 +08:00
@DjvuLee 如果是叠加的话,底层的进行了变更,还是有可能导致上层应用出现问题吧?
刚我说的可能和你说的问题有些偏差。对应到不用docker的部署流程,升级系统或者升级 redis 可能会导致问题。正常的部署流程,同样也要面对升级问题,这属于应用/运维层的事,docker不可能照顾到各式各样的应用。docker 做了 image 之后,相当于把相应的服务器和软件版本冻结了。如果要升级系统,image 就得重新 build,重新build之后是否还能工作,只能靠人去确保。

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

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

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

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

© 2021 V2EX