Niektóre z najczęstszych pytań zadawanych przez naszych użytkowników dotyczą obsługi MariaDB w Dockerze, a w szczególności tego, jak można jej używać w określonych wdrożeniach programistycznych lub produkcyjnych. W tej serii artykułów spróbujemy omówić kilka przypadków użycia platformy Docker i MariaDB.
Dlaczego warto wybrać Docker dla MariaDB?
- Kontenery Dockera mogą być używane do testowania, wdrażania i udostępniania aplikacji w dowolnym środowisku.
- Wdrożenia platformy Docker można łatwo zautomatyzować, tworząc środowiska wdrożeniowe i łatwo je odtwarzając na etapie przejściowym i produkcyjnym.
- Docker to lekka wirtualizacja. Hipernadzorcy nie są potrzebne, a kontener Docker MariaDB powinien działać tak samo dobrze, jak normalna instalacja MariaDB bez zauważalnych narzutów.
- Docker jest agnostyczny – po zainstalowaniu platformy Docker w systemie operacyjnym instrukcje uruchamiania kontenerów są dokładnie takie same, niezależnie od tego, czy korzystasz z CentOS, Debiana czy Ubuntu, czy nawet Mac OS X i Windows.
Kilka ważnych punktów dotyczących kontenerów Docker
- Kontenery Dockera są niezmienne. Nie można ich łatwo modyfikować po uruchomieniu (chyba że się do nich przyczepisz i wszystko popsujesz).
- Domyślnie iz powodu powyższego dane nie są trwałe. Docker używa wolumenów danych, aby temu zaradzić. Kontener MariaDB używa woluminu do przechowywania danych (więcej o tym później).
Stan MariaDB w Dockerze
MariaDB zawsze była bardzo dobrze obsługiwana w Docker przez kilka lat, dzięki wielu wysiłkom zespołu i społeczności Dockera. Do dziś Docker obsługuje wszystkie trzy wydania MariaDB:5.5, 10.0 i 10.1. Kontener dokowany MariaDB ma następujące cechy szczególne:
- Hasło root MariaDB można ustawić lub wygenerować za pomocą zmiennych środowiskowych.
- Nowego użytkownika i pustą bazę danych można utworzyć w tym samym procesie, co powyżej.
- Instancja ma domyślny trwały wolumin danych /var/lib/mysql, którym możesz pozwolić Dockerowi zarządzać wewnętrznie lub zamontować w wybranym katalogu.
- Instancję kontenera można zamontować na istniejącym wolumenie danych (na przykład kopii zapasowej).
- Porty sieciowe można powiązać z dowolnymi portami po stronie hosta.
- Baza wiedzy MariaDB zawiera obszerny artykuł z dokumentacją na temat platformy Docker. Przeczytaj to!
Przypadek użycia platformy Docker nr 1:Wielu dzierżawców
Typowym przypadkiem użycia MariaDB i Docker jest uruchamianie kilku wystąpień MariaDB na tych samych hostach fizycznych. Istnieją już rozwiązania, takie jak MySQL Sandbox i inne, jednak żadne z nich nie zapewnia elastyczności, łatwości użytkowania i możliwości oferowanych przez Docker.
Aby zilustrować nasz punkt widzenia, zacznijmy od trzech różnych instancji MariaDB, z których każda działa w innej wersji głównej:
docker run -d -p 3301:3306 -v ~/mdbdata/mdb55:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 -v ~/mdbdata/mdb10:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb10 mariadb:10.0
docker run -d -p 3303:3306 -v ~/mdbdata/mdb11:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb11 mariadb:10.1
Docker automatycznie pobierze oficjalne obrazy mariadb z repozytorium i uruchomi je. Teraz możemy po prostu połączyć się z dowolną z tych instancji przy użyciu podanego portu i hasła:
$ mysql -u root -padmin -h 127.0.0.1 -P3302 Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 2 Server version: 10.0.22-MariaDB-1~jessie mariadb.org binary distribution
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
Pamiętaj, że każda z naszych instancji będzie korzystać z trwałego wolumenu danych znajdującego się pod ~/mdbdata katalog – Docker automatycznie utworzy dla nas to drzewo katalogów.
Teraz, gdy już to zrobiliśmy, zagłębimy się w zaawansowane funkcje Dockera. Docker obsługuje grupy kontrolne systemu Linux (cgroups), które mogą służyć do ograniczania, rozliczania lub izolowania użycia zasobów. Załóżmy, że chcemy mieć naszą instancję MariaDB 10.1 (o nazwie mdb11 ), aby mieć wyższy priorytet procesora niż dwie pozostałe instancje. W takim przypadku możemy obniżyć udziały procesora w mdb10 i mdb55 . Każda instancja ma domyślnie 1024 maksymalne udziały procesora, więc odtwórzmy nasze mdb55 i mdb10 kontenery z 512 udziałami procesora każdy.
W preambule powiedzieliśmy, że kontenery Dockera są niezmienne. Jeśli chcemy zmienić parametry naszych kontenerów, musimy je usunąć. Nie stanowi to problemu, ponieważ zdefiniowaliśmy trwałe woluminy danych w ~/mdbdata, więc rzeczywista zawartość naszej bazy danych pozostanie niezmieniona, gdy odtworzymy kontenery.
docker rm -f mdb55 mdb10
docker run -d -p 3301:3306 --cpu-shares=512 -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --cpu-shares=512 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
Odtworzyliśmy dwie instancje MariaDB z 512 udziałami procesora każda. Jest to jednak miękki limit i jest wymuszany tylko wtedy, gdy procesy konkurują o cykle procesora. Jeśli inne instancje są bezczynne, każda instancja może wykorzystać do 100% wszystkich procesorów. W praktyce oznacza to, że jeśli wszystkie trzy instancje używają procesora jednocześnie, każdy z dwóch pierwszych kontenerów, z których każdy ma 512 udziałów, (mdb55 i mdb10 ) będzie w stanie wykorzystać do 25% wszystkich procesorów, podczas gdy trzeci kontener, który ma 1024 udziałów, będzie w stanie wykorzystać do 50% wszystkich procesorów.
Inną opcją jest powiązanie instancji z konkretnym rdzeniem procesora, więc odtwórzmy kontenery i zróbmy to:
docker rm -f mdb55 mdb10 mdb11
docker run -d -p 3301:3306 --cpuset-cpus=0 -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --cpuset-cpus=1 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
docker run -d -p 3303:3306 --cpuset-cpus=2-3 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb11 mariadb:10.1
W powyższym przykładzie, biorąc pod uwagę system 4-procesorowy, moje kontenery mdb55 i mdb10 będzie działać na oddzielnym, pojedynczym rdzeniu procesora, podczas gdy mdb11 oba pozostałe rdzenie.
Możemy również kontrolować sposób, w jaki nasze kontenery uzyskują dostęp do zasobów dysku i pamięci, co jest zdecydowanie przydatne w obciążonym systemie — na przykład nie chcesz, aby niekontrolowane zapytanie programistyczne wykorzystywało cały dysk instancji testowania obciążenia. Podczas gdy limity pamięci są proste, udziały we/wy bloków działają w podobny sposób jak udziały procesora, z wyjątkiem tego, że domyślny udział we/wy bloków wynosi 500 w zakresie od 10 do 1000.
Ograniczmy nasze dwa pierwsze kontenery do 512 MB pamięci i 250 bloków udziałów IO:
docker rm -f mdb55 mdb10
docker run -d -p 3301:3306 --blkio-weight=250 --memory=512M -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --blkio-weight=250 --memory=512M -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
Podobnie jak w przypadku akcji CPU, jeśli trzy instancje konkurują o IO, każdy z dwóch pierwszych kontenerów będzie ograniczony do 25% dostępnej pojemności IO, a trzeci kontener będzie ograniczony do pozostałej pojemności, np. 50%.
Jest znacznie więcej ograniczeń środowiska uruchomieniowego Dockera niż to, o czym mówiliśmy w tym artykule. Przeczytaj obszerną dokumentację dotyczącą uruchamiania platformy Docker, aby dowiedzieć się o wszystkich możliwych opcjach.