Mam Postgresql na serwerze w kontenerze dokowanym. Jak mogę się z nim połączyć z zewnątrz, to znaczy z mojego komputera lokalnego? Jakie ustawienie powinienem zastosować, aby na to pozwolić?
199
Mam Postgresql na serwerze w kontenerze dokowanym. Jak mogę się z nim połączyć z zewnątrz, to znaczy z mojego komputera lokalnego? Jakie ustawienie powinienem zastosować, aby na to pozwolić?
Odpowiedzi:
Możesz uruchomić Postgres w ten sposób (zamapuj port):
Teraz zmapowałeś port 5432 swojego kontenera na port 5432 twojego serwera.
-p <host_port>:<container_port>
. Więc teraz twoje postgres są dostępne z twojegopublic-server-ip:5432
Aby przetestować: Uruchom bazę danych Postgres (powyższe polecenie)
Wejdź do swojego kontenera i utwórz bazę danych:
Przejdź do lokalnego hosta (gdzie masz jakieś narzędzie lub klienta psql).
(hasło mysecretpassword)
Uzyskujesz dostęp do bazy danych (która działa w oknie dokowanym na serwerze) z lokalnego hosta.
W tym poście jest szczegółowo opisane.
źródło
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Udało mi się uruchomić go na Linuksie
uruchom postgres dokera - upewnij się, że port jest opublikowany, używam alpine, ponieważ jest lekki.
sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine
za pomocą innego terminala uzyskaj dostęp do bazy danych z hosta za pomocą URI Postgres
psql postgresql://postgres:1234@localhost:5432/postgres
dla użytkowników komputerów Mac zamień psql na pgcli
źródło
sudo
do uruchamiania swojego kontenera.Możesz również uzyskać dostęp za pomocą polecenia docker exec poprzez:
Lub
źródło
su postgres
zrobić?Miałem już uruchomiony postgres na maszynie hosta i nie chciałem zezwalać na połączenia z sieci, więc uruchomiłem tymczasową instancję postgres w kontenerze i utworzyłem bazę danych tylko w dwóch wierszach:
źródło
-e POSTGRES_DB=my-db
aby utworzyć my-db zamiast postgresUżywam django z Postgres w kontenerach Docker. w pliku komponowania dokera dodaj:
który doda dostępny port przez komputer lokalny. dla siebie podłączyłem do niego DBeaver. Zapobiegnie to konfliktom portów między żądaniem aplikacji a żądaniem komputera lokalnego. na początku dostałem komunikat, że port 5432 jest w użyciu (czyli przez aplikację django), więc nie mogłem uzyskać dostępu przez pgAdmin lub DBeaver.
źródło
Aby połączyć się z hosta lokalnego, musisz dodać „--net host”:
Możesz uzyskać bezpośredni dostęp do serwera bez użycia exec z lokalnego hosta, używając:
źródło
Próbowałem połączyć się z localhost (mac) z kontenerem Postgres. Zmieniłem port w pliku skompilowania dokera z 5432 na 3306 i uruchomiłem kontener. Nie mam pojęcia, dlaczego to zrobiłem: |
Następnie próbowałem połączyć się z Postgres za pośrednictwem PSequel i administratora i nie udało się nawiązać połączenia.
Po przełączeniu z powrotem na port 5432 wszystko działa dobrze.
To było moje doświadczenie, którym chciałem się podzielić. Być może ktoś może z niego skorzystać.
źródło
/var/lib/mysql
?Zakładam, że chcesz mieć możliwość przeglądania danych w kontenerze za każdym razem , gdy łączysz się z nim z zewnątrz. Aby to zrobić, będziesz musiał utrwalić dane na obrazie postgres.
Jeśli nie masz trwałych danych, będziesz musiał powtórzyć wszystko, co zrobiłeś za pierwszym razem.
Kroki 3, 5, 6, 7 i 8 odpowiadają bezpośrednio na twoje pytanie.
Oto szczegółowy przegląd całego procesu, który przeprowadziłem w PowerShellie systemu Windows 10 (polecenia są takie same w systemie Linux i macOS):
Krok 1 : Uruchom program PowerShell w trybie innym niż administrator
Krok 2 : Pobierz obraz dokera Postgres:
docker pull postgres:latest
Krok 3 : Uruchom kontener dokowany w trybie odłączonym i utrwal dane na obrazie postgres, tworząc wolumin i wiążąc go z miejscem docelowym
( Uwaga : domyślnie używany jest domyślny port 5432; ale należy podać go jawnie, aby zapobiec błędom połączenia od klientów takich jak pgadmin, dbeaver itp.)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest
Krok 4 : Sprawdź status uruchomionych kontenerów
docker ps -a
Krok 5 : Wejdź do nazwa_kontenera w trybie interaktywnym
( Uwaga : polecenia takie jak ls, pwd itp. Można tutaj wykonać, jeśli sprawdziłeś kontenery linux podczas instalacji)
docker exec -it postgres-test psql -U postgres
Krok 6 : Utwórz przykładowe dane. W tym momencie możesz grać
psql
poleceniami w następujący sposób:Krok 7 : Otwórz aplikację kliencką bazy danych, taką jak
pgadmin
lubdbeaver
i wprowadź poniższe pola w polach połączenia:Krok 8 : Wpisz zapytanie
select * from test_table
w edytorze zapytań i powinieneś zobaczyć wynik123
źródło
Z jakiegoś powodu port 5432 wydaje się chroniony. Zmieniłem konfigurację portu z
5432:5432
na5416:5432
i następujące polecenie zadziałało, aby połączyć się z bazą danych postgres spoza kontenera dokera :źródło
postgres
usługę na komputerze hosta, który będzie już wiązał się z localhost: 5432, uniemożliwiając ci korzystanie z niego. Dobrym rozwiązaniem jest odwzorowanie innego portu hosta na domyślny port 5432 wewnątrz kontenera; alternatywnie możesz zatrzymać usługę postgres na swoim hoście, ale być może jest ona używana do czegoś, czego potrzebujesz.najpierw otwórz obraz dokera dla postgres
wtedy dostaniesz root -
root@868594e88b53:/#
potrzebuje połączenia z bazą danychźródło
W przypadku, gdy jest to aplikacja backend django, możesz zrobić coś takiego.
źródło
Tutaj są dobre odpowiedzi, ale jeśli chcesz mieć interfejs do zarządzania bazą danych Postgres, możesz zainstalować pgAdmin na komputerze lokalnym i połączyć się ze zdalnym komputerem za pomocą jego adresu IP i portu narażonego na postgres (domyślnie 5432).
źródło
docker ps -a
aby uzyskać identyfikatory kontenera, wykonaj polecenie docker -it psql -U -Wźródło
Wiem, że jest późno, jeśli używałeś Docker-Compose jak @Martin
Są to fragmenty, które pomogły mi połączyć się z psql wewnątrz kontenera
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
Nie mogę komentować, ponieważ nie mam 50 reputacji. Mam nadzieję, że to pomoże.
źródło