如何刷新容器链接

时间:2015-10-09 08:04:48

标签: docker

我有两个码头工人:一个是nginx前端,另一个是expressjs应用程序。 Nginx是入口点,它代表表达。

我做:

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

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

之后,当我更新图像geographica / 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中仍然不可用。

1 个答案:

答案 0 :(得分:2)

issue 6350中讨论了这个问题:

  

如果我明确地执行了一个docker重新启动IP正确更新,但是我使用的是“systemctl restart”,它在运行之前执行stop,kill和rm

在这种情况下(“stop - rm - run”),链接不会刷新:

  

docker不会假设具有相同名称的容器应链接到

     

在所有新容器完全无关之后,保持“链接”并不总是有意义。

     

我的解决方案和我的建议是:

     
      
  • 你会发现像 Ambassador pattern 更强大的东西,这只是一种说法你链接到你永远不会重启的代理的奇特方式 - 保持docker链接活跃。
      (还introduced here
  •   
  • 另一个解决方案是docker createdocker startdocker stop而不是docker rm
  •   
  • 最后,我的实际解决方案是使用类似SkyDNS或docker-gen的东西来保存中央DNS以及所有容器名称。最后一个解决方案对我来说是最好的,因为它允许我在主机和docker链接之间移动容器不能像那样工作。
  •   

对于docker的下一个版本,libnetwork实际上是可行的方式 (参见“The Container Network Model (CNM)”和“Docker Online Meetup #22: Docker Networking - video”)