การเชื่อมต่อกับ Postgresql ในคอนเทนเนอร์นักเทียบท่าจากด้านนอก


202

ฉันมี Postgresql บนเซิร์ฟเวอร์ในคอนเทนเนอร์นักเทียบท่า ฉันจะเชื่อมต่อจากภายนอกจากคอมพิวเตอร์ในพื้นที่ของฉันได้อย่างไร ฉันควรใช้การตั้งค่าใดเพื่ออนุญาตสิ่งนั้น


1
คุณใช้คำสั่งอะไรเพื่อเริ่ม postresql คุณสามารถเปิดเผยพอร์ตและแมปได้
lvthillo

คำตอบ:


318

คุณสามารถเรียกใช้ Postgres ด้วยวิธีนี้ (จับคู่พอร์ต):

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

ดังนั้นตอนนี้คุณได้แมปพอร์ต 5432 ของคอนเทนเนอร์ของคุณกับพอร์ต 5432 ของเซิร์ฟเวอร์ของคุณ -p <host_port>:<container_port> . ดังนั้นตอนนี้คุณสามารถเข้าถึง postgres ได้จากของคุณpublic-server-ip:5432

วิธีทดสอบ: เรียกใช้ฐานข้อมูล postgres (คำสั่งด้านบน)

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

เข้าไปในคอนเทนเนอร์ของคุณและสร้างฐานข้อมูล:

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

ไปที่ localhost ของคุณ (ซึ่งคุณมีเครื่องมือหรือไคลเอนต์ psql)

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

