Czy korzyści rozwojowe wynikające z używania Dockera są zaniżone podczas korzystania z Java w porównaniu z innymi językami bliższymi binariom Uniksa?

53

Miałem przyjaciela, który powiedział:

Docker jest niesamowity. Możesz go użyć do replikacji produkcji i wszystkich jej dziwactw na komputerze lokalnym. Następnie możesz szybko wdrożyć tę instancję przez wszystkie przepływy pracy pomostowej .

Byłoby to prawdą, gdyby programiści pisali Ruby, PHP lub Go - tam gdzie było binarne łącze kierunku do systemu operacyjnego.

Ale podczas korzystania z Java - istnieje już wirtualna warstwa między systemem operacyjnym a językiem, co zapewnia spójność działania niezależnie od systemu operacyjnego.

Prawdopodobnie w tym przypadku korzyści wynikające z lokalnego uruchomienia Dockera dla programistów w celu replikacji środowiska produkcyjnego są zanegowane . (W porównaniu do Ruby, PHP lub Go).

Jestem otwarty na dyskusję na ten temat i chętnie słyszę odrębny punkt widzenia (z dowodami).

Czy korzyści rozwojowe wynikające z używania Dockera są zaniżone podczas korzystania z Java w porównaniu z innymi językami bliższymi binariom Uniksa?

Sokole Oko
źródło
34
Jak myślisz, dlaczego ruby ​​i php są binarne? Ruby i php są technicznie jeszcze bardziej wirtualne niż Java - w Javie musisz najpierw skompilować, a następnie uruchomić program na maszynie wirtualnej. W Ruby i php wysyłasz kod źródłowy, a maszyna wirtualna odczytuje źródło bezpośrednio.
slebetman
12
„Ale podczas korzystania z Java - istnieje już wirtualna warstwa między systemem operacyjnym a językiem, co zapewnia spójność działania niezależnie od systemu operacyjnego.” LOL. Java wynalazła „pisz raz, testuj wszędzie”.
Andy,
2
Java jest ruchomym celem. Czasami wprowadzane są funkcje, które psują rzeczy (zaostrzenie bezpieczeństwa kilka lat temu było najlepszym przykładem) lub napotykasz błąd, który wymaga użycia określonej wersji. O wiele łatwiej jest to kontrolować w oknie dokowanym niż przy użyciu natywnego systemu pakowania komputera hosta.
Thorbjørn Ravn Andersen
1
„zapewnianie spójności działania bez względu na system operacyjny” Należy pamiętać, że konsekwentne zachowanie środowiska wykonawczego języka nie neguje faktu, że prawdopodobnie nadal występują pewne zależności zewnętrzne. Może to być coś tak prostego, jak użycie określonej ścieżki pliku dla dzienników.
jpmc26,

Odpowiedzi:

86

Ani trochę.

Wyobraź sobie, że używasz wersji 1.8.0 Java zarówno na komputerze programistycznym, jak i na serwerze. Nawiasem mówiąc, pracujesz jednocześnie nad dwoma projektami, oba przy użyciu Java.

Pewnego dnia w JVM znaleziono błąd, a serwery, które uruchamiają pierwszy projekt, nad którym pracujesz, są migrowane do wersji 1.8.1. Nawiasem mówiąc, serwery z drugim projektem nie są dotknięte błędem i są zarządzane przez inny zespół administratorów systemu, którzy mogą nie chcieć aktualizować do wersji 1.8.1.

Teraz, przynajmniej dla jednego z projektów, używasz innej wersji Javy.

Może to nie przeszkadzać zbytnio (dopóki jeden serwer nie migruje do wersji 1.9, podczas gdy drugi zachowuje starą wersję), ale to oznacza, że ​​nie replikujesz już środowiska produkcyjnego na komputerze lokalnym, co umożliwia małe błędy, aby się wkraść.

Jeśli wyobrażasz sobie, że twój system plików, twoje zależności, ustawienia bezpieczeństwa, lokalna konfiguracja i wersja systemu Linux różnią się od wersji produkcyjnej, narażasz się na ryzyko napisania kodu, który nie powiedzie się podczas produkcji. Zamiast podejmować to ryzyko, możesz używać wirtualizacji lub Dockera, z niewielką lub żadną utratą wydajności.

