Wdrażam pakiet Elixir spakowany w Docker
na AWS w produkcji. To był mój ulubiony sposób robienia rzeczy, ale teraz jestem bardziej skłonny do tworzenia własnego AMI przy użyciu Packera z preinstalowanym wszystkim.
Sprawa centralny w wdrożeń jest to, że kontroli, które w pewnym stopniu czuję się zrzekła gdy wykorzystując Döcker.
Główną wadą Docker jest to, że ogranicza możliwości Erlanga/Elixira, takie jak połączenie międzywęzłowe powyżej epmd
. Oznacza to również, że remsh
jest praktycznie wykluczone i chłodne :observer.start
jest nie-nie.Jeśli kiedykolwiek zechcesz wejść w interakcję z węzłem produkcyjnym, istnieje dodatkowa bariera wejścia na serwer do pierwszego ssh-ing, wejścia do Docker itp. Dobra, gdy chodzi o sprawdzanie czegoś, frustrujące, gdy produkcja jest paląca w agonii. Uruchomienie wielu kontenerów w jednym węźle jest trochę bezużyteczne, ponieważ BEAM zapewnia efektywne wykorzystanie wszystkich rdzeni. Gorące aktualizacje są praktycznie wykluczone, ale to nie jest funkcja, którą osobiście potrzebujemy.
Wysiłek polegał na tym, aby epmd
pracował w konfiguracji kontenera, na przykład: https://github.com/Random-Liu/Erlang-In-Docker, ale będzie to wymagało przebudowania Erlanga dla niestandardowych modyfikacji net_kernel
.
Firma Amazon opublikowała niedawno nową funkcję trybu AWS ECS, AWS VPC Networking, która być może ułatwi komunikację między kontenerami epmd
, a tym samym bezpośrednio do danego węzła. Nie potwierdziłem tego jeszcze.
Poza kwestią epmd
komunikacja jest kwestią czasu wdrożenia. Tworzenie obrazu za pomocą Docker, nawet jeśli masz obrazy, które mają tylko 5 MB, szybko przyniesie 300 MB, a 200 MB to tylko dla wszystkich zależności, które pozwolą na stworzenie twojego wydania. Mogą istnieć sposoby na zmniejszenie tego, ale wymaga to specjalistycznej wiedzy i poświęconego wysiłku. Chciałbym zaklasyfikować tę dodatkową przestrzeń bardziej jako rozdrażnienie, w przeciwieństwie do łamacza umów, ale uwierz mi, jeśli musisz czekać 25 minut na zakończenie niezmiennych wdrożeń, każda minuta, którą możesz zgolić, byłaby warta zachodu.
Z punktu widzenia wydajności nie zauważyłem znaczącej różnicy między nieuzasadnionymi wdrożeniami metalowymi a wdrożeniami w portach. AWS EB Docker ładnie rozszerza zasoby kontenera do zasobów instancji EC2.
Zaletą jest oczywiście możliwość przenoszenia. Jeśli masz inżyniera z przodu, który musi trafić na interfejs API JSON, to pod względem rozwoju lokalnego jest to ogromna wygrana, która dzięki starannej konfiguracji może odrodzić najnowsze api działające na lokalnym komputerze bez konieczności bycia informowanym o Erlang/Elixir./Rserve/Postgres.
Również Vendor lock-in jest znacznie zmniejszona, zwłaszcza odkąd AWS rozpoczęła swoje poparcie dla Kubernetes
Jest to kwestia kompromisów, jeśli jesteś programistą, który musi dostać się do produkcji i mają bardzo małe devops wiedzy, być może wdrożenie Docker może być uzasadnione. Jeśli znasz lepiej infrastrukturę, wdrożenia itp., To jako programista uważam, że tworzenie własnego AMI zapewnia lepszą kontrolę nad środowiskiem. W sumie zachęcałbym przynajmniej do zabawy z Docker
i eksperymentowania z nim, może otworzyć nowe królestwo możliwości.
Rzeczywiście. Używanie Dockera jest zbyteczne w środowisku wykonawczym Erlang, komplikuje rzeczy bez żadnego zysku, utrudnia proces komunikacji z wdrożonym środowiskiem wykonawczym i ma bardzo irytujący sposób subtelnego niszczenia rzeczy. Jedynym powodem, dla którego robią to sklepy, jest to, że nie wiedzą w jaki sposób wdrożyć * inny * niż Docker. To właściwie smutne oskarżenie każdej sekcji operacyjnej - ale jest to sytuacja, w której wiele grup dev/devops zajmuje się dzisiaj. – zxq9
TL/DR, nie używaj erlangu w oknie dokowanym do produkcji. Jeśli jednak wszystko, co chcesz zrobić, jest proste, to dlaczego chcesz rozpowszechniać demo (lub zestaw programistyczny), za wszelką cenę używaj okna dokowanego. – Jonke