Docker komponuje - limity pamięci

Docker komponuje - limity pamięci
Docker Compose to potężne narzędzie. Oszczędza czas i zmniejsza błędy podczas wdrażania aplikacji dokera. Zwykle nie jest świetnym pomysłem, aby uruchomić cały stos, w tym frontend, serwer bazy danych itp.

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.

Wymagania wstępne

Potrzebujesz następujących narzędzi w swoim arsenale, aby śledzić:

  1. Podstawowe zrozumienie Dockera
  2. Docker dla systemu Windows lub Mac lub jeśli używasz Linux, Dockerce dla Linux
  3. Docker komponuje binarny (użytkownicy Windows i Mac już to zainstalowane)

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: najnowszy

Moż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-Nginx
Nazwa identyfikatora kontenera % MEP Zastosowanie/limit MEP % Net Net I/O Blok I/O PIDS
6EB0091C0CF2 MY-NGINX 0.00% 2.133 MIB / 1.934gib 0.11% 3.14KB / 2.13KB 0B / 0B 2

Zastosowanie/limit MEM wynosi 2.133 MIB z ogółem 1.934Gib. Usuńmy ten pojemnik i zacznij pisać skrypty kompozycji Docker.

$ Docker Stop my-Nginx
$ Docker rm my-nginx

Równoważny plik YML

Dokładny pojemnik jak powyżej można utworzyć, jeśli wykonamy następujące kroki:

$ mkdir my-kompose
$ CD my-kompose
$ vim Docker-Compose.yml

Tworzymy 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”
Usługi:
My-Nginx:
Zdjęcie: nginx: najnowszy
Porty:
- „80:80”
$ Docker -Compose Up -d

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 -wszystkie
Nazwa identyfikatora kontenera% MEP Zastosowanie/limit MEP% Net Net I/O Blok I/O PIDS
5F8A1E2C08AC my-compose_my-nginx_1 0.00% 2.25 MIB/1.934gib 0.11% 1.65KB/0B 7.35 MB/0B 2

Zauważ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:

  1. Limit pamięci: ścisły górny limit do ilości pamięci udostępnionej kontenerowi.
  2. Rezerwacja pamięci: należy to ustawić jako absolutną ilość pamięci, którą aplikacja musi uruchomić poprawnie. Więc nie rozbija się ani nie zachowuje się, gdy system próbuje odzyskać część pamięci.

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 '
Usługi:
My-Nginx:
Zdjęcie: nginx: najnowszy
Porty:
- „80:80”
MEM_LIMIT: 300m

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 -All
Nazwa identyfikatora kontenera % MEP Zastosowanie/limit MEP % Net Net I/O Blok I/O PIDS
44114d785d0a my-compose_my-nginx_1 0.00% 2.141 MIB/300MIB 0.71% 1.16KB/0B 0B/0B 2

Zauważ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 '
Usługi:
My-Nginx:
Zdjęcie: nginx: najnowszy
Porty:
- „80:80”
MEM_LIMIT: 300m
MEM_RESSERWACJA: 100m

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”
Usługi:
My-Nginx:
Zdjęcie: nginx: najnowszy
Porty:
- „80:80”
wdrożyć:
zasoby:
Limity:
Pamięć: 300m
Rezerwacje:
Pamięć: 100m

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.

Dalsza informacja

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.