Arseni Mourzenko
źródło
20
Również w większych firmach dzieje się tak przez cały czas. To nie tylko kwestia teoretyczna.
enderland
5
Co robisz po wykryciu błędu w Dockerze?
Owen,
Również Java 9 coś zepsuje. Konieczny będzie pewien wysiłek.
Thorbjørn Ravn Andersen
8
@Owen To samo, co robisz, gdy znajdziesz błąd w Javie. Lub w {Linux, Windows}. Lub w twoim procesorze .
Kroltan
1
@Trilarion: Tak, choć głównie w formie postów na blogach autorstwa programistów. To powiedziawszy, dowolny z linków „Dowiedz się więcej” na stronie docker.com/customers poda przykłady dużych firm korzystających z Dockera do rozwiązania takich problemów. To powiedziawszy, zwykle takie firmy przyjmowały za pewnik, że potrzebują idealnego dopasowania między produkcją a rozwojem i osiągnęły to dzięki maszynom wirtualnym. Później zdali sobie sprawę, „hej, Docker rozwiązuje ten sam problem co maszyny wirtualne, z tym wyjątkiem, że działa szybciej i może być używany do zachowania spójności wdrożeń”.
Brian,
35

Rzadko po prostu wdrażasz „aplikację Java”. Twoja aplikacja Java ma wiele różnych programów wsparcia. Do przesyłania wiadomości używamy Apache HTTPD, Apache Tomcat, ActiveMQ, FTP Deamon, MySQL i kilku niestandardowych usług do integracji z programami, które nie działają bezpośrednio z Javą.

To nawet nie wchodzi w skład tworzonego oprogramowania - zaćmienie, mrówka, Adobe Flex, groovy, Firefox i subversion (pomijam sporo)

Utworzenie nowej stacji roboczej zajmuje cały dzień i tydzień - omówiliśmy przejście do Docker, aby uprościć ten problem. Byłoby niesamowicie, gdybyśmy mogli rzetelnie uruchomić nową stację roboczą w ciągu kilku godzin.

Nie wspominając już o tym, że podczas wdrażania musimy utrzymywać ponad - 20 serwerów; Docker zaczyna wyglądać na całkiem niezłą ofertę!

(20 wydaje się dość bolesne dla aplikacji, która działa tylko na jednym serwerze naraz ... ale pomnóż ten serwer przez klastry (x2), test / staging / prod (x3), wewnętrzny / zewnętrzny (x2) i główną stronę / backup site (x2) i szybko się tam dostaniesz)

Bill K.
źródło
Dlaczego nie robić zdjęć?
Dmitry Kudriavtsev
Mamy nadzieję. Jesteśmy małym zespołem, który próbuje dodać funkcje do dość intensywnie używanego / ważnego systemu i nie mamy wystarczającej kontroli nad serwerami, aby dyktować ich wdrożenie. Mogę go jednak użyć do tworzenia, jesteśmy już dość ograniczeni przy pamięci RAM o pojemności 32 MB - zakładam, że ucieczka z obrazu dokera będzie miała trochę narzutu ... ale naszym planem jest pójście w tym kierunku.
Bill K
Miałem na myśli stacje robocze
Dmitrij Kudriavtsev
Czas i pamięć - musimy już zostawić kawałki, aby działały na naszych stacjach roboczych 32 GB (serwery 64 GB działają dobrze). Jednak trochę eksperymentowaliśmy i może spróbujemy następnym razem, gdy będziemy musieli zbudować nową stację roboczą dla programistów.
Bill K
8

To pytanie dotyczyłoby również golanga, w którym można po prostu wyodrębnić statycznie połączone pliki binarne i uruchomić je gdzieś, w przeciwieństwie do Pythona lub C ++, w którym zwykle istnieje duża liczba powiązanych bibliotek, co prowadzi ludzi do zbudowania kontenera dokującego z środowisko programistyczne.

