นักเทียบท่า postgres การเชื่อมต่อท้องถิ่น pgadmin


96

ฉันสร้างอิมเมจอูบุนตูด้วย nginx, php และ postgres

ฉันต้องการเชื่อมต่อฐานข้อมูล postgres ในภาพปัจจุบันของฉันกับที่pgadminอยู่ในเครื่องของฉัน

ฉันได้ลองใช้ docker inspector เพื่อพยายามใช้ image ip เพื่อเชื่อมต่อกับ pgadmin ในพื้นที่ของฉัน แต่ไม่ประสบความสำเร็จมากนัก ฉันได้ลองกำหนดค่าพอร์ตบางพอร์ตบนโลคัลเพื่อให้การเชื่อมต่อทำงานได้


คุณไม่ได้บอกว่า PostgreSQL กำลังฟังการเชื่อมต่อภายนอกอยู่หรือไม่ (ตรวจสอบไฟล์กำหนดค่าของคุณ) หรือว่าพอร์ตนั้นเปิดจากเครื่องภายในหรือไม่
Richard Huxton

1
ดูเหมือนจะเป็นไปไม่ได้ที่จะตอบคำถามนั้นโดยให้ข้อมูลเพียงเล็กน้อย
cthulhu

คำตอบ:


91

เป็นคำถามที่ถูกต้องไม่รู้ว่าทำไมผู้คนถึงรู้สึกว่า "ดูเหมือนจะตอบคำถามนั้นไม่ได้"

นี่คือวิธีที่ฉันทำในสิ่งที่คุณพยายามทำ:

  1. ดึงภาพ postgres จาก Docker Hub

    docker pull postgres:latest

  2. เรียกใช้คอนเทนเนอร์โดยใช้คำสั่งด้านล่าง

    docker run -p 5432:5432 postgres

  3. ใช้คำสั่งตรวจสอบนักเทียบท่าค้นหา IP

  4. ใช้ IP, PORT, Username และ Password เพื่อเชื่อมต่อใน PGADMIN

  5. นอกจากนี้คุณยังสามารถทำ telnet ง่ายๆดังต่อไปนี้เพื่อยืนยันว่าคุณสามารถเข้าถึงคอนเทนเนอร์ของนักเทียบท่า postgres ได้หรือไม่:

    telnet IP_ADDRESS 5432


16
หากคุณกำลังเผยแพร่พอร์ตด้วยสิ่งนี้-p 5432:5432คุณไม่จำเป็นต้องค้นหา IP ของคอนเทนเนอร์คุณสามารถใช้โฮสต์ IP ของคุณ127.0.0.1หรือเพียงแค่localhost
ดาวอส

เจตนาของโพสต์นั้นถูกต้อง แต่ไม่ใช่โพสต์คุณภาพสูงสำหรับ SE ในการเริ่มต้นไม่มี 'คำถาม' ที่เกิดขึ้นจริง นอกจากนี้ไม่มีข้อบ่งชี้ว่าพวกเขาพยายามดำเนินการอย่างไรหรือข้อผิดพลาดที่ได้รับในขณะที่ทำ ที่กล่าวมาฉันคิดว่าคุณตอบสนองได้ดี
duct_tape_coder

3
คำตอบนี้มีประโยชน์สำหรับฉันดังนั้นจึงเป็นคำถามที่ถูกต้อง
ทอดด์

ฉันใช้ -p 5432: 5432 เพื่อแมปคอนเทนเนอร์กับโฮสต์ของฉัน แต่ยังคงได้รับข้อผิดพลาดในการเชื่อมต่อ ฉันลองใช้ IPAddress ที่ได้รับจากนักเทียบท่าตรวจสอบและใช้งานได้
ginad

49

สิ่งที่ฉันประสบความสำเร็จบน windows 10 ที่ใช้งาน Docker สำหรับ windows 1.12.6 (9655) ขั้นตอนดังต่อไปนี้:

  1. ดึง postgres ล่าสุด

    docker pull postgres:latest

  2. เรียกใช้ postgres containner:

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

  3. จากนั้นติดตั้ง pgAdmin4 เวอร์ชันล่าสุดจาก เว็บไซต์ pgadmin

  4. รัน pgAdmin 4 สร้างเซิร์ฟเวอร์ใหม่และป้อนข้อมูลดังต่อไปนี้โฮสต์: 127.0.0.1 พอร์ต: 5432 ชื่อผู้ใช้: รหัสผ่านผู้ใช้: รหัสผ่าน 123

  5. จากนั้นทุกอย่างก็โอเคเชื่อมต่อกับความสำเร็จของอินสแตนซ์นักเทียบท่า postgres

