Rozpracamy różne kontenery, aby obsłużyć różne obciążenia aplikacji i używamy Docker Compose do łatwego robienia tego. Każde logicznie inne obciążenie pracą jest wymienione jako inne praca. Na przykład Twój serwer HTTP Frontend zostanie wymieniony jako usługa frontendowa z obrazem Apache lub Nginx jako kontener.
Wszystkie usługi, ich potrzeby w sieci, wymagania dotyczące przechowywania itp. Można być określone w kompozycji dokera.plik YML. Będziemy skupić się na określaniu wykorzystania pamięci tutaj.
Potrzebujesz następujących narzędzi w swoim arsenale, aby śledzić:
Będziemy trzymać się wersji 2.4 dla naszego kompozycji dokera.Pliki YML, ponieważ obsługują to wersja 17.12 i wyższy silnik Docker i wyższy. Moglibyśmy pójść z wersją 3, która jest nowa, ale nie obsługuje starej składni ograniczenia pamięci. Jeśli spróbujesz użyć nowszej składni, zamiast tego nalega na użycie Dockera w trybie Swarm. Aby zachować proste znaczenie dla zwykłych użytkowników Docker, będę trzymać się wersji 2.4
Większość kodu zadziałałaby tak samo dla wersji 3, a tam, gdzie będzie różnica, wspomnę nowszą składnię dla użytkowników Docker Swarm.
Przykładowy zastosowanie
Spróbujmy uruchomić prostą usługę Nginx na porcie 80 za pomocą najpierw CLI, a następnie prostego kompozycji dokera.yml. W następnej sekcji zbadamy jego ograniczenia pamięci i wykorzystanie oraz zmodyfikujemy nasz kompozycję dokera.YML, aby zobaczyć, w jaki sposób nakładane są ograniczenia niestandardowe.
Rozpocznijmy prosty serwer Nginx za pomocą Docker-CLI:
$ Docker Run -d --Name my -nginx -p 80:80 nginx: najnowszyMożesz zobaczyć serwer Nginx działający, odwiedzając http: // localhost lub zastąpienie lcoalhostu
Z adresem IP twojego hosta Dockera. Ten pojemnik może potencjalnie wykorzystać całą dostępną pamięć na hostie Docker (w naszym przypadku jest to około 2 GB). Aby sprawdzić wykorzystanie pamięci, między innymi możemy użyć polecenia:
$ Docker Stats my-NginxZastosowanie/limit MEM wynosi 2.133 MIB z ogółem 1.934Gib. Usuńmy ten pojemnik i zacznij pisać skrypty kompozycji Docker.
$ Docker Stop my-NginxRównoważny plik YML
Dokładny pojemnik jak powyżej można utworzyć, jeśli wykonamy następujące kroki:
$ mkdir my-komposeTworzymy nowy pusty katalog i tworzymy plik kompozycji Docker.YML w nim. Kiedy uruchomimy Docker-Compose z tego katalogu, będzie szukał tego konkretnego pliku (ignorowanie wszystkiego innego) i odpowiednio stworzy nasze wdrożenie. Dodaj następujące zawartość w tym miejscu .plik YML.
Wersja: „3”Flaga -D została dodana, aby nowo utworzone kontenery działały w tle. W przeciwnym razie terminal dołączy się do kontenerów i zacznie od niego drukować raporty. Teraz możemy zobaczyć statystyki nowo utworzonego kontenera:
$ Docker Stats -wszystkieZauważysz, że podobny pojemnik, taki jak wcześniej, został utworzony z podobnymi limitami pamięci, a nawet wykorzystaniem. Z tego samego katalogu, który zawiera plik YML. Uruchom następujące polecenie, aby usunąć nowo utworzony kontener wraz z utworzoną siecią mostu klienta.
$ Docker-Compose Down
To zwróci Dockera do czystego stanu, z wyjątkiem wszelkich utworzonych tomów (nie stworzyliśmy żadnych, więc to nie jest problem.)
Limity pamięci i rezerwacje pamięci
Limity pamięci i rezerwacje pamięci to dwa różne aspekty, aby zapewnić sprawne funkcjonowanie aplikacji i hosta Docker, którego pracujesz.
Ogólnie rzecz biorąc, limit pamięci nakłada górną granicę ilości pamięci, która może potencjalnie użyć przez kontener Docker. Domyślnie kontener Docker, jak każdy inny proces systemowy, może użyć całej dostępnej pamięci hosta Docker. Może to powodować poza pamięcią, a system może bardzo dobrze zawieść. Nawet jeśli nigdy się do tego nie dojdzie, nadal może głodować inne procesy (w tym inne kontenery) z cennych zasobów, ponownie zranić wydajność. Limity pamięci zapewniają, że głodne pojemniki nie przekraczają określonego limitu. Ogranicza to promień wybuchu słabo napisanej aplikacji do kilku kontenerów, a nie całego gospodarza.
Z drugiej strony zastrzeżenia pamięci są mniej sztywne. Kiedy system jest mało pamięci i próbuje odzyskać trochę. Próbuje przynieść zużycie pamięci pojemnika na limicie rezerwacji lub poniżej. Jeśli jednak istnieje mnóstwo pamięci, aplikacja może rozwinąć do twardego limitu pamięci.
Podsumowując:
Jeśli rezerwacja pamięci jest większa niż limit pamięci, limit pamięci ma pierwszeństwo.
Określanie limitów pamięci i rezerwacji
Wersja 2
Wróćmy do kompozycji dokera.YML, który napisaliśmy wcześniej i dodajemy do niego limit pamięci. Zmień wersję na 2.4 z powodów omówionych w sekcji Wymagania wstępne.
wersja 2.4 'Ostatnia linia ustawia limit serwisu MY-Nginx na 300MIB. Możesz użyć K dla kibu i g dla gib i b dla tylko bajtów. Jednak liczba przed nim musi być liczba całkowita. Nie możesz używać wartości takich jak 2.4M, zamiast tego będziesz musiał użyć 2400k. Teraz, jeśli uruchomisz:
$ Docker Stat -AllZauważysz, że limit pamięci jest ustawiony na 300 MIB. Ustawienie rezerwacji pamięci jest równie łatwe, wystarczy dodać linię MEM_Reservation: xxx na końcu.
wersja 2.4 'Wersja 3 (opcjonalnie)
Aby użyć trzeciej wersji, musisz uruchamiać Docker w trybie Swarm. W przypadku systemu Windows i Mac możesz włączyć go za pomocą menu ustawień Docker. Użytkownicy Linux musieliby uruchomić Docker Swarm Init. Więcej informacji na ten temat można znaleźć tutaj. Nie jest to jednak konieczny krok, a jeśli go nie włączyłeś, to też jest w porządku. Ta sekcja jest dla ludzi już działający w trybie rwari i może korzystać z nowszej wersji.
Wersja: „3”Zdefiniujemy to wszystko w ramach opcji zasobów. Limity i rezerwacja stają się głównymi kluczeami własnymi, a pamięć to tylko jedno z wielu zasobów zarządzanych tutaj. CPU jest kolejnym ważnym parametrem.
Możesz dowiedzieć się więcej o kompozycji Docker z oficjalnej dokumentacji powiązanej tutaj. Po uzyskaniu istoty napisania pliku komponowania dokumentacja może pomóc Ci w różnych parametrach.
Nie musisz wiedzieć wszystkiego, po prostu wyszukaj to, czego wymaga Twoja aplikacja, a odniesienie poprowadziłoby Cię do wdrożenia.