如何在开发过程中模仿“反向代理或负载平衡器设置背后的Docker容器”

在Docker容器内部开发和testing应用程序,并最终以相同的方式在生产环境中运行它们,是减lessused to work on my machine but is magically failing in production一个很好的方法, used to work on my machine but is magically failing in production风险方面used to work on my machine but is magically failing in production

这也体现在因子no。 我所试图遵循的10个着名的因素宣言中的任何一个对于给定的用例都是有意义的: Keep development, staging, and production as similar as possible.

在我们的生产服务器上,我们有一个反向代理,在端口80上接收传入请求,并根据通过虚拟域访问主机时使用的Host头将它们转发到正确的容器 – 例如对app1.domain.name请求转到app1容器,而对app2.domain.name请求转到app2容器等。我们使用traefik ,但它也可以是jwilder / nginx-proxy或任何其他反向代理或负载平衡器。 没有其他的容器端口公开地暴露给应用程序容器。

我现在的问题是,在开发过程中模拟这个设置的最有效的方法是什么? 我可以想到以下几点:

  1. 在开发过程中忽略反向代理,并在开发过程中为每个服务提供一个公共端口。 但在生产中,请勿公开任何港口。 虽然这很容易做到,但它并没有给开发和生产设置之间的确切平衡。
  2. 在开发期间在本地运行一个类似的反向代理。 虽然这在开发和生产环境之间提供了更好的平衡,但是这个需求需要在某处进行logging,并且在开发人员实际深入应用程序本身之前,为新开发人员带来一些负担 – 这是Docker方法实际上试图避免的。
  3. 通过将所有内容放入虚拟机(例如使用Vagrant )来自动设置模拟生产环境(包括反向代理)的开发环境。 虽然从开发人员的angular度来看,这样做会很方便,但还需要花费更多的时间进行初始设置并消耗更多的资源。

我在这里错过了一些比所描述的更优越的方法吗?