41

หรือคุณสามารถรวม Postgres และ pgAdmin ในหนึ่งdocker-composeไฟล์และเข้าสู่ระบบในฐานะผู้ใช้pgadmin4@pgadmin.org, adminรหัสผ่าน: หากต้องการเพิ่มเซิร์ฟเวอร์ Posgres ใช้ชื่อโฮสต์พอร์ตpostgres5432

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
ฉันได้รับ 'ไม่สามารถแปลชื่อโฮสต์ "postgres" เป็นที่อยู่: nodename หรือ servname ที่ระบุหรือไม่เป็นที่รู้จัก'
Enrique Ortiz Casillas

1
ไม่สามารถแปลชื่อโฮสต์ "postgres" เป็นที่อยู่: ชื่อไม่สามารถแก้ไขได้
พร็อกซี

1
ถ้าคุณdocker network lsคุณจะเห็นสะพานสำหรับเครือข่าย postgres-to-pgadmin (ของฉันคือ postgres_postgres) จากนั้นคุณจะdocker network inspect postgres_postgresเห็นคอนเทนเนอร์สองคอนเทนเนอร์แต่ละอันมีชื่อ IP / โฮสต์ รับหนึ่งจาก Postgres (ของฉันคือ postgres_db_1) เพื่อเชื่อมต่อจาก pgAdmin ได้สำเร็จ
ไม่มี

25

นี่คือสิ่งที่ฉันทำ

สำหรับ postgres

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

สำหรับ pgadmin

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

สตริงการเชื่อมต่อสำหรับ pgadmin

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

ใช้ได้ดี !!!!!


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

2
ฉันยังใช้วิธีนี้เพื่อสร้างทั้ง postgres และ pgAdmin ในนักเทียบท่า สิ่งที่ใช้ได้ผลสำหรับฉันในฐานะค่าอินพุตคือคำตอบจาก @SolidSnake - stackoverflow.com/a/58224344/4288961 > นักเทียบท่าตรวจสอบ CONTAINER_ID | grep IPAddress และใช้ที่อยู่ IP ของผลลัพธ์นี้เป็นโฮสต์
Prusdrum

สุดยอด!. เป็นประโยชน์มาก ฉันต้องการเพียงค่า 'host.docker.internal'
Hernán Acosta

19

ในกรณีของฉันฉันสามารถแก้ปัญหาในการตรวจสอบภาพ postgre ของฉันผ่านคำสั่ง

docker inspect CONTAINER_ID  | grep IPAddress.

ดังนั้นฉันจึงใช้ที่อยู่ ip ของนักเทียบท่าเพื่อกำหนดค่าการเชื่อมต่อ pgadmin 4 ของฉันและทุกอย่างก็เรียบร้อยดี ขอบคุณข้อมูล @Afshin Ghazi


สิ่งนี้ใช้ได้กับฉัน
Kalpesh Tawde

17

หาก pgAdmin มีจุดประสงค์ให้เรียกใช้ด้วยโฮสต์ / แขกของ Ubuntu เดียวกันคุณต้องเชื่อมโยงคอนเทนเนอร์ postgres ดังนั้นจึงสามารถแก้ไขได้ด้วยชื่อ

1. เรียกใช้คอนเทนเนอร์ postgres:

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

2. เรียกใช้คอนเทนเนอร์ 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. ตอนนี้เมื่อเพิ่มเซิร์ฟเวอร์ใหม่ใน phAdmin web app ให้ใช้some-postgresเป็นชื่อเซิร์ฟเวอร์

สังเกต--link some-postgresตอนที่เราเรียกใช้ pgAdmin คำสั่งนี้ทำให้คอนเทนเนอร์ postgres มองเห็นได้สำหรับคอนเทนเนอร์ pgAdmin


