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?
źródło
Odpowiedzi:
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.
źródło
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)
źródło
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ą.
źródło
To naprawdę dobre pytanie, ale po pracy z Dockerem chciałbym je odwrócić:
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.
źródło