docker postgres pgadmin kết nối cục bộ


96

Tôi đã tạo một hình ảnh ubuntu với nginx, php và postgres.

Tôi muốn kết nối cơ sở dữ liệu postgres trong hình ảnh hiện tại của tôi với pgadminnằm trên máy cục bộ của tôi.

Tôi đã thử sử dụng trình kiểm tra docker để cố gắng sử dụng ip hình ảnh để tạo kết nối với pgadmin cục bộ của mình nhưng không thành công nhiều. Tôi cũng đã thử định cấu hình một số cổng trên cục bộ để kết nối hoạt động.


Bạn không cho biết liệu PostgreSQL có đang lắng nghe các kết nối bên ngoài hay không (kiểm tra các tệp cấu hình của bạn) hoặc nếu cổng đó xuất hiện mở từ máy cục bộ.
Richard Huxton

1
Nó dường như không thể trả lời câu hỏi đó với rất ít thông tin được cung cấp
Cthulhu

Câu trả lời:


91

Đó là một câu hỏi hợp lệ không biết tại sao mọi người cảm thấy "dường như không thể trả lời câu hỏi đó".

Vì vậy, đây là cách tôi thực hiện những gì bạn đang cố gắng làm:

  1. Kéo hình ảnh postgres từ Docker Hub

    docker pull postgres:latest

  2. Chạy vùng chứa bằng lệnh dưới đây

    docker run -p 5432:5432 postgres

  3. Sử dụng lệnh kiểm tra của docker để tìm IP

  4. Sử dụng IP, PORT, Tên người dùng và Mật khẩu đó để kết nối trong PGADMIN

  5. Bạn cũng có thể thực hiện một telnet đơn giản như dưới đây để xác nhận xem bạn có thể truy cập vùng chứa postgres của docker hay không:

    telnet IP_ADDRESS 5432


16
Nếu bạn đang xuất bản cổng với cái này -p 5432:5432thì bạn không cần phải tìm IP của vùng chứa, bạn có thể sử dụng IP máy chủ của mình 127.0.0.1hoặc chỉlocalhost
Davos

Mục đích của bài viết là hợp lệ nhưng nó không phải là bài đăng chất lượng cao cho SE. Để bắt đầu, không có 'câu hỏi' thực sự nào được đặt ra. Ngoài ra, không có dấu hiệu nào về cách họ đã thử quy trình hoặc các lỗi họ nhận được khi thực hiện. Điều đó nói rằng, tôi nghĩ bạn đã làm tốt công việc phản hồi.
duct_tape_coder

3
Câu trả lời này hữu ích đối với tôi, do đó nó là một câu hỏi hợp lệ.
Todd

Tôi đã sử dụng -p 5432: 5432 để ánh xạ vùng chứa tới máy chủ của mình nhưng vẫn gặp lỗi kết nối. Tôi đã thử sử dụng IPAddress mà tôi nhận được từ trình kiểm tra docker và nó hoạt động.
ginad

49

Những gì tôi đã thực hiện thành công trên windows 10 đang chạy docker cho windows 1.12.6 (9655), bước như sau:

  1. Kéo các postgres mới nhất

    docker pull postgres:latest

  2. chạy trình chứa postgres:

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

  3. Sau đó, cài đặt phiên bản pgAdmin4 mới nhất từ trang web pgadmin

  4. Chạy pgAdmin 4 tạo máy chủ mới và nhập như sau Máy chủ: 127.0.0.1 Cổng: 5432 Tên người dùng: mật khẩu người dùng: password123

  5. Sau đó, mọi thứ đều ổn, kết nối với docker postgres instance thành công.

41

Ngoài ra, bạn có thể kết hợp Postgres và pgAdmin trong một docker-composetập tin, và đăng nhập như người dùng pgadmin4@pgadmin.org, pwd: admin. Để thêm máy chủ Posgres, hãy sử dụng tên máy chủ postgres, cổng 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
Tôi nhận được 'không thể dịch tên máy chủ lưu trữ "postgres" thành địa chỉ: tên nút hoặc tên dịch vụ được cung cấp hoặc không được biết'.
Enrique Ortiz Casillas

1
không thể dịch tên máy chủ "postgres" thành địa chỉ: Tên không giải quyết được
proxy

