2014-12-03 5 views
4

Я изучаю CoreOS/Docker и пытаюсь окунуться в некоторые моменты.Java JVM на Docker/CoreOS

С инфраструктурой Java можно ли использовать JVM в своем собственном контейнере и использовать ли другие приложения/службы Java для использования этого контейнера JVM? Если нет, я предполагаю, что JVM должен быть связан в каждом контейнере, поэтому по существу вам нужно вытащить Java dockerfile и объединить мои Java-сервисы; по существу создавая контейнер Linux Machine + Java + Service, работающий поверх машины CoreOS.

Единственная другая мысль, которую я имел, это было бы возможно запустить JVM на самом CoreOS, но похоже, что это невозможно.

ответ

4

Это на самом деле можно просто разархивировать Orcale Java в /opt, но это всего лишь своего рода последней инстанции. В двоичных файлах Oracle JRE и JDK не требуются системные библиотеки, поэтому это довольно легко.

Я написал несколько довольно маленьких изображений JRE и JDK, с которыми мне удалось запустить Elasticsearch и другие крупные приложения с открытым исходным кодом. Я также написал несколько контейнеров, которые позволяют компилировать банки на CoreOS (errordeveloper/mvn, errordeveloper/sbt & errordeveloper/lein).

Как отметил @ISanych, запуск нескольких контейнеров Java не повлияет на использование диска, это в значительной степени эквивалентно запуску нескольких JVM на хосте. Если вы обнаружите, что запуск нескольких JVM - это не совсем ваш чашечный чай, тогда ответ на самом деле заключается в том, что JVM не должен быть таким сложным, как если бы контейнеры существовали до него. Однако Java в контейнере по-прежнему довольно хорош, так как вы можете иметь один путь к классам, который будет фиксирован навсегда, и вы не попадете в адский ад. Возможно, вместо того, чтобы строить uberjars (это то, что я делаю в основном, несмотря на то, что они известны как not exactly perfect, но я ленив), можно было бы вместо этого объединить банки в tarball, а затем использовать ADD jars.tar /app/lib/ в своем Dockerfile.

+1

Я также просто опубликовал сообщение в блоге с несколькими подробностями об этом: http://weaveblog.com/2014/12/09/running-java-applications-in-docker-containers/ – errordeveloper

0

Лучшей практикой будет создание изображения с jvm, а затем других изображений на основе jvm image (из jvm в файле Dockerfile). Даже если вы создадите много разных изображений, они не будут тратить много места, поскольку докер использует многоуровневую файловую систему, и все контейнеры будут использовать одну и ту же копию изображения jvm. Да, каждый jvm будет отдельным процессом, питающимся собственной памятью, но изолированными средами, для которых используется докер.

1

Приложения, запускаемые на JVM, должны иметь JVM, установленный в контейнере. Поэтому, если вы хотите разделить компоненты приложения на отдельные контейнеры, каждый из этих контейнеров должен иметь JVM. На стороне записки, контейнеры могут разговаривать друг с другом с помощью процесса, называемого container linking

Смежные вопросы