我刚刚进入Docker.我想将现有的应用程序基础架构放入容器中,以提供一致且隔离的环境,并且更容易部署.
我的设置
我正在运行许多服务/守护进程(Redis,ES,PG,NGINX)以及一些工作人员(需要与PG和Redis交谈).我有3个ruby Web应用程序服务和一个faye服务,所有这些都需要与Redis,PG和ES交谈.NGINX需要将代理反向代理到应用程序.
集装箱战略
我想知道的第一件事是你将使用docker和这些服务的策略.
您是否会为每个服务创建一个(例如ubuntu)容器,然后使用适当的隧道(-link)启动它们到容器?
你会将服务捆绑在一个容器上,而将应用程序捆绑在另一个
或者,你会创建一个巨大的容器?
Dockerfile
您是否/可以为所有容器制作单个Dockerfile,还是将它们拆分?即Redis-Dockerfile,Web01-Dockerfile等.
发展与生产
在开发中,我希望立即更新文件更改容器(即从主机FS安装在容器中的路径).安装点可能因开发人员而异.你会怎么设置它?
在生产中,我可以在主机上克隆应用程序存储库并在VM中安装,或者我可以在容器内部克隆应用程序代码.
我知道用于挂载卷的-v标志,所以我想你可以设置一些环境变量来使主机挂载点可配置.
容器策略:这是一个经常被问到的问题.这真的取决于你想要对你的应用程序做什么.
如果您的应用程序将进行大量部署(例如,如果您的应用程序是SAAS,并且您将为每个客户部署一个新实例),但这些部署预计会相当小,那么您可能希望将所有内容放在一个容器中,因为部署会容易得多.
如果您的应用程序可能会显着缩放(例如,如果您希望需要多个前端,工作人员等),您可能希望将每个服务放在不同的容器中,这样您就可以单独扩展每个服务.
如果您的应用程序将具有大量部署并且必须扩展,那么您将需要多个容器,并确保您也正确使用链接:-)
Dockerfile:每个映像需要一个Dockerfile.所以,如果你创建一个"一体化"容器,它就是一个Dockerfile; 如果您将应用程序拆分为具有不同角色的多个容器(Redis,DB,Web ...),那就是多个不同的Dockerfiles.
Dev vs Prod:它真的取决于语言/框架/等.你用的.
有时候,你可以在你的本地机器上工作,并且不时地构建容器(并测试它们)(有点像你要"测试推送到升级",除了它更快).如果构建新容器需要一段时间(例如,如果使用ADD
后跟昂贵的构建/依赖步骤),这是一种很好的方法.
如果容器构建很快,您可以在每次更改内容时不断重建和重新部署新容器.
您还可以使用两个略有不同的Dockerfiles.假设您的来源将在/myapp
.在开发Dockerfile中,您将声明/myapp
为a VOLUME
,并且期望开发人员将其源的本地副本绑定到/myapp
.在生产Dockerfile中,您将使用ADD
将源复制到/myapp
.构建过程中也会有细微差别.
最后一种方法并不理想(因为当dev和prod环境尽可能接近时它会更好!)但在某些情况下(当构建一个新容器很长时)它会有很大帮助.