Uruchamianie PostgreSQL za pomocą Docker Compose

Uruchamianie PostgreSQL za pomocą Docker Compose
Komposy dokera można użyć do łatwego automatyzacji wdrożeń wielokrotnego. Jednym z najtrudniejszych zadań podczas uruchamiania takich wdrożeń jest oddzielenie danych od oprogramowania.

Podczas gdy kontenery są efemeryczne, dane użytkownika muszą się utrzymywać. Klasycznym przykładem jest to, że próbujemy uruchamiać obrazy kontenera bazy danych. Jeśli zniszczysz kontener bazy danych, dane również są utracone. To, czego chcemy. To jest sposób na aktualizację Docker, nie wpadasz do kontenera i nie aktualizujesz pakietów za pomocą menedżera pakietów. Wymieniasz cały obraz kontenera.

Zobaczmy kilka pułapek, które możesz napotkać podczas robienia tego i jak możemy sprawić, że proces będzie znacznie gładszy i czystszy z operacyjnego punktu widzenia.

Wymagania wstępne

  1. Instalacja Docker
  2. Podstawowe zrozumienie Docker CLI i Docker-Compose

Docker Volumes i PostgreSQL Domyślne zachowanie

Wolume Docker to zalecany sposób utrzymywania danych. Są to systemy plików zarządzane przez Docker Daemon i częściej niż nie oczekuje się, że utworzysz jeden i zamontować go w pojemniku po uruchomieniu. Oficjalny obraz Postgres jest jednak wyposażony w objętość predefiniowaną w opisie obrazu.

Oznacza to, że po uruchomieniu obrazu PostgreSQL jako kontenera tworzy on dla siebie wolumin i przechowuje tam dane.

$ Docker Run -d --name mydb Postgres

Możesz wymienić istniejące tomy za pomocą polecenia Docker Volume LS i możesz sprawdzić kontener Docker MYDB, aby zobaczyć, który z tych tomów jest zamontowany w pojemniku bazy danych.

$ Docker Volume LS
Nazwa woluminu sterownika
Lokalny 8328940661C0703ED867B004EA6343B9432E70069280B71CFCE592ECDD12E55D
$ Docker Inspect mydb

„Mocowania”: [

„Typ”: „Tom”,
„Nazwa”: „8328940661C0703ED867B004EA6343B9432E70069280B71CFCE592ECDD12E55D”,
„Źródło”: "/var/lib/docker/Volumes/8328940661C0703ED867B004AE6343B9432E70069280B71CF
CE592ECDD12E55D/_DATA ",
„Miejsce docelowe”: „/var/lib/postgreSQL/Data”,
„Driver”: „Lokalny”,
"Tryb": "",
„RW”: True,
"Propagacja": ""

],

Zauważysz, że tom ma raczej nieprzyjazną nazwę i jest zamontowany /var/lib/postgresql/data.

Usuńmy ten pojemnik i powiązany objętość na razie:

$ docker rm -f mydb
$ Docker Volume RM 8328940661C0703ED867B004EA6343B9432E70069280B71CFCE592ECDD12E55D

To samo dotyczy utworzenia kontenera za pomocą prostego pliku Docker-Compose. Poniżej znajduje się kompozycja dokera.plik YML umieszczony w katalogu o nazwie Postgres.

Wersja: „3”
Usługi:
MYDB:
Zdjęcie: Postgres

Możesz go zasilić Docker-Compose, otwierając terminal w tym samym katalogu, w którym ten plik jest i działa:

$ Docker -Compose Up -d

To tworzy pojemnik i wolumin podobnie jak polecenie Docker Run, które widzieliśmy wcześniej. Jednak obie te metody, jedna obejmująca kompozycję Docker i inny Docker CLI mają fatalny problem i to wchodzi w grę, gdy trzeba zastąpić stary obraz Postgres na nowy.

Nowe tomy za każdym razem

Jeśli usuniesz powyższe wdrożenie, uruchamiając:

$ Docker-Compose Down

Kontener i sieć są usuwane, ale głośność pozostaje w pobliżu, a twoje dane są w nim bezpieczne. Jednak następnym razem:

$ Docker -Compose Up -d

Komponuj nową głośność i zamontuje, a zamiast używać wcześniej utworzonego woluminu. I jak pamięta, że ​​poprzedni tom był przeznaczony dla tego konkretnego pojemnika PostgreSQL i tak? Ale biedny użytkownik, który może nawet nie być świadomy koncepcji woluminów, będzie zdezorientowany, zastanawiając się, skąd zniknęły wszystkie dane.

Objętość zdefiniowana przez użytkownika

Aby obejść ten problem, możemy wykorzystać informacje, które wcześniej zebraliśmy, które pokazały nam, że głośność jest zamontowana w /var/lib/postgresql/data. Wewnątrz kontenera ten katalog jest miejscem, w którym Postgres przechowuje wszystkie odpowiednie tabele i bazy danych.

Musimy teraz zdefiniować wolumin wewnątrz pliku kompozycji i zamontować go w tym punkcie montażu. W ten sposób kompozycja dokera.YML wyglądałby jak.

Wersja: „3”
Usługi:
MYDB:
Zdjęcie: Postgres
wolumeny:
- db-data:/var/lib/postgresql/data
Porty:
- 5432: 5432
wolumeny:
DB-DATA:
Kierowca: lokalny

Ostatni wiersz „Driver: Lokalny” jest całkowicie opcjonalny i jest tutaj wspomniany tylko po to, aby pokazać, że „Klucz najwyższego poziomu wolumeny" może mieć zdefiniowane wiele tomów. DB-DATA to jeden z takich tomów, który z kolei ma specyfikę, podobnie jak sterowniki, zawarte jako wcięty blok pod nim.