1
nếu bạn docker network ls, bạn sẽ thấy một cầu nối cho mạng postgres-to-pgadmin (của tôi là postgres_postgres). Sau đó, bạn có thể docker network inspect postgres_postgresthấy hai vùng chứa, mỗi vùng chứa một ip / tên máy chủ. Lấy một từ Postgres (của tôi là postgres_db_1) để kết nối thành công từ pgAdmin.
Nil

26

Đây là những gì tôi đã làm

cho bưu điện

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

cho pgadmin

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

Chuỗi kết nối cho pgadmin

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

Nó hoạt động tốt!!!!!


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

2
Tôi cũng đã sử dụng cách tiếp cận này để tạo cả postgres và pgAdmin trong docker. Câu trả lời là từ @SolidSnake - stackoverflow.com/a/58224344/4288961 > docker kiểm tra CONTAINER_ID | grep IPAddress. và sử dụng địa chỉ IP kết quả này làm máy chủ lưu trữ
Prusdrum

Tuyệt vời!. Rất hữu ích. Tôi chỉ cần giá trị 'host.docker.internal'
Hernán Acosta

19

Trong trường hợp của tôi, tôi có thể giải quyết vấn đề khi kiểm tra hình ảnh postgre của mình thông qua lệnh

docker inspect CONTAINER_ID  | grep IPAddress.

Vì vậy, tôi đã sử dụng địa chỉ ip của docker để định cấu hình kết nối pgadmin 4 của mình và mọi thứ đều ổn. Cảm ơn @Afshin Ghazi


Điều này làm việc cho tôi.
Kalpesh Tawde

17

Nếu pgAdmin được dự định chạy trên cùng một máy chủ / khách Ubuntu, thì bạn cần phải liên kết vùng chứa postgres, vì vậy nó có thể được giải quyết bằng một cái tên.

1. Chạy một vùng chứa postgres:

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

2. Chạy vùng chứa 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. Bây giờ khi thêm máy chủ mới trong ứng dụng web phAdmin, hãy sử dụng some-postgreslàm tên máy chủ

Lưu ý --link some-postgreskhi chúng tôi đưa ra pgAdmin. Lệnh này làm cho vùng chứa postgres hiển thị với vùng chứa pgAdmin.


1
Tôi có thể kết nối với psq với máy chủ và đăng nhập vào giao diện pgadmin. Nhưng tôi sử dụng mạng / cổng nào khi kết nối với máy chủ postgres từ giao diện pgadmin?
Tom

