请教下代码放在Docker里面还是外面呢


你好,我是一个新手,最近刚接触docker ,连续看了好多这方面的文档。目前已经学了一些很基础的东西。但是我还有一些疑问。

首先我的项目是公司内部使用,所以并发不大,项目也不多,所有代码都是用django写的,所有东西都是一个后台进行管理的,接触docker后,我在想,我的项目代码是放在docker里面,还是外面呢??放在外面和里面分别有什么好处吗?
已邀请:

shlallen - DaoCloud软件工程师,合伙人

赞同来自: dockerlove123 weschen


对于楼主的问题,我认为首先需要明确的是:Docker到底能够带来什么样的好处,Docker带来轻量级虚拟化容器方面的优势(资源利用率高,创建快捷,环境纯粹)?还是镜像带来的优势(便于部署,记录容器状态,持续集成等)?

将Docker的优势与楼主项目的性质进行综合,如楼主希望决定项目代码的放置位置。

根据我的理解,docker的外部,可以认为是和Docker没有任何关系。而Docker的内部,可以认为有两个维度,第一,Docker容器内部,第二,Docker的镜像image内部。

假如将用户的项目代码完全放在Docker外部,那么在由自身管理项目代码的时候,不可避免会遇到一个问题,如何在项目代码运行前放入Docker容器内部。一旦将项目代码迁入Docker容器内部,则可以直接将环境image与项目代码commit为一个新的image,以此image为模版,进行开发,迭代等。

所以我的观点是,项目代码通过Docker image的形式存储较为合适。

苦逼少侠 - 去哪儿网互联网研发工程师,docker爱好

赞同来自: Sonyfe25cp KC269 Guuuo AKAK 独步清风 yooz_hardy trdcaz 喃呈煦元更多 »


放不放入docker这个概念优点不对,docker有镜像和容器区分。两者不一样的是放入镜像相当于模板,这会减低镜像的复用性。

我们team现在的做法是,代码不放入镜像,使用volume挂载放入容器。这样我的镜像只需要维护程序运行的环境,不同的项目运行不同的容器挂载不同的代码。我认为这种粒度比较合适。

@shlallen 同学的做法会把代码的版本控制和镜像的版本控制耦合在一起。

如果我们是把源码编译后的内容(随不同语言平台而不同)挂载的方式放入容器,不放入镜像,那代码版本控制还可以继续使用git/svn来管理。

而代码checkout 编译 部署的过程业界有很成熟的方案,即使不想用这些工具也完全可以写个脚本搞定。

只有一种是例外的,那就是你使用开发的代码来直接搭建一个完整的服务,不想要对代码再继续修改。那这时候集成到镜像内是合适的。

我处理这个事情是分两种情况的:

  1. 开发环境

    由于开发环境代码一直在变动,而且多人通过git协作,于是代码都是放在外面,构建一个运行环境的image,然后代码部分用volume映射进去,方便随时调整。

  2. 生成环境

    我们的生产环境比较独特,一般都是给客户安装成品而不是自己的服务器,一方面为了保护代码,另一方面是减少不必要的麻烦,于是就把代码都构建在image里面,这样直接在客户那边把镜像运行起来就行,只是个下载的时间,也不需要其他操作。

    在自己的服务器上,由于基本是内部演示之类,所以完全就是当做开发环境来对待的,参见第一条。


Docker嘛,既然可以虚拟环境,那么怎么合适怎么用吧,目的就是开发的时候启动的快+重新构建快,给客户安装的时候要尽可能的简单,避免幺蛾子。

docker_lyh - 70后IT男

赞同来自: dockerlove123 回到原点


我是新手,请教一下代码放在image里管理是否会造成本地存储和网络传输上不必要的负担?谢谢!

田浩浩 - wizmacau developer

赞同来自: TommyLau KC269


建议代码放外边,用Dockerfile来构建镜像:这样可以便于维护管理以及保持镜像尺寸的最小化

请参考Dockerfile相关文章

icebolt - Docker爱好者暗黑

赞同来自: JentleWang KC269


首先我们要清楚你究竟想用docker做什么。必须确定你使用的场景,才好说明你的代码倒地放到什么地方更合适。
如果你的做好了所有代码,想分发给你的使用者,这种无疑代码放到image是最佳的,包括你的数据库初始化脚本等。例如wordpress .

如果你是开发环境,代码是用于调试,代码是不应该在image里面的,利用dockerfile,自动git pull也不是好的方案,当然更不提倡ssh到容器,去修改代码。这个时候,你的代码最好是在你的mac,windows,linux的个人pc上,如果你的开发环境,本身就部署到了本机,通过boot2docker或者其他方式,那么就通过共享目录,然后开启容器的时候-v的方式,通过卷的方式,来使用,最方便。修改代码直接就可以进行调试。如果开发环境在服务器上,可以通过远程mount的方式,mount到本机进行开发修改。

如果你是测试环境,建议根据git方式进行,代码不在image,而是通过docker exec到容器内pull对应测试tag的代码。当然也可以在宿主机pull,然后docker cp到对应的测试容器;具体方法看您的需求。

只是举几个例子,你可以根据你的场景灵活的方式代码和数据,没有哪种最优,只有最适合你的。

zjumoon - 蘑菇街-牧白 mubai@mogujie.com

赞同来自: 回到原点


个人比较同意@苦逼少侠的做法,代码是经常会更新的,作为数据盘挂给容器 管理起来比较方便
如果将代码放入到docker images中,如果代码经常更新就意味着也要经常commit image。

sunday1207 - it老男人

赞同来自: stevenlee87


如果工程是经常更新的建议放外面

王传义

赞同来自:


代码是经常会更新的,作为数据盘挂给容器 管理起来比较方便
如果将代码放入到docker images中,如果代码经常更新就意味着也要经常commit image

就是这样呀

代码还靠自己svn git维护

jxcdwangtao

赞同来自:


我支持@Sonyfe25cp的观点:
1、在开发环境,因为code的频繁变更,通过volume方式进行挂载方便。
2、代码提交到git repo后,通过jenkins打包编译,把编译后的代码包生成到docker image中,并打好对应的tag,上传到docker registy。之后进入测试环境进行部署,测试。
3、通过paas ci后的docker image就可以直接在生产环境进行部署了。

-无夏之年- - 无夏之年

赞同来自:


线上部署的时候,java代码放镜像;php因为更新频繁,代码做目录挂载。
开发环境的时候,代码也是做目录挂载。

要回复问题请先登录注册