Łączenie z Postgresql w kontenerze dokowanym z zewnątrz


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ć?


1
Jakiego polecenia użyłeś do uruchomienia postresql? możesz odsłonić port i zmapować go
lvthillo

Odpowiedzi:


315

Możesz uruchomić Postgres w ten sposób (zamapuj port):

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

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)

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
05b3a3471f6f        postgres            "/docker-entrypoint.s"   1 seconds ago       Up 1 seconds        0.0.0.0:5432->5432/tcp    some-postgres

Wejdź do swojego kontenera i utwórz bazę danych:

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q

Przejdź do lokalnego hosta (gdzie masz jakieś narzędzie lub klienta psql).

psql -h public-ip-server -p 5432 -U postgres

(hasło mysecretpassword)

postgres=# \l

                             List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 mytest    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres   

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.


1
@Tjorriemorrie Jesteś pewien, że Twój postgres działa na lokalnej maszynie? Może spróbuj 127.0.0.1 zamiast localhost, ale dla spełnione, działa.
lvthillo

2
Uzyskaj swój publiczny adres IP (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul

5
Ze wszystkich różnych postów związanych z postgres / dockerem, które znalazłem, jest to jeden z najbardziej użytecznych. Dziękuję Ci.
rg88

1
@GarouDan, jeśli nie chcesz mapować portu, ale nadal chcesz uzyskać dostęp do kontenera Postgres z hosta, musisz wdrożyć kontener w sieci hosta w następujący sposób:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
wyjście z psql działa z \ q (tylko dla początkujących takich jak ja)
Dirk Schumacher

40

Udało mi się uruchomić go na Linuksie

  1. 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

  2. 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


7
Cieszę się, że ktoś odpowiedział, jak się połączyć, nie wskakując do kontenera. dzięki.
PabTorre

1
Naprawdę nie powinieneś używać sudodo uruchamiania swojego kontenera.
Russ Bateman,

29

Możesz również uzyskać dostęp za pomocą polecenia docker exec poprzez:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Lub

$ docker exec -it postgres-container psql -U postgres

3
psql -U postgres
Maryna Krasnova

to zaskakująco przydatny komentarz
Dan Rosenstark,

Co ma su postgreszrobić?
Breno

14

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:

# Run PostgreSQL
docker run --name postgres-container -e POSTGRES_PASSWORD=password -it -p 5433:5432 postgres

# Create database
docker exec -it postgres-container createdb -U postgres my-db

jeśli chcesz utworzyć pojedynczą domyślną bazę danych, możesz także dodać: -e POSTGRES_DB=my-dbaby utworzyć my-db zamiast postgres
framp

13

Używam django z Postgres w kontenerach Docker. w pliku komponowania dokera dodaj:

db:
    image: postgres:10-alpine
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=supersecretpassword
    **ports:
        - "6543:5432"**

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.


1
Uważam, że jest to najbardziej pomocne. Dla osób korzystających z dokerów-komponuj wydaje się to najlepszym sposobem.
David Frick

Dziękuję David, szczęśliwego kodowania!
omeraiman

9

Aby połączyć się z hosta lokalnego, musisz dodać „--net host”:

docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

Możesz uzyskać bezpośredni dostęp do serwera bez użycia exec z lokalnego hosta, używając:

psql -h localhost -p 5432 -U postgres

6

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.

  db:
    image: postgres
    ports:
      - 5432:5432
    restart: always
    volumes:
      - "db_sql:/var/lib/mysql"
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password
      POSTGRES_DB: postgres_db

To było moje doświadczenie, którym chciałem się podzielić. Być może ktoś może z niego skorzystać.


3
Ścieżka objętość: /var/lib/mysql?
David Tabernero M.

5432 jest domyślnym portem Postgres. 3306 jest domyślnym portem MySQL. Jeśli zmienisz opublikowany port w trybie dokowania, wówczas wszelkie narzędzia klienckie, których spróbujesz użyć do połączenia, będą domyślnie próbowały połączyć się z portem 5432, chyba że powiesz mu, aby używał innego portu.
Davos,

6

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ćpsqlpoleceniami w następujący sposób:

# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
# \q

Krok 7 : Otwórz aplikację kliencką bazy danych, taką jakpgadminlubdbeaveri wprowadź poniższe pola w polach połączenia:

Host: localhost
Database: test
User: postgres
Password: password

Krok 8 : Wpisz zapytanieselect * from test_tablew edytorze zapytań i powinieneś zobaczyć wynik123


5

Z jakiegoś powodu port 5432 wydaje się chroniony. Zmieniłem konfigurację portu z 5432:5432na 5416:5432i następujące polecenie zadziałało, aby połączyć się z bazą danych postgres spoza kontenera dokera :

psql -h localhost -p 5416 -U <my-user> -d <my-database>

Działa to dla mnie, ale nie znalazłem wyjaśnienia w Internecie. Znalazłeś?
negas

2
@ negas Prawdopodobnie już uruchamiasz postgresusł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.
Davos,

5

najpierw otwórz obraz dokera dla postgres

docker exec -it <container_name>

wtedy dostaniesz root - root@868594e88b53:/# potrzebuje połączenia z bazą danych

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>

1

W przypadku, gdy jest to aplikacja backend django, możesz zrobić coś takiego.

docker exec -it container_id python manage.py dbshell

1

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).


0

docker ps -a aby uzyskać identyfikatory kontenera, wykonaj polecenie docker -it psql -U -W


-1

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.


Op chce połączyć się z zewnątrz.
avizzzy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.