docker postgres pgadmin połączenie lokalne


100

Stworzyłem obraz ubuntu z nginx, php i postgres.

Chcę połączyć bazę danych postgres w moim bieżącym obrazie z bazą pgadminznajdującą się na moim komputerze lokalnym.

Próbowałem użyć inspektora docker, aby spróbować użyć ip obrazu do nawiązania połączenia z moim lokalnym pgadminem, ale bez większego sukcesu. Próbowałem też skonfigurować niektóre porty lokalnie, aby połączenie działało.


Nie mówisz, czy PostgreSQL nasłuchuje połączeń zewnętrznych (sprawdź pliki konfiguracyjne), czy też port wydaje się otwarty z lokalnego komputera.
Richard Huxton

1
Wydaje się, że nie można odpowiedzieć na to pytanie przy tak małej ilości informacji
cthulhu

Odpowiedzi:


92

To ważne pytanie, nie wiem, dlaczego ludzie uważają, że „nie można odpowiedzieć na to pytanie”.

Oto jak robię to, co próbujesz zrobić:

  1. Pobierz obraz postgres z Docker Hub

    docker pull postgres:latest

  2. Uruchom kontener za pomocą poniższego polecenia

    docker run -p 5432:5432 postgres

  3. Za pomocą polecenia docker inspect znajdź adres IP

  4. Użyj tego adresu IP, PORT, nazwy użytkownika i hasła, aby połączyć się w PGADMIN

  5. Możesz również wykonać prosty telnet, jak poniżej, aby potwierdzić, czy masz dostęp do kontenera docker postgres:

    telnet IP_ADDRESS 5432


16
Jeśli publikujesz port z tym -p 5432:5432, nie musisz znajdować adresu IP kontenera, możesz użyć adresu IP swojego hosta 127.0.0.1lub po prostulocalhost
Davos

Cel postu jest ważny, ale nie jest to post wysokiej jakości dla SE. Na początek nie postawiono żadnego „pytania”. Ponadto nie ma żadnych wskazówek, jak wypróbowali proces lub błędy, które otrzymali podczas wykonywania. To powiedziawszy, myślę, że wykonałeś dobrą robotę odpowiadając.
channel_tape_coder

3
Ta odpowiedź jest dla mnie przydatna, dlatego jest to ważne pytanie.
Todd

Użyłem -p 5432: 5432 do mapowania kontenera na mój host, ale nadal otrzymuję błąd połączenia. Próbowałem użyć adresu IP, który otrzymałem od docker inspect i działa.
ginad

50

Co odniosłem sukces na Windows 10 z uruchomionym dockerem dla Windows 1.12.6 (9655), krok jest taki jak poniżej:

  1. Pobierz najnowsze postgresy

    docker pull postgres:latest

  2. uruchom kontener postgres:

    docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name db-my -p 5432:5432 --restart=always postgres

  3. Następnie zainstalowano najnowszą wersję pgAdmin4 z witryny internetowej pgadmin

  4. Uruchom pgAdmin 4, utwórz nowy serwer i wprowadź następujący Host: 127.0.0.1 Port: 5432 Nazwa użytkownika: hasło użytkownika: hasło123

  5. Wtedy wszystko jest w porządku, połącz się z powodzeniem instancji docker postgres.

45

Alternatywnie, można połączyć Postgresa i pgAdmin w jednym docker-composepliku i zaloguj się jako użytkownik pgadmin4@pgadmin.org, PWD: admin. Aby dodać serwer Posgres, użyj nazwy hosta postgres, portu 5432.

version: '3'
services:
  postgres:
    image: postgres
    hostname: postgres
    ports:
      - "6543:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: TEST_SM
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

  pgadmin:
    image: dpage/pgadmin4
    depends_on:
      - postgres
    ports:
      - "5555:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org
      PGADMIN_DEFAULT_PASSWORD: admin
    restart: unless-stopped

volumes:
  postgres-data:

3
Otrzymuję komunikat „nie można przetłumaczyć nazwy hosta„ postgres ”na adres: nazwa węzła ani nazwa serwera podana lub nieznana”.
Enrique Ortiz Casillas

1
nie można przetłumaczyć nazwy hosta „postgres” na adres: Nazwa nie została rozwiązana
serwer proxy

2
jeśli tak docker network ls, zobaczysz most dla sieci postgres-to-pgadmin (moja to postgres_postgres). Następnie możesz docker network inspect postgres_postgreszobaczyć dwa kontenery, każdy z adresem IP / nazwą hosta. Weź ten z Postgres (mój to postgres_db_1), aby pomyślnie połączyć się z pgAdmin.
Nil

28

To właśnie zrobiłem

dla postgresów

docker run -p 5432:5432  --name container-postgresdb -e POSTGRES_PASSWORD=admin -d postgres

dla pgadmin

docker run -p 5050:80  -e "PGADMIN_DEFAULT_EMAIL=name@example.com" -e "PGADMIN_DEFAULT_PASSWORD=admin"  -d dpage/pgadmin4

