Чи заперечуються переваги розробки використання Docker при використанні Java порівняно з іншими мовами, ближчими до бінарних файлів Unix?


53

У мене був друг, який сказав:

Докер дивовижний. Ви можете використовувати його для тиражування виробництва та всіх його химерностей на локальній машині. Потім ви можете розгорнути цей екземпляр прямо через всі робочі процеси постановки супер- швидко .

Тепер це було б правдою, якби розробники писали Ruby, PHP або Go - там, де була бінарне посилання на операційну систему.

Але при використанні Java - між операційною системою та мовою вже існує віртуальний шар, що робить послідовність роботи незалежно від основної операційної системи.

Можливо, в цьому випадку переваги запуску Docker для місцевих розробників для тиражування виробничого середовища не заперечуються . (У порівнянні з Ruby, PHP або Go).

Я відкритий для обговорення цього питання і хочу почути іншу точку зору (з доказами).

Чи заперечуються переваги розробки використання Docker при використанні Java порівняно з іншими мовами, ближчими до бінарних файлів Unix?


34
Чому ви вважаєте, що рубін та php є бінарними? Ruby і php технічно навіть віртуальніші, ніж Java - у Java вам потрібно спершу скомпілювати, а потім виконати свою програму у віртуальній машині. У Ruby та php ви надсилаєте вихідний код, і віртуальна машина читає джерело безпосередньо.
slebetman

12
"Але при використанні Java - між операційною системою та мовою вже існує віртуальний шар, який забезпечує послідовність роботи незалежно від основної операційної системи." LOL. Java вигадала "писати один раз, перевіряти всюди".
Енді

2
Java - рухома ціль. Іноді вводяться функції, які руйнують речі (посилення безпеки кілька років тому були першочерговими прикладами) або ви стикаєтеся з помилкою, яка вимагає використання певної версії. Це набагато простіше керувати цим докером, ніж використовувати рідну систему упаковки хост-комп'ютера.
Thorbjørn Ravn Andersen

1
"дотримання послідовності роботи незалежно від основної операційної системи" Зауважте, що змушення мовного режиму виконання поводиться послідовно не зводить нанівець факт, що, ймовірно, все ще існують деякі зовнішні залежності. Можливо, щось таке просте, як використання певного шляху до файлів для ваших журналів.
jpmc26

Відповіді:


86

Зовсім ні.

Уявіть, що ви використовуєте версію 1.8.0 Java на вашій розроблювальній машині та сервері. До речі, ви працюєте одночасно над двома проектами, обидва використовуєте Java.

Одного разу виявляється помилка в JVM, і сервери, які запускають перший проект, над яким ви працюєте, переносяться на 1.8.1. До речі, помилка не впливає на сервери, на яких працює другий проект, і керує інша команда системних адміністраторів, яка може не бажати оновлення до 1.8.1.

Тепер, принаймні для одного з проектів, ви використовуєте іншу версію Java.

Це може не турбувати вас занадто сильно (поки один сервер не переходить на 1.9, а інший зберігає стару версію), але це означає, що ви більше не копіюєте виробниче середовище на локальній машині, що робить можливим крихітні помилки повзати.

Якщо ви уявляєте, що ваша файлова система, ваші залежності, налаштування безпеки, локальна конфігурація та сама версія Linux відрізняються від виробництва, ви піддаєте себе ризику написання коду, який вийде з ладу у виробництві. Замість того, щоб ризикувати, ви можете використовувати віртуалізацію або Docker, без незначних втрат продуктивності.


20
Крім того, подібні речі трапляються ВСЕ час у великих компаніях. Це не просто теоретична річ.
enderland

5
Що ви робите, коли виявляєте помилку в Докер?
Оуен

Також Java 9 порушить речі. Буде потрібно певних зусиль.
Thorbjørn Ravn Andersen

8
@Owen Те саме, що ви робите, коли знаходите помилку на Java. Або в {Linux, Windows}. Або у вашому процесорі .
Кролтан

1
@Trilarion: Так, хоча в основному у вигляді публікацій в блогах розробників компанії. При цьому будь-яке посилання "Дізнайтеся більше" на docker.com/customers надає приклади великих компаній, які використовують докер для вирішення подібних проблем. Зважаючи на це, зазвичай такі компанії сприймають це як належне, що їм потрібна ідеальна відповідність між виробництвом та розробкою, і досягають цього з віртуальними машинами. Пізніше вони зрозуміли: "Ей, Докер вирішує ту ж проблему, що і Віртуальний комп'ютер, за винятком того, що вона працює швидше і може бути використана для постійного розміщення розгортань"
Брайан

35

Ви рідко просто розгортаєте "додаток Java". У вашому додатку java навколо нього багато різних програм підтримки. Для інтеграції з програмами, які не працюють безпосередньо з Java, ми використовуємо Apache HTTPD, Apache Tomcat, ActiveMQ для обміну повідомленнями, FTP Deamon, MySQL та декілька спеціальних служб.

Це навіть не входить у розробку програмного забезпечення, яке йде разом з ним - eclipse, ant, adobe flex, groovy, firefox та subversion (я пропускаю досить багато)

