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.
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 PostgresMoż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 LSZauważ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 mydbTo 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”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 -dTo 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 DownKontener 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 -dKomponuj 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”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 DownZa 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”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 -dTym 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 DownStary 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.
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.