我正在學習CoreOS/Docker,並試圖圍繞幾件事情進行思考。Docker/CoreOS上的Java JVM
對於Java基礎結構,是否可以在其自己的容器中使用JVM,並讓其他Java應用程序/服務使用此JVM容器?如果沒有,我假設JVM必須捆綁在每個容器中,所以基本上你必須提取Java dockerfile併合並我的Java服務;本質上創建了一個運行在CoreOS機器上的Linux機器+ Java +服務容器。
我唯一的想法是可以在CoreOS本身上運行JVM,但似乎這是不可能的。
我正在學習CoreOS/Docker,並試圖圍繞幾件事情進行思考。Docker/CoreOS上的Java JVM
對於Java基礎結構,是否可以在其自己的容器中使用JVM,並讓其他Java應用程序/服務使用此JVM容器?如果沒有,我假設JVM必須捆綁在每個容器中,所以基本上你必須提取Java dockerfile併合並我的Java服務;本質上創建了一個運行在CoreOS機器上的Linux機器+ Java +服務容器。
我唯一的想法是可以在CoreOS本身上運行JVM,但似乎這是不可能的。
過程互相交談它實際上可能只是解壓ORCALE爪哇/opt
,但是這只是一種不得已而爲之的。 JRE和JDK的Oracle二進制文件不需要任何系統庫,因此在任何地方都很容易。
我寫了一些很小的JRE和JDK圖片,我用它可以運行Elasticsearch和其他主要的開源應用程序。我還寫了一些容器,允許我在CoreOS上編譯罐子(errordeveloper/mvn,errordeveloper/sbt & errordeveloper/lein)。
正如@ISanych指出的那樣,運行多個Java容器不會影響磁盤的使用,它幾乎等同於在主機上運行多個JVM。如果你發現運行多個JVM不是你的茶葉茶,那麼答案就是JVM不必像在容器之前存在容器一樣複雜。但是,容器中的Java仍然非常好,因爲您可以擁有一個永久修復的類路徑,並且不會陷入依賴性地獄。也許不是構建uberjars(儘管它們被稱爲not exactly perfect,但是我很懶),而是可以將jar包壓縮到tarball,然後在其Dockerfile中使用ADD jars.tar /app/lib/
。
最佳做法是使用jvm創建圖像,然後使用基於jvm圖像的其他圖像(從Dockerfile中的jvm)創建圖像。即使您將創建許多不同的圖像,它們也不會浪費太多空間,因爲碼頭工人正在使用分層文件系統,並且所有容器都將使用同一個jvm圖像副本。是的,每個jvm都將是獨立的進程,吃掉自己的內存 - 但是隔離環境是docker的用處。
在JVM上運行的應用程序必須在容器中安裝JVM。所以如果你想把應用程序組件分成不同的容器,每個容器都需要有JVM。 在一個側面說明,容器可以通過一個叫container linking
我也剛剛發佈了一篇關於此方面的更多詳細信息的博文:http://weaveblog.com/2014/12/09/running-java-applications-in-docker-containers/ – errordeveloper 2014-12-09 16:18:51