我有一些运行如下的Docker容器:
由于Nginx需要连接到Web应用程序1和2中的Web应用程序服务器,并且Web应用程序需要与PostgreSQL通讯,所以我有这样的链接:
起初这很好用。但是,当我开发Web应用程序1和Web应用程序2的新版本时,需要替换它们。我要做的是删除Web应用程序容器,设置新容器并启动它们。
对于Web应用程序容器,其IP地址起初类似于:
在更换它们之后,它们将具有新的IP地址:
现在,Nginx容器中那些公开的环境变量仍然指向旧的IP地址。问题来了。如何更换容器而不破坏容器之间的链接?PostgreSQL也将发生相同的问题。如果要升级PostgreSQL映像版本,我当然需要删除它并运行新版本,但是随后我需要重建整个容器图,因此对于实际的服务器操作而言,这不是理想的选择。
的效果--link是静态的,因此它不适用于您的情况(尽管可以删除链接,但目前没有重新链接)。
--link
我们在dockerize.it上使用了两种不同的方法来解决此问题,而没有链接或大使(尽管您也可以添加大使)。
1)使用动态DNS
通常的想法是,在启动和停止容器时,为数据库(或任何其他服务)指定一个名称,并使用实际IP更新短暂的DNS服务器。
我们从SkyDock开始。它与两个docker容器,DNS服务器和一个使其自动更新的监视器一起使用。后来,我们使用Consul(还使用了dockerized版本:docker -consul)转向了更多自定义项。
这种情况的演变(我们尚未尝试过)将设置etcd或类似的东西,并使用其自定义API来学习IP和端口。该软件也应该支持动态重配置。
2)使用docker bridge ip
公开容器端口时,您可以将它们绑定到docker0网桥,该网桥具有(或可以具有)众所周知的地址。
docker0
用新版本替换容器时,只需使新容器在相同IP上发布相同端口即可。
这比较简单,但也有更多限制。如果您运行类似的软件,您可能会遇到端口冲突(例如,两个容器无法在docker0网桥上的3306端口上侦听)等问题,因此我们目前最喜欢的是选项1。