Преимущества разработки с использованием Docker сводятся на нет при использовании Java по сравнению с другими языками, более близкими к двоичным файлам Unix?

53

У меня был друг, который сказал:

Докер потрясающий. Вы можете использовать его для репликации производства и всех его причуд на вашем локальном компьютере. Затем вы можете быстро развернуть этот экземпляр через все промежуточные рабочие процессы .

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

Но при использовании Java - между операционной системой и языком уже существует виртуальный уровень, обеспечивающий согласованность операций независимо от базовой операционной системы.

Возможно, в этом случае преимущества запуска Docker для разработчиков локально для репликации производственной среды сводятся на нет . (По сравнению с Ruby, PHP или Go).

Я открыт для обсуждения по этому вопросу, и мне хотелось бы услышать особую точку зрения (с доказательствами).

Преимущества разработки с использованием Docker сводятся на нет при использовании Java по сравнению с другими языками, более близкими к двоичным файлам Unix?

Hawkeye
источник
34
Как вы думаете, почему ruby ​​и php являются бинарными? Ruby и php технически даже более виртуальны, чем Java - в Java вы должны сначала скомпилировать, а затем выполнить вашу программу на виртуальной машине. В Ruby и php вы отправляете исходный код, а виртуальная машина считывает исходный код напрямую.
Slebetman
12
«Но при использовании Java - между операционной системой и языком уже существует виртуальный уровень, обеспечивающий согласованность работы независимо от базовой операционной системы». LOL. Ява изобрела «пиши один раз, тестируй везде».
Энди
2
Ява - движущаяся цель. Время от времени появляются функции, которые ломают вещи (например, ужесточение безопасности несколько лет назад было ярким примером), или вы сталкиваетесь с ошибкой, которая требует использования определенной версии. Гораздо проще контролировать это в докере, чем использовать собственную систему упаковки хост-компьютера.
Торбьерн Равн Андерсен
1
«обеспечение согласованности операций независимо от базовой операционной системы». Обратите внимание, что обеспечение согласованного поведения среды выполнения языка не отменяет тот факт, что у вас, вероятно, все еще есть некоторые внешние зависимости. Может быть что-то такое же простое, как использование определенного пути к файлу для ваших журналов.
jpmc26

Ответы:

86

Не за что.

Представьте, что вы используете версию 1.8.0 Java как на своей машине для разработки, так и на сервере. Кстати, вы работаете одновременно над двумя проектами, оба из которых используют Java.

Однажды в JVM обнаружена ошибка, и серверы, на которых запущен первый проект, над которым вы работаете, перенесены на 1.8.1. Кстати, эта ошибка не затрагивает серверы, на которых выполняется второй проект, и управляется другой командой системных администраторов, которые могут не захотеть обновиться до версии 1.8.1.

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

Это может вас не беспокоить (пока один сервер не перейдет на 1.9, а другой сохраняет старую версию), но это будет означать, что вы больше не реплицируете производственную среду на локальном компьютере, что делает возможным крошечный ошибки, чтобы закрасться.

Если вы представляете, что ваша файловая система, ваши зависимости, ваши настройки безопасности, ваша локальная конфигурация и ваша версия самого Linux отличаются от рабочей, вы подвергаете себя риску написания кода, который в работе не даст результатов. Вместо того, чтобы рисковать, вы можете использовать виртуализацию или Docker с минимальными или без потерь производительности.

Арсений Мурзенко
источник
20
Также такого рода вещи происходят ВСЕ время в крупных компаниях. Это не просто теоретическая вещь.
enderland
5
Что вы делаете, когда обнаруживаете ошибку в Docker?
Оуэн
Также Java 9 сломает вещи. Там будет достаточно усилий, необходимых.
Турбьерн Равн Андерсен
8
@Owen То же самое вы делаете, когда находите ошибку в Java. Или в {Linux, Windows}. Или в вашем процессоре .
Кролтан
1
@Trilarion: Да, хотя в основном в форме сообщений в блоге разработчиков компании. Тем не менее, любая из ссылок «Узнать больше» на docker.com/customers предоставит примеры крупных компаний, использующих docker для решения таких проблем. Тем не менее, обычно такие компании считали само собой разумеющимся, что им нужно идеальное соответствие между производством и разработкой, и достигли этого с помощью виртуальных машин. Позже они поняли: «Эй, Docker решает ту же проблему, что и виртуальные машины, за исключением того, что он работает быстрее и может использоваться для обеспечения согласованности развертываний».
Брайан
35