Ciąg połączenia dla pgadmin

host: host.docker.internal
database: postgres
user: postgres
password: admin

To działa dobrze!!!!!


5
Unable to connect to server: could not translate host name "host.docker.internal" to address: Try again
channel_tape_coder

2
Użyłem również tego podejścia do tworzenia zarówno postgres, jak i pgAdmin w dockerze. Jako wartość wejściowa zadziałała dla mnie odpowiedź z @SolidSnake - stackoverflow.com/a/58224344/4288961 > docker inspect CONTAINER_ID | grep Adres IP. i wykorzystał ten wynikowy adres IP jako hosta
Prusdrum

Niesamowite!. Bardzo pomocny. Potrzebowałem tylko wartości „host.docker.internal”
Hernán Acosta

20

W moim przypadku mogłem rozwiązać problem sprawdzając mój obraz postgre za pomocą polecenia

docker inspect CONTAINER_ID  | grep IPAddress.

Więc użyłem adresu IP dockera do skonfigurowania połączenia z pgadmin 4 i wszystko było w porządku. Dzięki @Afshin Ghazi


17

Jeśli pgAdmin ma być uruchamiany z tym samym hostem / gościem Ubuntu, musisz połączyć kontener postgres, aby można go było rozwiązać za pomocą nazwy.

1. Uruchom kontener postgres:

docker run --name some-postgres -e POSTGRES_PASSWORD=postgres -d postgres

2. Uruchom kontener pgAdmin:

docker run -p 80:80 --link some-postgres -e "PGADMIN_DEFAULT_EMAIL=email@domain.com" -e "PGADMIN_DEFAULT_PASSWORD=postgres" -d dpage/pgadmin4

3. Teraz podczas dodawania nowego serwera w aplikacji internetowej phAdmin użyj some-postgresjako nazwy serwera

Zwróć uwagę, --link some-postgreskiedy uruchamialiśmy pgAdmin. To polecenie sprawia, że ​​kontener postgres jest widoczny dla kontenera pgAdmin.


1
Mogę połączyć się z psq z serwerem i zalogować się do interfejsu pgadmin. Ale jakiej sieci / portu mam używać podczas łączenia się z serwerem postgres z interfejsu pgadmin?
Tom

1
Warto zauważyć, że w dokumentacji Docker ( docs.docker.com/network/links ) Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link.również nie miałem szczęścia przy używaniu --linkmojego kontenera pgadmin do komunikowania się z moim kontenerem postgres. Jednak mogę uzyskać dostęp do postgres z lokalnej instalacji pgadmin.
channel_tape_coder

13

Dodałem to do pliku Docker yaml, aby uzyskać bazę danych i pgAdmin:

database:
    image: postgres:10.4-alpine
    container_name: kafka-nodejs-example-database
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    expose:
      - "5432"
    ports:
      - 8000:5432
    volumes:
      - ./services/database/schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
      - ./services/database/seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
  pgadmin:
    image: dpage/pgadmin4
    ports:
      - 5454:5454/tcp
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@mydomain.com
      - PGADMIN_DEFAULT_PASSWORD=postgres
      - PGADMIN_LISTEN_PORT=5454

Nazwa użytkownika postgres to alphaone, a hasło to xxxxxxxxxxx.

Zrób a, docker psaby uzyskać identyfikator kontenera, a następniedocker inspect <dockerContainerId> | grep IPAddress

na przykład: docker inspect 2f50fabe8a87 | grep IPAddress

Wstaw adres IP do pgAdmin i poświadczenia bazy danych używane w dockerze:

pgAdmin


1
To pomogło. Musiałem grepować poprawny adres IP z kontenera związanego z dockerem Postgres, aby dodać go do konfiguracji serwera w portalu docker PgAdmin, jak pokazano powyżej. Stawianie localhostnie działało.
Andrew Lobban

6

Jeśli sprawdziłeś, że PostgreSQL działa i możesz się tam połączyć z lokalną kopią PgAdmin ...

Odpowiedź jest prosta: użyj host.docker.internalistead of localhostdla PgAdmin działającego wewnątrz Dockera

użyj <code> host.docker.internal </code> istead of <code> localhost </code>


5

W moim przypadku miałem kontener PostgreSQL, więc nie zmieniłem kontenera ani nie stworzyłem podejścia docker-compose, potrzebowałem pgadming po kilku miesiącach, aby zainstalować PostgreSQL, więc takie jest moje podejście:

  1. docker inspect my_container_id_postgreSQL
  2. Sieć przypisana do PostgreSQL to:

    "Sieci": {"docker_default": {"IPAddress": "172.18.0.2", ...}}

  3. Uruchomiłem PGADMIN z --networkpoleceniem.

    docker run -p 85:80 --network docker_default -e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' -e 'PGADMIN_DEFAULT_PASSWORD = SuperSecret' -d dpage / pgadmin4

  4. Wstaw adres IP do pgAdmin i poświadczenia bazy danych używane w dockerze.

Mam nadzieję, że komuś się to przyda. Pozdrowienia.



4

