2015-10-09 71 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」)