Вы редко просто развертываете «Java-приложение». В вашем Java-приложении много разных программ поддержки. Мы используем Apache HTTPD, Apache Tomcat, ActiveMQ для обмена сообщениями, FTP Deamon, MySQL и несколько пользовательских служб для интеграции с программами, которые не работают напрямую с Java.

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

Для установки новой рабочей станции требуется полный рабочий день или неделя - мы обсудили переход на Docker, чтобы упростить эту проблему. Было бы удивительно, если бы мы смогли надежно развернуть новую рабочую станцию ​​за пару часов.

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

(20 кажется довольно болезненным для приложения, которое работает только на одном сервере одновременно ... но умножьте этот сервер на кластеры (x2), test / staging / prod (x3), внутренний / внешний (x2) и основной сайт / резервное копирование сайта (х2) и вы там довольно быстро)

Билл К
источник
Почему бы не сделать изображения?
Дмитрий Кудрявцев
Мы надеемся Мы небольшая команда, пытающаяся добавить функции в довольно интенсивно используемую / важную систему, и у нас недостаточно контроля над серверами, чтобы диктовать их развертывание. Можно использовать его для dev, хотя мы уже довольно ограничены в 32 Мб оперативной памяти - я предполагаю, что запуск из образа докера будет иметь некоторые накладные расходы ... но мы планируем двигаться в этом направлении.
Билл К
Я имел ввиду для рабочих станций
Дмитрий Кудрявцев
Время и память - нам уже нужно оставлять куски для работы на наших 32-гигабайтных рабочих станциях (64-гигабайтные серверы работают нормально). Мы немного поэкспериментировали и можем попробовать в следующий раз, когда нам понадобится создать новую рабочую станцию ​​для разработчиков.
Билл К
8

Этот вопрос также был бы уместен для golang, где вы можете просто извлечь статически связанные двоичные файлы и запустить их где-нибудь, в отличие от Python или C ++, где у вас обычно есть большое количество связанных библиотек, которые заставляют людей просто создавать Docker-контейнер из среда разработки.

Здесь нужно ответить на два вопроса:

Один: должен быть лучший способ , и он есть: вы можете создавать меньшие (и более эффективные) контейнеры Docker, используя только среду установки, что дает такие же преимущества, как в случае Golang-with-environment по сравнению с Golang-just -бинарные контейнеры. В случае Java вы можете создать толстый jar или устанавливаемое приложение, которое содержит все библиотечные jar и скрипт оболочки; в случае с Python вы можете использовать AuditWheel для создания автономных колес, которые не зависят от среды сборки (и вы можете использовать C ++ со статической связью с почти таким же эффектом).

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

Микросервисы обычно работают в облаках, основанных на докере, потому что это позволяет вам относиться к вашим хостам докера как к рогатому скоту, а не как к домашним животным, и аналогично с докеризованными приложениями. Конечно, эта абстракция становится утечкой, как только вы монтируете тома хоста в докер и вам нужно запускать контейнеры докера именно на том хосте, на котором есть эти тома. Некоторые люди даже с этим справляются.

Янник
источник
5

Это действительно хороший вопрос, но после работы с Docker я бы перевернул его:

Преимущества JVM сводятся на нет контейнеризацией (например, Docker)?

Контейнеры действительно бросают вызов многим предположениям, которые у меня есть относительно разработки, которые исходят из моего опыта. Например, если кто-то жестко закодирует путь к файлу ресурса в приложении, многие опытные разработчики будут знать, что это проблематично, и вы должны сделать его настраиваемым. Но если вы нацеливаетесь на контейнер, действительно ли это так? Когда вы создаете контейнер, вы сообщаете ему, каковы структуры каталогов. Вы настраиваете путь там. Так стоит ли настраивать его дважды? В чем выгода? Если вы не сделаете их совпадающими, это не сработает так ... СУХОЙ?

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

Вы действительно должны просто попробовать контейнеры, если вам интересно. Это действительно разрушительная технология, и вам нужно с ней разобраться. Докер - отличное место для старта, но есть, по крайней мере, еще одна жизнеспособная альтернатива, которая хороша для всех, IMO.

JimmyJames
источник
«... но есть, по крайней мере, еще одна жизнеспособная альтернатива, которая полезна для всех». Так что же это может быть за еще одна жизнеспособная альтернатива?
Триларион
@ Триларион РКТ (или ракета) . В настоящее время он поддерживается Kubernetes вместе с Docker.
JimmyJames