Docker – 使用Redis,Postgres,ElasticSearch,NGINX,Workers和多个ruby应用程序设置Web应用程序的build议

我真的正在进入Docker。 我想将现有的应用程序基础架构放入容器中,以提供一致且隔离的环境,并且更容易部署。

我的设置

我正在运行一些服务/守护进程(Redis,ES,PG,NGINX)以及一些工作人员(需要与PG和Redis交谈)。 我有3个rubyWeb应用程序服务和一个所有需要与Redis,PG和ES交谈的Faye服务。 NGINX将需要将代理转换为应用程序。

集装箱战略

首先我想知道的是,你将使用docker和这些服务的策略。

  • 你会为每个服务创build一个(例如ubuntu)容器,然后用相应的隧道(-link)启动它们到容器?
  • 你会把一个容器上的服务和另一个上的应用程序捆绑起来?
  • 或者,你会创造一个巨大的容器?

Dockerfile

你会/可以为所有容器制作一个Dockerfile,还是将它们分开? 即Redis-Dockerfile,Web01-Dockerfile等

发展与生产

在开发中,我希望立即更新容器上的文件更改(即从主机FS安装在容器中的path)。 不同的开发者可能会有不同的挂载点。 你将如何设置?

在生产环境中,我可以克隆主机上的应用程序仓库,并挂载到虚拟机中,也可以将应用程序代码克隆到容器内部。

我知道挂载卷的-v标志,所以我想你可以设置一些环境variables来使主机挂载点可configuration。

容器战略:这是一个经常被问到的问题。 这真的取决于你想要用你的应用程序做什么。

  • 如果您的应用程序将具有大量的部署(例如,如果您的应用程序是SAAS,并且您将为每个客户部署一个新实例),但这些部署预计会相当小,那么您可能希望将所有内容放在一个容器中,因为部署会容易得多。
  • 如果您的应用程序可能显着缩放(例如,如果您希望需要多个前端,工作人员等),则可能需要将每个服务放在不同的容器中,以便可以分别缩放每个服务。
  • 如果您的应用程序需要大量部署并且需要扩展,那么您将需要多个容器,并确保您正确使用链接:-)

Dockerfile:每个镜像需要一个Dockerfile。 所以,如果你制作一个“全合一”的容器,它是一个Dockerfile; 如果您将应用程序分成多个具有不同angular色(Redis,DB,Web …)的容器,那就是多个不同的Docker文件。

开发与生产:它确实取决于语言/框架/等。 你使用的。

  • 有时候,你可以在你的本地机器上工作,并且每隔一段时间build立一个容器(并testing它们)(有点像“testing推送到分段”,除了它更快)。 如果构build新的容器需要一段时间(例如,如果您使用ADD然后是昂贵的构build/依赖性步骤),这是一个很好的方法。
  • 如果容器构build速度很快,那么每次更改内容时都可以不断重新构build和重新部署新的容器。
  • 你也可以使用两个稍微不同的Docker文件。 假设你的源代码将在/myapp 。 在Dockerfile的开发中,你将声明/myapp是一个VOLUME ,开发者将会把它的本地拷贝绑定到/myapp 。 在生产Dockerfile中,您将使用ADD将源复制到/myapp 。 在构build过程中也会有细微的差别。

最后一种方法并不理想(因为dev和prod环境越接近越好),但是在某些情况下(当构build一个新的容器非常长时)它会有很大的帮助。

容器策略容器用于拆分服务,在容器中运行服务,所以取决于服务以及如何组织服务

Dockerfile

Dockerfile用于构build用于运行容器的映像,因此请为每个容器创build一个Dockerfile