2017-01-11 222 views
10

我對於不應該使用數據容器的常見共識感到困惑。我有特定的用例,我想完成。在Docker數據容器中部署Web應用程序vs卷

我想有docker nginx容器,並在它後面有一些其他容器與應用程序。要運行我的應用程序的最新版本,我想從我的私人碼頭註冊表下載現成的容器。該應用程序現在是純靜態html,JavaScript的東西。

所以我的計劃是創建docker鏡像,它將容納這些文件,並在某些/ webapp文件夾中指定一個命名卷。 nginx容器將爲此卷提供服務。我沒有看到任何其他方式如何將一堆文件移動到遠程系統的「碼頭集裝箱」方式。 我是不是真的在創建被詛咒的數據容器?

無論如何,應用程序容器交換期間會發生什麼?當我停止應用程序容器時,卷將保持可訪問狀態,因爲它放置在主機上。當我拉和開始新版本的應用程序容器。該卷將再次創建並預先存儲在同一位置的圖像文件,替換主機上的內容,以便nginx容器將從現在的新版本的應用程序服務器。當我將引用nginx容器中尚不存在的卷時會發生什麼。

似乎命名值不會自動與圖像的內容一起提交。還有我不知道如何創建搬運工文件名爲體積這句法從here採取不起作用

FROM training/webapp 

VOLUME webapp:/webapp 
+0

而不是用一個命名的容器,你應該簡單地創建一個基於NGINX圖像的新圖像。在這種情況下,這是一個容量較小的容器。 – KarateKid

+0

但在我的情況下,我需要一個nginx作爲網關,後面會有多個應用程序,可能還有一些其他技術不是靜態頁面。我認爲運行多個nginx實例將會是不必要的性能開銷。 – Zveratko

回答

4

我想你可能想我在這裏https://stackoverflow.com/a/41576040/3625317

問題描述容量是,當容器被重新創建時,不是docker-compose down而是docker-compose pull + up,新容器不會將「新代碼存儲在卷中」,而是由於回收量,仍舊是舊的anon卷。問題是,無論如何你都需要一個匿名卷,因爲你希望它可以重新部署,而不是一個命名的卷,因爲你希望代碼是可交換的。

重新創建anon-volume不會被刪除,也就是說,讓我們說你有圖像:v1現在,你拉圖像:v2然後做一個docker-compose up。它會根據image:v2重新創建您的容器 - 完成後,您將擁有一個新的容器,但代碼仍然來自基於image:v1的舊容器,因爲anon-volume沒有被替換,它是重新分配。 docker-compose down && docker-compose up會爲您解決 - 但您在處理您的想法時必須牢記這一點。 (向下刪除anon-volumes)

一般來說,有一個pro/con,請參閱我的其他帖子。

數據容器通常具有其他含義,並被所謂的命名卷所取代。數據容器已被用於建立「命名」而不是基於匿名卷的卷裝。

過去,您必須創建一個帶有卷的容器,然後使用基於容器名稱的此卷容器(容器將是靜態/名稱部分),今天,您只需創建一個命名卷name並按此卷名安裝,不需要基於容器名稱的busybox killed after start卷裝入。

+0

這個概念是使用命名捲來克服每個「部署」上新的匿名卷的問題。你知道在docker文件中命名卷的創建有什麼問題嗎?如果它能工作,我可以有一些代碼,以自動填充應用程序的文件開始。也許可能的方法是創建命名卷manualy將其僅用作nginx容器的只讀,並將其內容替換爲每個webapp容器啓動。 – Zveratko

+0

命名卷不會以任何方式將存儲您的應用代碼的套件包含在內,因爲這將成爲「不可部署」,並且對於所有應用都應該是錯誤的。所謂的卷是應用程序容器應用程序代碼文件夾的nogo。也就是說,你在後者中所說的會起作用,但實際上仍然是泊塢窗的各個方面,並且永遠不會完成(但可以完成)。 –

+0

那麼有什麼其他方式可以共享我的應用程序容器的內容嗎?當人們不想使用應用程序二進制文件捆綁應用程序服務器時,通常會如何處理?二進制文件是否在Docker容器之外手動管理?(即將它們複製到某個卷或直接複製到某個容器等) – Zveratko