Tutaj należy odpowiedzieć na dwa punkty:

Po pierwsze: musi być lepszy sposób i jest: możesz budować mniejsze (i bardziej wydajne) kontenery dokujące przy użyciu samego środowiska instalacyjnego, co prowadzi do podobnych korzyści, jak w przypadku Golang-z-środowiskiem w porównaniu z Golang-just -binarne pojemniki. W przypadku Javy możesz zbudować gruby słoik lub instalowalną aplikację, która zawiera wszystkie słoiki biblioteki i skrypt powłoki; w przypadku Pythona możesz użyć audwheel do zbudowania niezależnych kół, które są niezależne od środowiska kompilacji (i możesz użyć C ++ ze statycznym łączeniem do prawie tego samego efektu).

Po drugie: do czego potrzebujesz dokera? W środowisku Java można dokonać dużej separacji między różnymi komponentami za pomocą modułów ładujących klasy, ale głównym punktem jest to, co dotyczy aplikacji Java. Żadna aplikacja Java nie działa sama - jeśli nie działa w oknie dokowanym, zwykle musiałaby być nadzorowana przez administratora, systemd lub podobnego. Wejdź do chmury Kubernetes, Marathon lub Docker, która używa abstrakcji kontenera do wirtualizacji nie samego hosta, ale faktycznie wirtualizuje całą sieć, dzięki czemu możesz po prostu wdrożyć kontenery i działają one na losowym hoście.

Mikrousługi zwykle działają w chmurach opartych na dokerach, ponieważ pozwalają traktować hostów dokerów jak bydło, a nie zwierzęta domowe i podobnie z aplikacjami dokowanymi. Oczywiście ta abstrakcja staje się nieszczelna, gdy montujesz woluminy hosta w dokerze i musisz uruchomić kontenery dokowania dokładnie na hoście, który ma te woluminy. Niektórzy ludzie nawet sobie z tym radzą.

Yannick
źródło
5

To naprawdę dobre pytanie, ale po pracy z Dockerem chciałbym je odwrócić:

Czy zalety JVM są negowane przez konteneryzację (np. Docker)?

Kontenery naprawdę kwestionują wiele założeń dotyczących rozwoju, które wynikają z mojego doświadczenia. Na przykład, jeśli ktoś zaprogramuje na stałe ścieżkę do pliku zasobów w aplikacji, wielu doświadczonych programistów będzie wiedziało, że jest to problematyczne i powinieneś umożliwić konfigurację. Ale jeśli celujesz w kontener, czy tak jest naprawdę? Kiedy budujesz kontener, mówisz mu, jakie są struktury katalogów. Konfigurujesz tam ścieżkę. Więc powinieneś to skonfigurować dwukrotnie? Jaka jest korzyść? Jeśli nie dopasujesz ich, to nie będzie działać, więc ... SUCHO?

Niedawno stworzyłem prototypową aplikację z Javą i Dockerem, która zasadniczo obserwowała zdarzenia GC, a kiedy stara część sterty osiągnęła próg procentowy, sam się zamknął. Docker (tryb roju) uruchamia nowy. Zasadniczo wyeliminowało to potrzebę dużych cykli GC w JVM i pozwoliło dokerowi nimi zarządzać. Nie działało tak dobrze, jak się spodziewałem (klienci zauważyli pewien wpływ zamknięcia), ale było wystarczająco funkcjonalne, aby zrobić demo na żywo dla tłumu.

Jeśli naprawdę jesteś ciekawy, powinieneś po prostu wypróbować pojemniki. To naprawdę przełomowa technologia, z którą trzeba się zmierzyć. Docker to świetne miejsce na start, ale istnieje co najmniej jedna realna alternatywa, która jest dobra dla wszystkich, IMO.

JimmyJames
źródło
„... ale istnieje co najmniej jedna realna alternatywa, która jest dobra dla wszystkich”. Więc co to może być ta inna realna alternatywa?
Trilarion,
@Trilarion rkt (lub rakieta) . Jest obecnie obsługiwany przez Kubernetes wraz z Dockerem.
JimmyJames,