2015-10-09 38 views
2

我有两个docker:一个是nginx前端,另一个是expressjs应用程序。 Nginx是入口点,它可以代表expressjs。如何刷新容器链接

我做的:

docker run -d --name 'expressjs' geographica/expressjs 

docker run -d --name 'nginx' --link expressjs nginx 

后,当我更新的图像地理/ expressjs我需要重新创建expressjs容器:

docker stop expressjs && docker rm expressjs && docker run -d --name 'expressjs' geographica/expressjs 

在这一点上我还需要重新Nginx的容器。如何不重新创建nginx容器?

这是对我们问题的简化,我们的真实服务器有一个nginx前端和N个应用程序,所以每次我们更新其中一个应用程序时,我们需要重新启动nginx并停止其他应用程序的服务。

请避免docker-compose解决方案。我不想为所有的应用程序都有一个独特的/巨大的docker-compose文件。

已更新:

我也认为这样的事情会很有用。 https://github.com/docker/docker/issues/7468。在运行时使用docker link命令更改容器链接。不幸的是它在1.8.2中不可用。

回答

2

这在issue 6350讨论:

如果我明确做码头工人,重新启动IP正确更新,但是我用的是“systemctl重启”这确实停止,运行前杀死和rm

在这种情况下(“停止 - RM - 运行”),链接不刷新:

码头工人不认为具有相同名称的容器,应挂

在所有新容器完全无关后,保持该“链接”并不总是合情合理的。

我的解决方案和我的意见,认为:

  • 你考虑一些更强大的像Ambassador pattern是说你链接到你从来没有重新启动代理的只是一种奇特的方式 - 以保持码头链接活动。
    (也introduced here
  • 另一种解决方案是只docker createdocker startdocker stop代替docker rm
  • 最后,我的实际解决方案是使用诸如SkyDNS或docker-gen之类的东西来保存包含所有容器名称的中央DNS。最后一个解决方案对我来说是最好的,因为它允许我在主机和码头链接之间移动容器,但这种方式无法工作。

随着泊坞窗的下一个版本,libnetwork实际上将要走的路。(参见“The Container Network Model (CNM)”和“Docker Online Meetup #22: Docker Networking - video”)