Docker - 关于使用 Redis、Postgres、ElasticSearch、NGINX、W

我才真正开始接触 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 安装在容器中的路径)。安装点可能因开发人员而异。您将如何设置?

在生产中,我可以克隆主机上的应用程序存储库并挂载到虚拟机中,也可以克隆容器本身内的应用程序代码。

我知道用于挂载卷的 -v 标志,所以我想您可以设置一些环境变量来使主机挂载点可配置。

最佳答案

容器策略:这是一个常见问题。这真的取决于你想用你的应用程序做什么。

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

Dockerfile:每个镜像需要一个 Dockerfile。所以,如果你制作一个“一体式”容器,它就是一个 Dockerfile;如果您将应用程序拆分到具有不同角色(Redis、DB、Web ......)的多个容器中,那就是许多不同的 Dockerfile。

Dev vs Prod:这真的取决于语言/框架/等。你使用的。

  • 有时,您可以在本地机器上工作,并时不时地构建容器(并对其进行测试)(有点像“测试以推送到登台”,只是速度要快得多)。 如果构建新容器需要一段时间(例如,如果您使用 ADD 后跟昂贵的构建/依赖步骤),这是一个好方法。
  • 如果容器构建速度很快,您可以在每次更改内容时不断地重新构建和重新部署新容器。
  • 您还可以使用两个略有不同的 Dockerfile。假设您的源代码位于 /myapp 中。在开发 Dockerfile 中,您将声明 /myappVOLUME,并且开发人员需要将其本地源副本绑定(bind)挂载到 /我的应用程序。在生产 Dockerfile 中,您将使用 ADD 将源代码复制到 /myapp。构建过程也会有细微差别。

最后一种方法并不理想(因为当 dev 和 prod 环境尽可能接近时会更好!)但在某些情况下(当构建新容器非常长时)它会很有帮助。

关于Docker - 关于使用 Redis、Postgres、ElasticSearch、NGINX、Workers 和多个 ruby​​ 应用程序设置 Web 应用程序的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21086434/

相关文章:

docker - 如何在(私有(private))Docker 注册表(API v2)中查找镜像的创

docker - Docker 如何使用端口 2375 和 4243?

Docker - 检查私有(private)注册表镜像版本

apache - 如何在 Docker 容器中使用 Apache 并且什么都不写到磁盘(所有日志到

docker - 在 docker 中生成自签名证书

linux - CoreOS 的 Docker 和 Rocket 有什么区别?

java - DockerFile 运行 java 程序

python-2.7 - 以官方 python docker 镜像为基础运行 python-ldap

git - Docker:如何从 Github 存储库上的非主分支构建镜像

mysql - Docker-compose:数据库未初始化