Це питання також буде актуальним для голанг, де ви можете просто витягнути статично пов'язані бінарні файли та запустити їх кудись, на відміну від Python або C ++, де у вас зазвичай велика кількість пов’язаних бібліотек, що призводить людей просто будувати контейнер докера середовище розвитку.
Тут можна відповісти два моменти:
Перше: має бути кращий спосіб , і є: ви можете створювати менші (і більш ефективні) контейнери для докерів, використовуючи лише середовище встановлення, що призводить до подібних переваг, як у випадку з Golang-with-environment порівняно з Golang-просто -бінарні контейнери. У випадку з Java, ви можете створити жирову банку або інстальований додаток, який містить усі банки з бібліотеки та сценарій оболонки; у випадку з Python, ви можете використовувати auditwheel для створення автономних коліс, незалежних від середовища збирання (і ви можете використовувати C ++ зі статичним зв'язком майже до такого ж ефекту).
Двоє: для чого вам потрібен докер? На землі Java ви можете зробити велику поділ між різними компонентами, використовуючи завантажувачі класів, але головне в тому, що навколо програми Java. Жодна програма Java не запускається сама по собі - якщо вона не запускається в docker, зазвичай її слід контролювати supervisord або systemd або подібні. Введіть хмару Kubernetes, Marathon або Docker, які використовують абстракцію контейнерів для віртуалізації не самого хоста, а фактично віртуалізують всю мережу таким чином, що ви можете просто розгорнути контейнери і вони працювати на якомусь випадковому хості.
Мікросервіси зазвичай працюють на докерських хмарах, оскільки це дозволяє поводитися з хазяїнами докерів як з великою рогатою худобою, а не як з домашніми тваринами та аналогічно з докерізованими програмами. Звичайно, ця абстракція стає витоковою, як тільки ви встановите томи хостів на докер і вам потрібно буде запустити контейнери докера саме на хості, який має ці обсяги. Деякі люди навіть оточують це.