W ramach usługi MYDB ponownie mamy klucz Volumes. Ten "poziom usług Klucz objętości ” Jest to tylko lista woluminów zdefiniowanych pod kluczowym kluczem objętościowym na punkcie montażu wewnątrz pojemników

Po uruchomieniu polecenia Docker-Compose Up -d za pierwszym razem z powyższą definicją YML, utworzy objętość, a nie z losowym ciągiem jako nazwa, ale db-bata jako nazwa. Następnie za każdym razem, gdy obniżysz aplikację (Docker-Compose Down), a następnie ponownie powtórka kompozycja Docker-Compose -d spróbuje utworzyć tom o nazwie db-data, ale potem zauważy, że wolumin z tą nazwą już istnieje. Wtedy pomoże to ponownie zamontować tę samą głośność. Na razie obniżmy aplikację:

$ Docker-Compose Down

Za pomocą PostgreSQL

Oficjalny obraz Postgres ujawnia port 5432 na naszą korzyść. Ściśle mówiąc, nie jest to konieczne. Bazy danych to tylko jedna z wielu usług działających w sieci Docker. Inne usługi, takie jak serwer WWW, mogą rozmawiać z bazą danych bez publikowania żadnego wyraźnego portu. Wynika to z faktu, że sieci mostowe zdefiniowane przez użytkownika, podobnie jak te Docker Compose, tworzą Twoje aplikacje, umożliwiają kontenery członkowskie na swobodne rozmowy. Więc jeśli WebServer i baza danych znajdują się w tej samej sieci mostu, mogą rozmawiać ze sobą nawet bez żadnych portów otwartych.

Bazy danych często nie są narażone na świat zewnętrzny, ale dostęp do innych innych usług. Dlatego publikowanie portu Postgres nie jest czymś, co często można było zobaczyć w produkcji.

Jednak eksperymentujemy z aplikacją kontenerową, aby sprawdzić, czy dane faktycznie utrzymują się, abyśmy mogli na razie ujawnić i opublikować porty. Zmodyfikuj kompozycję dokera.plik YML z opcją dodatkowych portów.

Wersja: „3”
Usługi:
MYDB:
Zdjęcie: Postgres
wolumeny:
- db-data:/var/lib/postgresql/data
Porty:
- 5432: 5432/tc
wolumeny:
DB-DATA:
Kierowca: lokalny

Teraz jesteśmy gotowi do interfejsu z instancją Postgres za pomocą programu klienta PGADMIN. Możesz zainstalować tego klienta na komputerze lokalnym za pomocą preferowanej metody, jeśli kliknij ten link. Po zainstalowaniu klienta możesz połączyć się z serwerem bazy danych, ale najpierw uruchommy serwer bazy danych.

$ Docker -Compose Up -d

Tym razem żądania przychodzące w Docker Host Port 5432 zostaną przesłane do portu 5432 kontenera bazy danych, gdzie serwer Postgres może to przetworzyć.

Łączenie z serwerem

Uruchom klienta PGADMIN i możesz uzyskać do niego dostęp za pośrednictwem przeglądarki internetowej. Na desce rozdzielczej znajdziesz opcję wywoływaną Dodaj nowy serwer.

Podaj to rozsądne imię, idziemy z „Moja baza danych ”:

I pod kartą Połączenia Wprowadź adres, w którym działa baza danych:

Adres może być lokalny, jeśli używasz zarówno PGADMIN, a kontener Postgres działa na tym samym komputerze. Jeśli na przykład uruchamiasz kontener Postgres na zdalnym VPS, adres IP tego VPS będzie potrzebny tutaj. Ogólnie rzecz biorąc, nazywamy to adresem hosta Dockera, ponieważ właśnie tam działa Docker.

Pozostawimy puste pole hasła, a domyślny numer portu 5432 jest również w porządku. Zapisz ustawienia serwera i utwórzmy tam bazę danych.

Po udanym połączeniu możesz zobaczyć wszystkie wewnętrzne działania:

Z menu przeglądarki możemy szybko wybrać Moja baza danych serwer i pod nim kliknij prawym przyciskiem myszy w bazie danych i Utwórz bazę danych.

Szybko utwórzmy bazę danych o nazwie Przykładowa baza danych.

Nie musisz tutaj tworzyć niczego innego. Teraz możemy zamknąć okno i wrócić do terminala otwartego w tym samym katalogu, w którym nasza kompozycja dokera.YML żyje.

$ Docker-Compose Down
$ Docker -Compose Up -d

Stary pojemnik zniknął i zajął nowy. Możesz otworzyć PGADMIN ponownie i będziesz musiał ponownie połączyć się z tą bazą danych (zrobiłoby to puste hasło), a w środku przekonasz się, że wszystko jest tak, jak to pozostawiłeś. Jest nawet Przykładowa baza danych tam.

Wniosek

Chcieliśmy napisać plik kompozycji Docker, który sprawił, że Postgres można aktualizować. Jeśli pojawi się nowy obraz Postgres z uruchomieniem Postgres 11, teraz możesz śmiało wciągnąć nowy obraz i uruchomić aktualizację bez obaw o utraconą aplikację.

Domyślne zachowanie obrazu Postgres, które polega na utworzeniu nowego woluminu za każdym razem, gdy tworzenie kontenera nie jest złym wyborem projektu. Jest wdrażany w sercu najlepszego interesu.

Ale po prostu odkłada nowego użytkownika, który drapałby swoją głowę zastanawiając się, gdzie gubią wszystkie dane i dlaczego w ich hostie Docker leżą tak wiele tomów. Mam nadzieję, że nie będzie to już problemu dla czytelników.