我喜歡肯·科克倫的回答。
但我想補充一些觀點,這里沒有詳細說明。在我看來,碼頭在整個過程中也有所不同。與VM相比,Docker并不是(僅僅)最優的硬件資源共享,而且它還為打包應用程序提供了一個“系統”(更好,但不是必須的,作為一組微服務)。
在我看來,它適應了像rpm這樣面向開發人員的工具之間的差距,德比安包裹,馬文,NPM+Git在一邊,操作工具(如木偶VMware,Xen,你說吧.
為什么將軟件部署到碼頭映像(如果這是正確的術語)比簡單部署到一致的生產環境容易呢?
您的問題假設了一些一致的生產環境。但是如何保持它的一致性呢?考慮一些服務器和應用程序的數量(>10),在管道中的各個階段。
為了保持同步,你將開始使用類似木偶的東西,大廚或者你自己的配置腳本,未發布的規則和/或大量的文檔.理論上,服務器可以無限期運行,并且保持完全一致和最新。實踐無法完全管理服務器的配置,因此有相當大的配置漂移空間,以及對正在運行的服務器的意外更改。
因此,有一種已知的模式可以避免這種情況,即所謂的不可變服務器..但不變的服務器模式并不受歡迎。主要是因為在Docker之前使用的VM的局限性。處理幾個千兆字節的大圖像,移動這些大圖像,僅僅為了改變應用程序中的一些字段,是非常辛苦的??梢岳斫?。
有了Docker生態系統,您將永遠不需要在“小更改”(謝謝aufs和Registry)上移動千兆字節,您也不必擔心在運行時將應用程序打包到Docker容器中會失去性能。你不需要擔心那個圖像的版本。
最后,您甚至可以復制復雜的生產環境,即使在Linux筆記本上也是如此(如果在您的情況下不起作用,就不要打電話給我);)
當然,您可以在VM中啟動Docker容器(這是個好主意)。在VM級別上減少服務器配置。所有這些都可以由Docker來管理。
同時,Docker使用自己的實現“libContainer”來代替LXC。但LXC仍然可用。