Musisz udostępnić port postgres w kontenerze do lokalnego systemu. Robisz to, uruchamiając kontener w ten sposób:

docker run -p 5432:5432 <name/id of container>

podczas łączenia się z klientem GUI lub CLI upewnij się, że używasz adresu IP, a nie localhost, nawet jeśli twój adres IP jest adresem IP lokalnego hosta.

docker ps poda adres IP, na którym znajduje się kontener postgres.


4

Po dwóch dniach stawiania czoła temu problemowi udało mi się go rozwiązać.

na rozwiązanie tego problemu odpowiedzieli już ludzie, tacy jak sprawdź

docker inspect CONTAINER_ID

ale podczas uruchamiania tej komendy dostałem-wiele dzienników, takich jak ustawienia komputera Config Ustawienia sieci itd. Więc mam mylić który IPAddress dodać w pgAdmin związku bo próbowałem 0.0.0.0 i konfiguracji, host, networkSettings inny -2 IPAddress w logi, ale w końcu działa po wielu próbach.

działa z jakim adresem IP, musimy dodać ten sieciowy adres IP (który utworzyliśmy, aby połączyć postgres i pgAdmin .)

jak w moim przypadku, gdy biegam: -

docker sprawdza postgres_container

 "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "sdffsffsfsfsfsf123232e2r3pru3ouoyoyuosyvo8769696796",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "5432/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "5432"
                }
            ]
        },
        "SandboxKey": "/var/run/docker/231231Ad132",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "",
        "Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "",
        "IPPrefixLen": 0,
        "IPv6Gateway": "",
        "MacAddress": "",
        "Networks": {
            "postgres": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": [
                    "postgres",
                    "0e2j3bn2m42"
                ],
                "NetworkID": "35rhlhl3l53l5hlh3523233k3k4k22l3hk2k4",
                "EndpointID":"b3424n43k52o2i4n235k1k4l2l4hj234f14n2",
                "Gateway": "192.168.16.1",
                "IPAddress": "192.168.16.2",
                "IPPrefixLen": 20,
                "IPv6Gateway": "",

więc musimy dodać NetworkSettings -> Network -> Postgres (moja utworzona sieć) -> IPAddress czyli "IPAddress": "192.168.16.2".

Po dodaniu tego adresu IP będzie działać.

Mam nadzieję, że to pomoże.


2

Aby to zrobić, możesz również utworzyć sieć mostka Docker.

$ docker network create pgnet
a0ae44aaf6f806fc37302e4c603b4828c4edb8d487fd9cd90e2fb19ae1d5c65f

$ docker run --detach \
    --name pg \
    --network pgnet \
    --publish 5432:5432 \
    --restart always \
    --env POSTGRES_PASSWORD=pg123 \
    --volume ${PWD}/data:/var/lib/postgresql/data \
    postgres:12.1
b60611e43727dabe483c1f08fdf74961b886ce05b432a10a0625bd1b6db87899

$ docker run --detach \
    --name pgadm \
    --network pgnet \
    --publish 8000:80 \
    --volume ${PWD}/pgadmin:/var/lib/pgadmin \
    --env PGADMIN_DEFAULT_EMAIL=user@domain.com \
    --env PGADMIN_DEFAULT_PASSWORD=pgadm123 \
    dpage/pgadmin4:4.20
27f9ce1c1c4c383ee1507f4e2d88f6ef33d4fcf5b209a8a03b87519f90d56312

Otwórz http: // localhost: 8000 /

  1. Kliknij Dodaj nowy serwer
  2. Utwórz - serwer
    1. Nazwa: db
    2. Nazwa / adres hosta: str
    3. Nazwa użytkownika: postgres
    4. Hasło: pg123
  3. Zapisać

Nazwa / adres hosta użyty powyżej to nazwa kontenera Postgres podana przez --name pg


Jest to unikalne podejście, w którym jako nazwę hosta używa się nazwy kontenera. Takie samo podejście jak konfigurowanie Nginx czy coś w tym stylu. Ma sens.
Sean McCarthy

1

Aby znaleźć właściwy adres IP dla swojego kontenera, wykonaj następujące polecenia:

Sprawdź identyfikator kontenera:

docker ps

Aby sprawdzić poprawny adres IP kontenera:

docker inspect <ID_CONTAINER> | grep "IPAddress"

Konfiguracja zarówno PostgreSQL, jak i PgAdmin z Dockerem jest prosta, jeśli nie jest poprawna, polecam powtórzenie konfiguracji od zera, jeśli problem jest głębszy.

Oto skrypt, który opracowałem, aby rozwiązać ten problem. script-sh / install-docker-postgres-and-pgadmin


1

Dla macOS adresy IP postgresi pgadmin4różnią się od tych, które docker inspectzapewnia. Rodzaj

docker-machine ls

Spójrz na nazwę serwera po lewej stronie. To jest defaultdomyślne.

docker-machine ip defaultIP będzie trzeba użyć dla obu , pgadmin4w przeglądarce oraz postgresw pgadmin4ustawieniach.


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.