1
Đáng chú ý từ Docker docs ( 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.Tôi cũng không gặp may khi sử dụng --linkđể lấy vùng chứa pgadmin của mình để nói chuyện với vùng chứa postgres của tôi. Tuy nhiên, tôi có thể truy cập postgres từ bản cài đặt cục bộ của pgadmin.
duct_tape_coder

11

Tôi đã đưa cái này vào tệp docker yaml để lấy cơ sở dữ liệu và 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

Tên người dùng postgres là alphaone và mật khẩu là xxxxxxxxxxx.

Thực hiện một docker psđể lấy id vùng chứa và sau đódocker inspect <dockerContainerId> | grep IPAddress

ví dụ: docker inspect 2f50fabe8a87 | grep IPAddress

Chèn địa chỉ Ip vào pgAdmin và thông tin đăng nhập cơ sở dữ liệu được sử dụng trong docker:

pgAdmin


1
Điều này đã giúp. Tôi đã phải grep địa chỉ IP chính xác từ trong vùng chứa được liên kết với docker Postgres để thêm vào cấu hình máy chủ trong cổng PgAdmin của docker như được hiển thị ở trên. Đặt localhostkhông hoạt động.
Andrew Lobban,

5

Trong trường hợp của tôi, tôi có một vùng chứa PostgreSQL, vì vậy tôi đã không thay đổi vùng chứa của mình hoặc tạo một phương pháp soạn thư do docker, tôi cần pgadming sau vài tháng để cài đặt PostgreSQL, vì vậy đây là cách tiếp cận của tôi:

  1. docker inspect my_container_id_postgreSQL
  2. Mạng được chỉ định cho PostgreSQL là:

    "Mạng": {"docker_default": {"IPAddress": "172.18.0.2", ...}}

  3. Chạy PGADMIN của tôi bằng --networklệnh.

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

  4. Chèn địa chỉ Ip vào pgAdmin và thông tin đăng nhập cơ sở dữ liệu được sử dụng trong docker.

Tôi hy vọng điều này có thể hữu ích cho ai đó. Trân trọng.



4

Bạn phải hiển thị cổng postgres trong vùng chứa cho hệ thống cục bộ của bạn. Bạn thực hiện việc này bằng cách chạy vùng chứa của mình như sau:

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

khi kết nối với ứng dụng khách GUI hoặc CLI của bạn, hãy đảm bảo sử dụng địa chỉ ip không phải localhost ngay cả khi địa chỉ ip của bạn là địa chỉ ip localhost.

docker ps sẽ cung cấp cho bạn địa chỉ ip mà vùng chứa postgres của bạn đang bật.


4

Nếu bạn đã xác minh rằng PostgreSQL đang chạy và bạn có thể kết nối ở đó với bản sao cục bộ của PgAdmin ...

Câu trả lời rất đơn giản: sử dụng host.docker.internalistead của localhostcho pgAdmin chạy bên trong Docker

sử dụng <code> host.docker.internal </code> thay cho <code> localhost </code>


3

Sau khi đối mặt với vấn đề này trong hai ngày, tôi đã có thể giải quyết vấn đề đó.

giải pháp của vấn đề này đã được trả lời bởi những người như kiểm tra

docker inspect CONTAINER_ID

nhưng trong khi chạy lệnh này, tôi nhận được rất nhiều nhật ký như Cài đặt Mạng Cấu hình Máy chủ, v.v. Vì vậy, tôi bối rối nên thêm Địa chỉ IP nào vào kết nối pgAdmin vì tôi đã thử 0.0.0.0 và cấu hình, máy chủ, Cài đặt mạng khác nhau -2 Địa chỉ IP trong nhật ký nhưng cuối cùng nó hoạt động sau khi cố gắng rất nhiều.

nó hoạt động với IP nào thì chúng ta phải thêm địa chỉ ip mạng đó (chúng ta đã tạo để kết nối postgrespgAdmin .)

như trong trường hợp của tôi khi tôi chạy: -

docker kiểm tra 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": "",

vì vậy chúng ta phải thêm NetworkSettings -> Network -> Postgres (mạng do tôi tạo) -> IPAddress tức là "IPAddress": "192.168.16.2".

Sau khi thêm ip này nó sẽ hoạt động.

Tôi mong nó sẽ có ích.


2

Bạn cũng có thể tạo mạng cầu nối Docker để làm điều này.

$ 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

Mở http: // localhost: 8000 /

  1. Nhấp vào Thêm máy chủ mới
  2. Tạo - Máy chủ
    1. Tên: db
    2. Tên máy chủ / địa chỉ: pg
    3. Tên người dùng: postgres
    4. Mật khẩu: pg123
  3. Tiết kiệm

Tên máy chủ / địa chỉ được sử dụng ở trên là tên của vùng chứa Postgres do --name pg


Đây là một cách tiếp cận độc đáo, sử dụng tên vùng chứa làm tên máy chủ. Cách tiếp cận tương tự như thiết lập Nginx hoặc một cái gì đó. Có ý nghĩa.
Sean McCarthy

1

Để tìm đúng ip cho vùng chứa của bạn, hãy thực hiện các lệnh sau:

Kiểm tra ID vùng chứa:

docker ps

Để kiểm tra IP chính xác của vùng chứa của bạn:

docker inspect <ID_CONTAINER> | grep "IPAddress"

Cấu hình của cả PostgreSQL và PgAdmin với Docker đều đơn giản, nếu không đúng, tôi khuyên bạn nên làm lại cấu hình từ đầu, nếu vấn đề của bạn sâu hơn.

Đây là một tập lệnh tôi đã phát triển để giải quyết vấn đề này. script-sh / install-docker-postgres-and-pgadmin


1

Đối với các IP macOS của postgrespgadmin4khác với IP được docker inspectcung cấp. Kiểu

docker-machine ls

Hãy nhìn vào tên của máy chủ ở bên trái. Nó defaulttheo mặc định.

docker-machine ip defaultIP bạn sẽ cần sử dụng cho cả hai , pgadmin4trong trình duyệt và postgrestrong pgadmin4cài đặt.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.