ฉันมี Postgresql บนเซิร์ฟเวอร์ในคอนเทนเนอร์นักเทียบท่า ฉันจะเชื่อมต่อจากภายนอกจากคอมพิวเตอร์ในพื้นที่ของฉันได้อย่างไร ฉันควรใช้การตั้งค่าใดเพื่ออนุญาตสิ่งนั้น
ฉันมี Postgresql บนเซิร์ฟเวอร์ในคอนเทนเนอร์นักเทียบท่า ฉันจะเชื่อมต่อจากภายนอกจากคอมพิวเตอร์ในพื้นที่ของฉันได้อย่างไร ฉันควรใช้การตั้งค่าใดเพื่ออนุญาตสิ่งนั้น
คำตอบ:
คุณสามารถเรียกใช้ 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 ของคุณ
ในโพสต์นี้มันมีรายละเอียด
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
ฉันจัดการเพื่อให้มันทำงานบน linux
เรียกใช้นักเทียบท่า postgres - ตรวจสอบให้แน่ใจว่าพอร์ตถูกเผยแพร่ฉันใช้อัลไพน์เพราะมันมีน้ำหนักเบา
sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine
ใช้เทอร์มินัลอื่นเข้าถึงฐานข้อมูลจากโฮสต์โดยใช้ postgres uri
psql postgresql://postgres:1234@localhost:5432/postgres
สำหรับผู้ใช้ mac, แทนที่ psql ด้วย pgcli
sudo
เพื่อเรียกใช้คอนเทนเนอร์ของคุณ
คุณยังสามารถเข้าถึงคำสั่ง docker exec โดย:
$ docker exec -it postgres-container bash
# su postgres
$ psql
หรือ
$ docker exec -it postgres-container psql -U postgres
su postgres
ทำอย่างไร
ฉันมีการรัน 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
ฉันใช้ 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
ในการเชื่อมต่อจาก 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
ฉันพยายามเชื่อมต่อจาก 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
นี่เป็นประสบการณ์ของฉันที่ฉันต้องการแบ่งปัน บางทีใครบางคนสามารถใช้ประโยชน์จากมันได้
/var/lib/mysql
?
ฉันสมมติว่าคุณต้องการที่จะสามารถดูข้อมูลที่มีอยู่ในภาชนะของคุณทุกครั้งที่คุณเชื่อมต่อกับมันจากภายนอก ในการทำเช่นนี้คุณจะต้องยืนยันข้อมูลในภาพ 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
ดูเหมือนว่าพอร์ต 5432 จะได้รับการป้องกันด้วยเหตุผลบางอย่าง ฉันเปลี่ยนการตั้งค่าพอร์ตของฉันจาก5432:5432
เป็น5416:5432
และคำสั่งต่อไปนี้ทำงานเพื่อเชื่อมต่อกับฐานข้อมูล postgres ของคุณจากภายนอกคอนเทนเนอร์นักเทียบท่า :
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
บริการบนเครื่องโฮสต์ของคุณแล้วซึ่งจะผูกไว้กับ localhost: 5432 ทำให้คุณไม่สามารถใช้งานได้ การแม็พพอร์ตโฮสต์อื่นกับพอร์ตเริ่มต้น 5432 ภายในคอนเทนเนอร์เป็นโซลูชันที่ดี หรือคุณสามารถหยุดบริการ postgres บนโฮสต์ของคุณ แต่บางทีมันอาจใช้สำหรับบางสิ่งที่คุณต้องการ
ก่อนเปิดภาพนักเทียบท่าสำหรับ postgres
docker exec -it <container_name>
จากนั้นคุณจะได้รับรูท - root@868594e88b53:/#
มันต้องการการเชื่อมต่อฐานข้อมูล
psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
ในกรณีที่มันเป็นแบ็กเอนด์ของ django คุณสามารถทำสิ่งนี้ได้
docker exec -it container_id python manage.py dbshell
มีคำตอบที่ดีที่นี่ แต่ถ้าคุณต้องการมีอินเตอร์เฟสสำหรับการจัดการฐานข้อมูล postgres คุณสามารถติดตั้ง pgAdmin บนเครื่องคอมพิวเตอร์ของคุณและเชื่อมต่อกับเครื่องระยะไกลโดยใช้ IP และพอร์ต postgres ที่เปิดเผย (โดยค่าเริ่มต้น 5432)
docker ps -a
เพื่อรับรหัสคอนเทนเนอร์จากนั้นนักเทียบท่า exec -it psql -U -W
ฉันรู้ว่ามันจะสายถ้าคุณใช้นักแต่งเพลงอย่าง @Martin
นี่คือตัวอย่างที่ช่วยให้ฉันเชื่อมต่อกับ psql ภายในคอนเทนเนอร์
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
ฉันไม่สามารถแสดงความคิดเห็นเพราะฉันไม่มีชื่อเสียง 50 หวังว่านี่จะช่วยได้