1
ฉันสามารถเชื่อมต่อกับ psq กับเซิร์ฟเวอร์และฉันเข้าสู่อินเทอร์เฟซ pgadmin แต่ฉันใช้เครือข่าย / พอร์ตใดเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ postgres จากอินเทอร์เฟซ pgadmin
ทอม

1
สิ่งที่น่าสังเกตจากเอกสาร 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.ฉันยังไม่มีโชคในการใช้--linkเพื่อรับคอนเทนเนอร์ pgadmin เพื่อพูดคุยกับคอนเทนเนอร์ postgres ของฉัน อย่างไรก็ตามฉันสามารถเข้าถึง postgres จากการติดตั้ง pgadmin ในเครื่องได้
duct_tape_coder

11

ฉันรวมสิ่งนี้ไว้ในไฟล์ docker yaml เพื่อรับฐานข้อมูลและ 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

ชื่อผู้ใช้ postgres คือ alphaone และรหัสผ่านคือ xxxxxxxxxxx

ทำdocker psเพื่อรับรหัสคอนเทนเนอร์จากนั้นdocker inspect <dockerContainerId> | grep IPAddress

เช่น: docker inspect 2f50fabe8a87 | grep IPAddress

ใส่ที่อยู่ Ip ลงใน pgAdmin และข้อมูลประจำตัวฐานข้อมูลที่ใช้ในนักเทียบท่า:

pgAdmin


1
สิ่งนี้ช่วยได้ ฉันต้อง grep ที่อยู่ IP ที่ถูกต้องจากภายในคอนเทนเนอร์ที่เกี่ยวข้องกับนักเทียบท่า Postgres เพื่อเพิ่มไปยังการกำหนดค่าเซิร์ฟเวอร์ในพอร์ทัล Docker PgAdmin ดังที่แสดงไว้ด้านบน การพัตlocalhostไม่ได้ผล
Andrew Lobban

5

ในกรณีของฉันฉันมีคอนเทนเนอร์ PostgreSQL ดังนั้นฉันจึงไม่ได้เปลี่ยนคอนเทนเนอร์ของฉันหรือสร้างวิธีการเขียนเทียบท่าฉันต้องการ pgadming หลังจากไม่กี่เดือนเพื่อติดตั้ง PostgreSQL ดังนั้นนี่คือแนวทางของฉัน:

  1. docker inspect my_container_id_postgreSQL
  2. เครือข่ายที่กำหนดให้กับ PostgreSQL คือ:

    "เครือข่าย": {"docker_default": {"IPAddress": "172.18.0.2", ... }}

  3. เรียกใช้ PGADMIN ของฉันด้วย --networkคำสั่ง

    นักเทียบท่ารัน -p 85:80 - network docker_default -e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' -e 'PGADMIN_DEFAULT_PASSWORD = SuperSecret' -d dpage / pgadmin4

  4. ใส่ที่อยู่ Ip ลงใน pgAdmin และข้อมูลประจำตัวฐานข้อมูลที่ใช้ในนักเทียบท่า

ฉันหวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน ความนับถือ.



4

คุณต้องเปิดเผยพอร์ต postgres ในคอนเทนเนอร์กับระบบโลคัลของคุณ คุณทำได้โดยเรียกใช้คอนเทนเนอร์ของคุณดังนี้:

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

เมื่อเชื่อมต่อกับไคลเอนต์ GUI หรือ CLI ของคุณอย่าลืมใช้ที่อยู่ ip ไม่ใช่ localhost แม้ว่าที่อยู่ IP ของคุณจะเป็นที่อยู่ IP ในเครื่อง

docker ps จะให้ที่อยู่ IP แก่คุณที่อยู่คอนเทนเนอร์ postgres ของคุณเปิดอยู่


4

หากคุณตรวจสอบแล้วว่า PostgreSQL กำลังทำงานอยู่และคุณสามารถเชื่อมต่อกับ PgAdmin ในเครื่องได้ ...

คำตอบนั้นง่ายมาก: ใช้host.docker.internalistead ของlocalhostสำหรับ PgAdmin ที่ทำงานอยู่ภายใน Docker

ใช้ <code> host.docker.internal </code> istead ของ <code> localhost </code>


2