(รหัสผ่าน 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   

ดังนั้นคุณจึงเข้าถึงฐานข้อมูล (ซึ่งทำงานใน docker บนเซิร์ฟเวอร์) จาก localhost ของคุณ

ในโพสต์นี้มันมีรายละเอียด


1
@Tjorriemorrie คุณแน่ใจหรือไม่ว่า postgres ของคุณกำลังทำงานอยู่ในเครื่องท้องถิ่นของคุณ? อาจลอง 127.0.0.1 แทน localhost แต่สำหรับพบว่ามันใช้งานได้
lvthillo

2
รับที่อยู่ IP สาธารณะของคุณ (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
พอล

5
จากการโพสต์ที่เกี่ยวข้องกับ postgres / docker ต่างๆฉันพบว่านี่เป็นหนึ่งในสิ่งที่มีประโยชน์ที่สุด ขอบคุณ.
rg88

1
@GarouDan หากคุณไม่ต้องการแมปพอร์ต แต่ยังต้องการเข้าถึงคอนเทนเนอร์ postgres จากโฮสต์ของคุณคุณจะต้องปรับใช้คอนเทนเนอร์ของคุณบนเครือข่ายโฮสต์เช่นนี้:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
กำลังออกจาก psql ทำงานร่วมกับ \ q (สำหรับมือใหม่อย่างฉัน)
Dirk Schumacher

44

ฉันจัดการเพื่อให้มันทำงานบน linux

  1. เรียกใช้นักเทียบท่า postgres - ตรวจสอบให้แน่ใจว่าพอร์ตถูกเผยแพร่ฉันใช้อัลไพน์เพราะมันมีน้ำหนักเบา

    sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine

  2. ใช้เทอร์มินัลอื่นเข้าถึงฐานข้อมูลจากโฮสต์โดยใช้ postgres uri

    psql postgresql://postgres:1234@localhost:5432/postgres

สำหรับผู้ใช้ mac, แทนที่ psql ด้วย pgcli


7
ดีใจที่มีคนตอบวิธีการเชื่อมต่อโดยไม่ต้องกระโดดลงในภาชนะ ขอบคุณ
PabTorre

1
คุณไม่ควรใช้sudoเพื่อเรียกใช้คอนเทนเนอร์ของคุณ
Russ Bateman

30

คุณยังสามารถเข้าถึงคำสั่ง docker exec โดย:

$ docker exec -it postgres-container bash

# su postgres

$ psql

หรือ

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

3
psql -U postgres
Maryna Krasnova

นั่นเป็นความคิดเห็นที่มีประโยชน์อย่างน่าประหลาดใจ
Dan Rosenstark

อะไรsu postgresทำอย่างไร
Breno

14

ฉันมีการรัน postgres บนเครื่องโฮสต์และไม่ต้องการอนุญาตการเชื่อมต่อจากเครือข่ายดังนั้นฉันจึงเรียกใช้อินสแตนซ์ postgres ชั่วคราวในคอนเทนเนอร์และสร้างฐานข้อมูลในสองบรรทัด:

# 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

ถ้าคุณต้องการสร้างฐานข้อมูลเริ่มต้นเดียวคุณสามารถเพิ่ม: -e POSTGRES_DB=my-dbเพื่อสร้าง my-db แทน postgres
framp

13

ฉันใช้ django กับ postgres ในคอนเทนเนอร์ Docker ในไฟล์นักเทียบท่าให้เพิ่มรายการต่อไปนี้:

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

ซึ่งจะเพิ่มพอร์ตที่เข้าถึงได้โดยเครื่องท้องถิ่นของคุณ สำหรับตัวฉันเองฉันเชื่อมต่อกับ DBeaver การทำเช่นนี้จะป้องกันพอร์ตที่ขัดแย้งกันระหว่างคำขอแอปของคุณกับคำขอเครื่องในเครื่อง ตอนแรกฉันได้รับข้อความแจ้งว่าพอร์ต 5432 กำลังใช้งาน (ซึ่งเป็นแอพ django) ดังนั้นฉันจึงไม่สามารถเข้าถึงได้โดย pgAdmin หรือ DBeaver


1
ฉันพบว่าสิ่งนี้มีประโยชน์มากที่สุด สำหรับคนที่ชอบแต่งท่านี้ดูเหมือนจะเป็นวิธีที่ดีที่สุด
David Frick

ขอบคุณ David การเข้ารหัสที่มีความสุข!
omeraiman

9

ในการเชื่อมต่อจาก localhost คุณต้องเพิ่ม '--net host':

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

คุณสามารถเข้าถึงเซิร์ฟเวอร์โดยตรงโดยไม่ต้องใช้ exec จาก localhost ของคุณโดยใช้:

psql -h localhost -p 5432 -U postgres

6

ฉันพยายามเชื่อมต่อจาก localhost (mac) กับคอนเทนเนอร์ postgres ฉันเปลี่ยนพอร์ตในไฟล์นักเทียบท่าจาก 5432 เป็น 3306 และเริ่มคอนเทนเนอร์ ไม่รู้เลยว่าทำไมฉันถึงทำ: |

จากนั้นฉันพยายามเชื่อมต่อกับ postgres ผ่าน PSequel และผู้ดูแลระบบและไม่สามารถสร้างการเชื่อมต่อได้

หลังจากเปลี่ยนกลับเป็นพอร์ต 5432 ทำงานได้ดี

  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

นี่เป็นประสบการณ์ของฉันที่ฉันต้องการแบ่งปัน บางทีใครบางคนสามารถใช้ประโยชน์จากมันได้


3
เส้นทางปริมาตร: /var/lib/mysql?
David Tabernero M.

5432 เป็นพอร์ตเริ่มต้น Postgres 3306 เป็นพอร์ตเริ่มต้นของ MySQL หากคุณเปลี่ยนพอร์ตที่เผยแพร่ใน Docker-compose เครื่องมือไคลเอนต์ใด ๆ ที่คุณพยายามใช้เพื่อเชื่อมต่อจะเริ่มต้นด้วยการพยายามเชื่อมต่อกับพอร์ต 5432 นอกจากว่าคุณจะบอกให้ใช้พอร์ตอื่น
Davos

6

ฉันสมมติว่าคุณต้องการที่จะสามารถดูข้อมูลที่มีอยู่ในภาชนะของคุณทุกครั้งที่คุณเชื่อมต่อกับมันจากภายนอก ในการทำเช่นนี้คุณจะต้องยืนยันข้อมูลในภาพ postgres

หากคุณไม่มีข้อมูลถาวรคุณจะต้องทำซ้ำทุกสิ่งที่คุณทำในครั้งแรก
ขั้นตอนที่ 3, 5, 6, 7 และ 8ตอบคำถามของคุณโดยตรง

นี่คือภาพรวมโดยละเอียดของกระบวนการทั้งหมดที่ฉันติดตามบน Windows 10 powershell (คำสั่งเหมือนกันใน Linux และ macOS เช่นกัน):

ขั้นตอนที่ 1 : เริ่ม PowerShell ในโหมดที่ไม่ใช่ผู้ดูแลระบบ

ขั้นตอนที่ 2 : ดาวน์โหลดภาพนักเทียบท่า postgres:
docker pull postgres:latest

ขั้นตอนที่ 3 : เริ่มนักเทียบท่าคอนเทนเนอร์ในโหมดเดี่ยวและเก็บข้อมูลบนภาพ postgres โดยการสร้างไดรฟ์และผูกไว้กับปลายทาง
(หมายเหตุ : โดยค่าเริ่มต้น 5432 เป็นพอร์ตเริ่มต้นที่ใช้ แต่ระบุไว้อย่างชัดเจนเพื่อป้องกันข้อผิดพลาดการเชื่อมต่อจากไคลเอนต์ pgadmin, dbeaver เป็นต้น)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

ขั้นตอนที่ 4 : ตรวจสอบสถานะการใช้งานคอนเทนเนอร์
docker ps -a

ขั้นตอนที่ 5 : เข้าไปด้านใน container_name ในโหมดการโต้ตอบ
(หมายเหตุ : คำสั่งเช่น ls, pwd, ฯลฯ สามารถดำเนินการได้ที่นี่หากคุณตรวจสอบคอนเทนเนอร์ linux ระหว่างการติดตั้ง)
docker exec -it postgres-test psql -U postgres

ขั้นตอนที่ 6 : สร้างข้อมูลตัวอย่าง ณ จุดนี้คุณสามารถเล่นกับpsqlคำสั่งในลักษณะต่อไปนี้:

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

ขั้นตอนที่ 7 : เปิดแอปพลิเคชันไคลเอนต์ฐานข้อมูลเช่นpgadminหรือdbeaverและป้อนด้านล่างในฟิลด์การเชื่อมต่อ:

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

ขั้นตอนที่ 8 : ป้อนแบบสอบถามselect * from test_tableในตัวแก้ไขแบบสอบถามและคุณควรจะเห็นผลลัพธ์123


5

ดูเหมือนว่าพอร์ต 5432 จะได้รับการป้องกันด้วยเหตุผลบางอย่าง ฉันเปลี่ยนการตั้งค่าพอร์ตของฉันจาก5432:5432เป็น5416:5432และคำสั่งต่อไปนี้ทำงานเพื่อเชื่อมต่อกับฐานข้อมูล postgres ของคุณจากภายนอกคอนเทนเนอร์นักเทียบท่า :

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

มันใช้งานได้สำหรับฉัน แต่ฉันไม่พบคำอธิบายบนอินเทอร์เน็ต คุณเจอไหม
negas

2
@negas คุณอาจเรียกใช้postgresบริการบนเครื่องโฮสต์ของคุณแล้วซึ่งจะผูกไว้กับ localhost: 5432 ทำให้คุณไม่สามารถใช้งานได้ การแม็พพอร์ตโฮสต์อื่นกับพอร์ตเริ่มต้น 5432 ภายในคอนเทนเนอร์เป็นโซลูชันที่ดี หรือคุณสามารถหยุดบริการ postgres บนโฮสต์ของคุณ แต่บางทีมันอาจใช้สำหรับบางสิ่งที่คุณต้องการ
Davos

5

ก่อนเปิดภาพนักเทียบท่าสำหรับ postgres

docker exec -it <container_name>

จากนั้นคุณจะได้รับรูท - root@868594e88b53:/# มันต้องการการเชื่อมต่อฐานข้อมูล

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


1

มีคำตอบที่ดีที่นี่ แต่ถ้าคุณต้องการมีอินเตอร์เฟสสำหรับการจัดการฐานข้อมูล postgres คุณสามารถติดตั้ง pgAdmin บนเครื่องคอมพิวเตอร์ของคุณและเชื่อมต่อกับเครื่องระยะไกลโดยใช้ IP และพอร์ต postgres ที่เปิดเผย (โดยค่าเริ่มต้น 5432)



-1

ฉันรู้ว่ามันจะสายถ้าคุณใช้นักแต่งเพลงอย่าง @Martin

นี่คือตัวอย่างที่ช่วยให้ฉันเชื่อมต่อกับ psql ภายในคอนเทนเนอร์

docker-compose run db bash

root@de96f9358b70:/# psql -h db -U root -d postgres_db

ฉันไม่สามารถแสดงความคิดเห็นเพราะฉันไม่มีชื่อเสียง 50 หวังว่านี่จะช่วยได้


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