Docker stał się najpopularniejszym narzędziem do tworzenia, wdrażania i uruchamiania aplikacji przy użyciu kontenerów. Pozwala nam spakować aplikację ze wszystkimi potrzebnymi jej częściami, takimi jak biblioteki i inne zależności, i wysłać to wszystko jako jeden pakiet. Docker można uznać za maszynę wirtualną, ale zamiast tworzyć cały wirtualny system operacyjny, Docker umożliwia aplikacjom korzystanie z tego samego jądra Linuksa, co system, na którym działają, i wymaga jedynie dostarczenia aplikacji z elementami, na których jeszcze nie działają komputer hosta. Daje to znaczny wzrost wydajności i zmniejsza rozmiar aplikacji.
W tym blogu zobaczymy, jak możemy łatwo wdrożyć konfigurację PostgreSQL za pomocą Dockera i jak zmienić naszą konfigurację w konfigurację replikacji podstawowej/wstrzymanej za pomocą ClusterControl.
Jak wdrożyć PostgreSQL za pomocą Dockera
Najpierw zobaczmy, jak ręcznie wdrożyć PostgreSQL za pomocą Dockera, używając obrazu Docker PostgreSQL.
Obraz jest dostępny w Docker Hub i można go znaleźć w wierszu poleceń:
$ docker search postgres
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
postgres The PostgreSQL object-relational database sy… 6519 [OK]
Weźmiemy pierwszy wynik. Oficjalny. Musimy więc wyciągnąć obraz:
$ docker pull postgres
I uruchom kontenery węzłów mapujące port lokalny na port bazy danych w kontenerze:
$ docker run -d --name node1 -p 6551:5432 postgres
$ docker run -d --name node2 -p 6552:5432 postgres
$ docker run -d --name node3 -p 6553:5432 postgres
Po uruchomieniu tych poleceń powinieneś mieć utworzone następujące środowisko Docker:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51038dbe21f8 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6553->5432/tcp node3
b7a4211744e3 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6552->5432/tcp node2
229c6bd23ff4 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6551->5432/tcp node1
Teraz możesz uzyskać dostęp do każdego węzła za pomocą następującego polecenia:
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (11.2 (Debian 11.2-1.pgdg90+1))
Type "help" for help.
postgres=#
Następnie możesz utworzyć użytkownika bazy danych, zmienić konfigurację zgodnie z własnymi wymaganiami lub ręcznie skonfigurować replikację między węzłami.
Jak zaimportować kontenery PostgreSQL do ClusterControl
Powiązane zasoby ClusterControl for PostgreSQL Wdrażanie PostgreSQL w kontenerze Docker Używanie Kubernetes do wdrażania PostgreSQLTeraz, gdy masz już skonfigurowany klaster PostgreSQL, nadal musisz go monitorować, ostrzegać w przypadku problemów z wydajnością, zarządzać kopiami zapasowymi, wykrywać awarie i automatycznie przełączać się na sprawny serwer.
Jeśli masz już klaster PostgreSQL działający na platformie Docker i chcesz, aby ClusterControl nim zarządzał, możesz po prostu uruchomić kontener ClusterControl w tej samej sieci Docker, co kontenery bazy danych. Jedynym wymaganiem jest upewnienie się, że kontenery docelowe mają zainstalowane pakiety związane z SSH (openssh-server, openssh-clients). Następnie zezwól na bezhasłowe SSH z ClusterControl do kontenerów bazy danych. Po zakończeniu użyj funkcji „Importuj istniejący serwer/klaster”, a klaster należy zaimportować do ClusterControl.
Najpierw zainstalujmy pakiety związane z OpenSSH w kontenerach bazy danych, zezwólmy na logowanie roota, uruchom go i ustawmy hasło roota:
$ docker exec -ti [db-container] apt-get update
$ docker exec -ti [db-container] apt-get install -y openssh-server openssh-client
$ docker exec -it [db-container] sed -i 's|^PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -it [db-container] sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -ti [db-container] service ssh start
$ docker exec -it [db-container] passwd
Uruchom kontener ClusterControl (jeśli nie jest uruchomiony) i przekieruj port 80 w kontenerze do portu 5000 na hoście:
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Sprawdź, czy kontener ClusterControl jest uruchomiony:
$ docker ps | grep clustercontrol
7eadb6bb72fb severalnines/clustercontrol "/entrypoint.sh" 4 hours ago Up 4 hours (healthy) 22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp clustercontrol
Otwórz przeglądarkę internetową, przejdź do http://[Docker_Host]:5000/clustercontrol i utwórz domyślnego użytkownika i hasło administratora. Powinieneś teraz zobaczyć główną stronę ClusterControl.
Ostatnim krokiem jest skonfigurowanie bezhasłowego SSH do wszystkich kontenerów bazy danych. W tym celu musimy znać adres IP każdego węzła bazy danych. Aby to wiedzieć, możemy uruchomić następujące polecenie dla każdego węzła:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.6",
Następnie podłącz do interaktywnej konsoli kontenera ClusterControl:
$ docker exec -it clustercontrol bash
Skopiuj klucz SSH do wszystkich kontenerów bazy danych:
$ ssh-copy-id 172.17.0.6
$ ssh-copy-id 172.17.0.7
$ ssh-copy-id 172.17.0.8
Teraz możemy zacząć importować klaster do ClusterControl. Otwórz przeglądarkę internetową i przejdź do adresu IP fizycznego hosta platformy Docker z zamapowanym portem, np. http://192.168.100.150:5000/clustercontrol , kliknij „Importuj istniejący serwer/klaster”, a następnie dodaj następujące informacje.
Musimy określić Użytkownika, Klucz lub Hasło i port, aby połączyć się przez SSH z naszymi serwerami. Potrzebujemy również nazwy dla naszego nowego klastra.
Po skonfigurowaniu informacji o dostępie SSH, musimy zdefiniować użytkownika bazy danych, wersję, basedir oraz adres IP lub nazwę hosta dla każdego węzła bazy danych.
Upewnij się, że podczas wprowadzania nazwy hosta lub adresu IP pojawia się zielony haczyk, co oznacza, że ClusterControl może komunikować się z węzłem. Następnie kliknij przycisk Importuj i poczekaj, aż ClusterControl zakończy swoje zadanie. Możesz monitorować proces w sekcji Aktywność ClusterControl.
Klaster bazy danych zostanie wyświetlony w panelu ClusterControl po zaimportowaniu.
Zauważ, że jeśli masz tylko węzeł główny PostgreSQL, możesz dodać go do ClusterControl. Następnie możesz dodać węzły rezerwowe z interfejsu użytkownika ClusterControl, aby umożliwić ClusterControl skonfigurowanie ich za Ciebie.
ClusterControlSingle Console dla całej infrastruktury bazy danychDowiedz się, co jeszcze nowego w ClusterControlZainstaluj ClusterControl ZA DARMOJak wdrożyć kontenery PostgreSQL za pomocą ClusterControl
Zobaczmy teraz, jak wdrożyć PostgreSQL za pomocą platformy Docker przy użyciu obrazu dockera CentOS (severalnines/centos-ssh) i obrazu dockera ClusterControl (severalnines/clustercontrol).
Najpierw wdrożymy ClusterControl Docker Container przy użyciu najnowszej wersji, więc musimy pobrać kilka dziewiątek/Clustercontrol Docker Image.
$ docker pull severalnines/clustercontrol
Następnie uruchomimy kontener ClusterControl i opublikujemy port 5000, aby uzyskać do niego dostęp.
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Teraz możesz otworzyć interfejs użytkownika ClusterControl pod adresem http://[Docker_Host]:5000/clustercontrol i utwórz domyślnego administratora i hasło.
Kilkadziesiąt dziewięć / centos-ssh zawiera, oprócz włączonej usługi SSH, funkcję automatycznego wdrażania, ale jest ona ważna tylko dla klastra Galera. PostgreSQL nie jest jeszcze obsługiwany. Dlatego ustawimy zmienną AUTO_DEPLOYMENT na 0 w poleceniu docker run, aby utworzyć węzły bazy danych.
$ docker run -d --name postgres1 -p 5551:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
$ docker run -d --name postgres2 -p 5552:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
$ docker run -d --name postgres3 -p 5553:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh
Po uruchomieniu tych poleceń powinniśmy mieć następujące środowisko Docker:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0df916b918a9 severalnines/centos-ssh "/entrypoint.sh" 4 seconds ago Up 3 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5553->5432/tcp postgres3
4c1829371b5e severalnines/centos-ssh "/entrypoint.sh" 11 seconds ago Up 10 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5552->5432/tcp postgres2
79d4263dd7a1 severalnines/centos-ssh "/entrypoint.sh" 32 seconds ago Up 31 seconds 22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5551->5432/tcp postgres1
7eadb6bb72fb severalnines/clustercontrol "/entrypoint.sh" 38 minutes ago Up 38 minutes (healthy) 22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp clustercontrol
Musimy znać adres IP każdego węzła bazy danych. Aby to wiedzieć, możemy uruchomić następujące polecenie dla każdego węzła:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.3",
Teraz, gdy mamy już działające węzły serwerów, musimy wdrożyć nasz klaster baz danych. Aby to ułatwić, użyjemy ClusterControl.
Aby przeprowadzić wdrożenie z ClusterControl, otwórz interfejs użytkownika ClusterControl pod adresem http://[Docker_Host]:5000/clustercontrol , a następnie wybierz opcję „Wdróż” i postępuj zgodnie z wyświetlanymi instrukcjami.
Wybierając PostgreSQL, musimy określić Użytkownika, Klucz lub Hasło i port, aby połączyć się przez SSH z naszymi serwerami. Potrzebujemy również nazwy dla naszego nowego klastra i jeśli chcemy, aby ClusterControl zainstalował dla nas odpowiednie oprogramowanie i konfiguracje.
Po skonfigurowaniu informacji dostępowych SSH musimy zdefiniować użytkownika bazy danych, wersję i datadir (opcjonalnie). Możemy również określić, którego repozytorium użyć.
W następnym kroku musimy dodać nasze serwery do klastra, który zamierzamy utworzyć.
Dodając nasze serwery możemy podać IP lub nazwę hosta. Tutaj musimy użyć adresu IP, który otrzymaliśmy wcześniej z każdego kontenera.
W ostatnim kroku możemy wybrać, czy nasza replikacja będzie synchroniczna czy asynchroniczna.
Możemy monitorować stan tworzenia naszego nowego klastra z monitora aktywności ClusterControl.
Po zakończeniu zadania możemy zobaczyć nasz klaster na głównym ekranie ClusterControl.
Wniosek
Jak widzieliśmy, wdrożenie PostgreSQL z Dockerem może być na początku łatwe, ale wymaga nieco więcej pracy, aby skonfigurować replikację. Na koniec powinieneś monitorować swój klaster, aby zobaczyć, co się dzieje. Dzięki ClusterControl możesz importować lub wdrażać swój klaster PostgreSQL za pomocą Dockera, a także zautomatyzować zadania monitorowania i zarządzania, takie jak tworzenie kopii zapasowych i automatyczne przełączanie awaryjne/odzyskiwanie. Wypróbuj.