Щоб створити нову робочу станцію, потрібен між повним робочим днем ​​і тижнем - ми обговорили переїзд до Docker для спрощення цієї проблеми. Було б дивовижно, якби ми змогли надійно розгорнути нову робочу станцію за пару годин.

Не кажучи вже про те, що при розгортанні нам потрібно підтримувати вгору - 20 серверів; Докер починає виглядати досить непогано!

(20 видається досить болісним для програми, яка працює лише на одному сервері за один раз ... але помножить цей сервер на кластери (x2), тест / постановку / prod (x3), внутрішній / зовнішній (x2) та первинний сайт / резервний сайт (x2), і ви досить швидко встаєте туди)


Чому б не зробити зображення?
Дмитро Кудрявцев

Ми сподіваємось. Ми невелика команда, яка намагається додати функції до досить широко використовуваної / важливої ​​системи і не має достатнього контролю над серверами, щоб диктувати їх розгортання. Можемо використовувати його для розробників, але ми вже досить обмежені на 32 Мб - я припускаю, що біг із докерського зображення матиме деякий накладний характер ... але наш план полягає в тому, щоб рухатись у цьому напрямку.
Білл К

Я мав на увазі для робочих станцій
Дмитра Кудрявцева

Час і пам’ять - нам уже потрібно залишати шматки, щоб вони працювали на наших 32 Гб робочих станціях (сервери 64 Гб все це добре). Ми трохи експериментували, і, можливо, спробуємо наступного разу побудувати нову робочу станцію для розробників.
Білл К

8

Це питання також буде актуальним для голанг, де ви можете просто витягнути статично пов'язані бінарні файли та запустити їх кудись, на відміну від Python або C ++, де у вас зазвичай велика кількість пов’язаних бібліотек, що призводить людей просто будувати контейнер докера середовище розвитку.

Тут можна відповісти два моменти:

Перше: має бути кращий спосіб , і є: ви можете створювати менші (і більш ефективні) контейнери для докерів, використовуючи лише середовище встановлення, що призводить до подібних переваг, як у випадку з Golang-with-environment порівняно з Golang-просто -бінарні контейнери. У випадку з Java, ви можете створити жирову банку або інстальований додаток, який містить усі банки з бібліотеки та сценарій оболонки; у випадку з Python, ви можете використовувати auditwheel для створення автономних коліс, незалежних від середовища збирання (і ви можете використовувати C ++ зі статичним зв'язком майже до такого ж ефекту).

Двоє: для чого вам потрібен докер? На землі Java ви можете зробити велику поділ між різними компонентами, використовуючи завантажувачі класів, але головне в тому, що навколо програми Java. Жодна програма Java не запускається сама по собі - якщо вона не запускається в docker, зазвичай її слід контролювати supervisord або systemd або подібні. Введіть хмару Kubernetes, Marathon або Docker, які використовують абстракцію контейнерів для віртуалізації не самого хоста, а фактично віртуалізують всю мережу таким чином, що ви можете просто розгорнути контейнери і вони працювати на якомусь випадковому хості.

Мікросервіси зазвичай працюють на докерських хмарах, оскільки це дозволяє поводитися з хазяїнами докерів як з великою рогатою худобою, а не як з домашніми тваринами та аналогічно з докерізованими програмами. Звичайно, ця абстракція стає витоковою, як тільки ви встановите томи хостів на докер і вам потрібно буде запустити контейнери докера саме на хості, який має ці обсяги. Деякі люди навіть оточують це.


5

Це дійсно гарне запитання, але після роботи з Docker я би розвернув це:

Чи заперечуються переваги JVM контейнерами (наприклад, Docker)?

Контейнери дійсно кидають виклик багатьом припущенням щодо розвитку, які випливають із мого досвіду. Наприклад, якби хтось важко кодував шлях до файлу ресурсу в додатку, багато досвідчених розробників знали б, що це проблематично, і вам слід зробити його налаштованим. Але якщо ви орієнтуєтесь на контейнер, чи справді це так? Створюючи контейнер, ви повідомляєте йому, що таке структури каталогів. Ви налаштовуєте туди шлях. Отже, ви повинні налаштувати його двічі? Яка користь? Якщо ви не змусите їх збігатися, це не спрацює так ... СУХО?

Нещодавно я створив програму-прототип з Java та Docker, яка по суті стежила за подіями GC, і коли стара частина купи потрапила до порогового відсотка, вона закриється. Потім Докер (режим рій) закрутив би новий. По суті, він усунув потребу в основних GC-циклах в JVM і дозволив докеру керувати ними. Це не спрацювало так добре, як я міг сподіватися (клієнти побачили певний вплив відключення), але це було достатньо функціонально, щоб зробити демо-версію натовпу.

Вам справді слід просто спробувати контейнери, якщо вам цікаво. Це дійсно руйнівна технологія, і вам потрібно буде впоратися з нею. Докер - чудове місце для початку, але є хоча б ще одна життєздатна альтернатива, яка корисна для всіх, IMO.


"... але існує принаймні одна інша життєздатна альтернатива, яка корисна для всіх". Якою може бути ця інша життєздатна альтернатива?
Триларіон

@Trilarion rkt (або ракета) . Наразі його підтримує Kubernetes разом із Docker.
JimmyJames
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.