我有两个码头工人:一个是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中仍然不可用。
答案 0 :(得分:2)
issue 6350中讨论了这个问题:
如果我明确地执行了一个docker重新启动IP正确更新,但是我使用的是“systemctl restart”,它在运行之前执行stop,kill和rm
在这种情况下(“stop - rm - run”),链接不会刷新:
docker不会假设具有相同名称的容器应链接到
在所有新容器完全无关之后,保持“链接”并不总是有意义。
我的解决方案和我的建议是:
- 你会发现像 Ambassador pattern 更强大的东西,这只是一种说法你链接到你永远不会重启的代理的奇特方式 - 保持docker链接活跃。
(还introduced here)- 另一个解决方案是
docker create
,docker start
和docker stop
而不是docker rm
。- 最后,我的实际解决方案是使用类似SkyDNS或docker-gen的东西来保存中央DNS以及所有容器名称。最后一个解决方案对我来说是最好的,因为它允许我在主机和docker链接之间移动容器不能像那样工作。
对于docker的下一个版本,libnetwork实际上是可行的方式 (参见“The Container Network Model (CNM)”和“Docker Online Meetup #22: Docker Networking - video”)