คุณสามารถสร้างเครือข่าย Docker bridge เพื่อทำสิ่งนี้ได้เช่นกัน

$ 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

เปิดhttp: // localhost: 8000 /

  1. คลิกเพิ่มเซิร์ฟเวอร์ใหม่
  2. สร้าง - เซิร์ฟเวอร์
    1. ชื่อ: db
    2. ชื่อโฮสต์ / ที่อยู่: หน้า
    3. ชื่อผู้ใช้: postgres
    4. รหัสผ่าน: pg123
  3. บันทึก

ชื่อโฮสต์ / ที่อยู่ที่ใช้ด้านบนคือชื่อของคอนเทนเนอร์ Postgres ที่กำหนดโดย --name pg


นี่เป็นแนวทางเฉพาะโดยใช้ชื่อคอนเทนเนอร์เป็นชื่อโฮสต์ แนวทางเดียวกับการตั้งค่า Nginx หรือบางอย่าง มีเหตุผล.
Sean McCarthy

2

หลังจากประสบปัญหานี้เป็นเวลาสองวันฉันสามารถแก้ไขปัญหานั้นได้

การแก้ปัญหานี้ได้รับคำตอบจากประชาชนเช่นตรวจสอบแล้ว

docker inspect CONTAINER_ID

แต่ในขณะที่เรียกใช้คำสั่งนี้ฉันได้รับบันทึกมากมายเช่นHost Config Config Network Settingsเป็นต้นดังนั้นฉันจึงสับสนว่า IPAddress ใดที่จะเพิ่มในการเชื่อมต่อpgAdminเพราะฉันลอง0.0.0.0และ config, host, networkSettings ที่แตกต่างกัน -2 IPAddress ใน บันทึก แต่ในที่สุดมันก็ใช้งานได้หลังจากพยายามมาก

มันใช้งานได้กับ IP ใดเราต้องเพิ่มที่อยู่ IP ของเครือข่ายนั้น (ซึ่งเราสร้างขึ้นเพื่อเชื่อมต่อpostgresและpgAdmin )

เช่นในกรณีของฉันเมื่อฉันเรียกใช้: -

นักเทียบท่าตรวจสอบ 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": "",

ดังนั้นเราจึงต้องเพิ่ม NetworkSettings -> Network -> Postgres (เครือข่ายที่สร้างโดยฉัน) -> IPAddress เช่น "IPAddress": "192.168.16.2"

หลังจากเพิ่ม ip นี้แล้วจะใช้งานได้

ฉันหวังว่ามันจะช่วยได้


1

ในการค้นหา ip ที่ถูกต้องสำหรับคอนเทนเนอร์ของคุณให้ดำเนินการคำสั่งต่อไปนี้:

ตรวจสอบ ID คอนเทนเนอร์:

docker ps

ในการตรวจสอบ IP ที่ถูกต้องของคอนเทนเนอร์ของคุณ:

docker inspect <ID_CONTAINER> | grep "IPAddress"

การกำหนดค่าของทั้ง PostgreSQL และ PgAdmin พร้อม Docker นั้นง่ายมากหากไม่ถูกต้องฉันขอแนะนำให้ทำการกำหนดค่าใหม่ตั้งแต่ต้นหากปัญหาของคุณลึกกว่า

นี่คือสคริปต์ที่ฉันพัฒนาขึ้นเพื่อแก้ปัญหานี้ script-sh / install-docker-postgres-and-pgadmin


1

สำหรับ macOS IPs postgresและpgadmin4แตกต่างจากที่docker inspectมีให้ ประเภท

docker-machine ls

ดูชื่อเซิร์ฟเวอร์ทางด้านซ้าย เป็นdefaultค่าเริ่มต้น

docker-machine ip defaultจะ IP คุณจำเป็นต้องใช้สำหรับทั้งสอง , pgadmin4ในเบราว์เซอร์และpostgresในpgadmin4การตั้งค่า


0

วิธีแก้ปัญหาที่ฉันพยายามและใช้ได้ผลคือการสร้างไฟล์นักเทียบท่าที่ฉันรวม postgress และ pgadmin ไว้เป็นบริการ สำหรับรายละเอียดเพิ่มเติม: การเชื่อมต่อ pgadmin กับ postgres ในนักเทียบท่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.