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

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

  •  
  •   DjvuLee · 2014-12-10 12:34:30 +08:00 · 3659 次点击
    这是一个创建于 3647 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我的一个应用程序依赖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来下载并配置好?
    14 条回复    2014-12-31 11:11:26 +08:00
    binux
        1
    binux  
       2014-12-10 13:02:29 +08:00
    把这个Python3.0打包进去
    icylogic
        2
    icylogic  
       2014-12-10 13:24:41 +08:00 via Android   ❤️ 1
    python 官方有 3.3 和 3.4 的dockerfile,改一下 version以后 build 一个自己的 3.0 image 应该就可以了。
    DjvuLee
        3
    DjvuLee  
    OP
       2014-12-10 13:36:31 +08:00
    @binux 如果多个程序都有这样一个类似的需求,那是每个程序都需要打包一个呢?这样的话,那很浪费空间了。还是说程序之间会共享呢?
    icylogic
        4
    icylogic  
       2014-12-10 13:47:57 +08:00 via Android
    @DjvuLee image 之间没有关系,一般来讲除非遇到这种用 python 3.0 的非主流需求,否则,比如 python 3.3 或者 3.4 或者 2.7 你可以直接在dockerfile里一句 from python:3.3 解决
    fwee
        5
    fwee  
       2014-12-10 14:11:33 +08:00
    @DjvuLee 没错,硬盘不值钱。就算你一个container 1G,一台服务器上部署20个app才20G
    binux
        6
    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
        7
    xiaket  
       2014-12-10 16:06:58 +08:00
    @binux 貌似如果有mysql, 则应将mysql放到单独的container里.
    DjvuLee
        8
    DjvuLee  
    OP
       2014-12-10 17:09:06 +08:00
    @fwee 哈哈~看来有钱,就是任性!
    DjvuLee
        9
    DjvuLee  
    OP
       2014-12-10 17:11:49 +08:00
    @fwee 硬盘是不值钱。但是如果app体积很大,那么下载,上传或者迁移都很耗费网络流量吧!今天的data center里面网络还是一个很稀缺的资源。不知道Docker在这方面有没有一些什么策略?
    DjvuLee
        10
    DjvuLee  
    OP
       2014-12-10 17:15:14 +08:00
    @binux 如果是叠加的话,底层的进行了变更,还是有可能导致上层应用出现问题吧?虽然这个场景还是会比以前好很多。
    DjvuLee
        11
    DjvuLee  
    OP
       2014-12-10 17:17:25 +08:00
    @xiaket Docker允许上层基于多个底层不?比如我一个Docker App同时基于MySQL和Python3.0的层,就像多继承一样。
    xiaket
        12
    xiaket  
       2014-12-11 11:32:51 +08:00
    @DjvuLee don't
    siteshen
        13
    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
        14
    siteshen  
       2014-12-31 11:11:26 +08:00
    @DjvuLee 如果是叠加的话,底层的进行了变更,还是有可能导致上层应用出现问题吧?
    刚我说的可能和你说的问题有些偏差。对应到不用docker的部署流程,升级系统或者升级 redis 可能会导致问题。正常的部署流程,同样也要面对升级问题,这属于应用/运维层的事,docker不可能照顾到各式各样的应用。docker 做了 image 之后,相当于把相应的服务器和软件版本冻结了。如果要升级系统,image 就得重新 build,重新build之后是否还能工作,只能靠人去确保。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.