สลับเซสชันไปมา จำไวยากรณ์ให้ขึ้นใจ และภาวนาไม่ให้พิมพ์ผิดกับคิวรีที่อาจทำลายข้อมูล เป็นเรื่องที่น่าเบื่อเร็วมาก ไม่มีแผนคิวรีแบบภาพ ไม่มีตัวเรียกดูสคีมา และไม่มีวิธีสำรองฐานข้อมูลที่สะดวก มันใช้งานได้ แต่ยังห่างไกลจากคำว่าเหมาะที่สุด
pgAdmin 4 แก้ปัญหานี้ด้วย GUI บนเบราว์เซอร์ที่สร้างมาเพื่อ PostgreSQL โดยเฉพาะ และการรันใน Docker หมายถึงไม่ต้องติดตั้งใดๆ ในเครื่อง เพียงแค่สตาร์ตคอนเทนเนอร์ก็พอ
ในบทความนี้ จะสาธิตการตั้งค่า PostgreSQL และ pgAdmin 4 ด้วย Docker Compose เชื่อมต่อคอนเทนเนอร์ทั้งสอง และใช้งาน Query Tool ตัวเรียกดูสคีมา และฟีเจอร์สำรองข้อมูลของ pgAdmin
ในการทำตาม จะต้องมี Docker ติดตั้งและกำลังทำงานอยู่บนเครื่อง หากเพิ่งเริ่มใช้ Docker Compose โปรดอ่านคู่มือของเราเพื่อดูว่า ช่วยให้งานพัฒนาหลายคอนเทนเนอร์ง่ายขึ้นอย่างไร.
pgAdmin 4 คืออะไร?
pgAdmin 4 เป็นแพลตฟอร์มโอเพ่นซอร์สแบบเบราว์เซอร์สำหรับงานแอดมินและพัฒนาบน PostgreSQL เข้าถึงผ่านเว็บเบราว์เซอร์ จึงไม่ต้องติดตั้งเดสก์ท็อปแอป ให้ GUI สำหรับจัดการฐานข้อมูล รันคิวรี ตรวจสอบสคีมา และจัดการสำรองข้อมูล โดยไม่ต้องใช้บรรทัดคำสั่ง
Docker image ทางการคือ dpage/pgadmin4 ซึ่งดูแลโดยทีมพัฒนา pgAdmin
การรัน pgAdmin 4 ใน Docker มีข้อดีหลายอย่างเหนือการติดตั้งในเครื่อง ข้อแรกคือความพกพา ทั้งสภาพแวดล้อมฐานข้อมูลอยู่ในไฟล์ docker-compose.yml ที่แชร์กับทีมได้ ข้อสองคือไม่มีปัญหาเวอร์ชันชนกัน pgAdmin รันในคอนเทนเนอร์ของตัวเอง แยกขาดจากสิ่งอื่นๆ บนเครื่อง และเมื่อเสร็จงาน docker compose down ก็ลบทุกอย่างสะอาด
pgAdmin 4 เทียบกับ GUI อื่นของ PostgreSQL
มีเครื่องมือ GUI สำหรับจัดการฐานข้อมูลอยู่มากมาย นี่คือการเปรียบเทียบ pgAdmin 4 กับสองทางเลือกยอดนิยม

pgAdmin 4 เทียบกับตัวเลือกยอดนิยม
DBeaver และ TablePlus เป็นเครื่องมือที่ดี แต่ทั้งคู่ไม่มี Docker image ทางการ หากอินสแตนซ์ PostgreSQL ของคุณรันอยู่ใน Docker อยู่แล้ว pgAdmin 4 คือคู่ที่เข้ากันได้ดี เพียงเพิ่มหนึ่งบริการลงใน docker-compose.yml แล้วทุกอย่างก็รันร่วมกันในเครือข่ายเดียว
ตั้งค่าสภาพแวดล้อมด้วย Docker Compose
วิธีที่เร็วที่สุดในการให้ PostgreSQL และ pgAdmin 4 รันร่วมกันคือไฟล์ docker-compose.yml ไฟล์เดียว หากยังใหม่กับหัวข้อนี้ Docker Compose Guide ของเราครอบคลุมพื้นฐานไว้ ที่นี่จะโฟกัสการตั้งค่าเฉพาะของ pgAdmin
นี่คือไฟล์ฉบับสมบูรณ์ที่คัดลอกวางได้เลย:
services:
postgres:
image: postgres:18
container_name: postgres
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql
networks:
- pgnetwork
pgadmin:
image: dpage/pgadmin4:9.13
container_name: pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: [email protected]
PGADMIN_DEFAULT_PASSWORD: password
PGADMIN_LISTEN_PORT: 5050
ports:
- "5050:5050"
volumes:
- pgadmin_data:/var/lib/pgadmin
depends_on:
- postgres
networks:
- pgnetwork
volumes:
postgres_data:
pgadmin_data:
networks:
pgnetwork:ขับเคลื่อนโดย
ฟิลด์ depends_on บอก Docker Compose ให้สตาร์ตคอนเทนเนอร์ postgres ก่อน pgadmin หากไม่มี pgAdmin อาจเริ่มก่อนที่ PostgreSQL จะพร้อมและเชื่อมต่อไม่สำเร็จ ทั้งนี้มันไม่ได้รอจน PostgreSQL สุขภาพดีสมบูรณ์ แค่รอให้คอนเทนเนอร์เริ่มเท่านั้น แต่ก็เพียงพอสำหรับหลีกเลี่ยง race condition ส่วนใหญ่
ตัวแปรสภาพแวดล้อมของ pgAdmin 4
ต้องมีตัวแปรสภาพแวดล้อมสองตัว:
PGADMIN_DEFAULT_EMAIL - อีเมลที่ใช้ล็อกอินหน้าเว็บของ pgAdmin
PGADMIN_DEFAULT_PASSWORD - รหัสผ่านของบัญชีนั้น
ตัวที่สามเป็นทางเลือก แต่ควรกำหนดไว้:
PGADMIN_LISTEN_PORT - พอร์ตที่ pgAdmin รับฟังภายในคอนเทนเนอร์ ค่าเริ่มต้นคือ 80 แต่ตั้งเป็น 5050 จะทำให้จัดการ mapping พอร์ตได้ชัดเจนขึ้น
อย่างไรก็ดี การฮาร์ดโค้ดข้อมูลรับรองไว้ในไฟล์ Compose เป็นแนวปฏิบัติที่ไม่ดี โดยเฉพาะหากไฟล์ถูกเก็บในระบบควบคุมเวอร์ชัน ให้ย้ายไปไว้ในไฟล์ .env แทน
สร้างไฟล์ .env ในไดเรกทอรีเดียวกับ docker-compose.yml:
POSTGRES_USER=admin
POSTGRES_PASSWORD=secret
POSTGRES_DB=mydb
PGADMIN_DEFAULT_EMAIL=[email protected]
PGADMIN_DEFAULT_PASSWORD=secretขับเคลื่อนโดย
จากนั้นอ้างอิงตัวแปรในไฟล์ Compose:
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}ขับเคลื่อนโดย
Docker Compose จะอ่านไฟล์ .env เมื่อรันคำสั่ง จึงไม่ต้องมีการตั้งค่าเพิ่มเติม เพียงอย่าลืมเพิ่ม .env ลงใน .gitignore เพื่อกันข้อมูลรับรองไม่ให้เข้าไปในรีโป
โวลโยมและการคงอยู่ของข้อมูล
โวลยูมที่แมปไปยัง /var/lib/pgadmin คือที่ที่ pgAdmin เก็บข้อมูล เช่น ข้อมูลเซสชัน การเชื่อมต่อเซิร์ฟเวอร์ที่บันทึกไว้ และการตั้งค่า หากตัดส่วนนี้ออกจากไฟล์ compose คุณจะสูญเสียทั้งหมดทุกครั้งที่คอนเทนเนอร์รีสตาร์ต
ในไฟล์ compose ปัจจุบัน คุณมี named volume ที่ Docker จัดการบนเครื่องโฮสต์ ข้อมูลจะคงอยู่แม้คอนเทนเนอร์รีสตาร์ต สร้างใหม่ หรืออัปเดตอิมเมจ ตราบใดที่ยังไม่ลบโวลยูมด้วย docker volume rm โดยเจตนา
เริ่มสแตกและเข้าถึง pgAdmin 4
เมื่อพร้อมไฟล์ docker-compose.yml การเริ่มสแตกใช้คำสั่งเดียว:
docker compose up -dขับเคลื่อนโดย
แฟลก -d จะรันทั้งสองคอนเทนเนอร์แบบ detached คือรันเบื้องหลังและเทอร์มินัลยังใช้งานต่อได้ เพื่อตรวจสอบว่าคอนเทนเนอร์ทั้งคู่กำลังรันอยู่:
docker psขับเคลื่อนโดย
ควรเห็นทั้ง postgres และ pgadmin แสดงสถานะ Up

สถานะคอนเทนเนอร์
หากมีสิ่งผิดปกติ ให้ตรวจสอบบันทึกของ pgAdmin:
docker logs pgadminขับเคลื่อนโดย
การสตาร์ตที่ปกติจะมีลักษณะดังนี้:

บันทึกการสตาร์ตของ pgAdmin
หากเห็นข้อผิดพลาด มักจะเป็นสามกรณีนี้:
-
การยืนยันรหัสผ่านล้มเหลว: ค่า PGADMIN_DEFAULT_PASSWORD ขาดหายหรือผิดรูปแบบในไฟล์ .env
-
พอร์ตถูกใช้งานแล้ว: มีอย่างอื่นรันอยู่ที่พอร์ต 5050 ให้เปลี่ยนพอร์ตฝั่งโฮสต์ในไฟล์ Compose
-
ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว: พาธของโวลยูมผิดหรือคอนเทนเนอร์ไม่มีสิทธิ์เขียน
เมื่อคอนเทนเนอร์ทั้งสองขึ้นและบันทึกดูเรียบร้อย เปิดเบราว์เซอร์แล้วไปที่ http://localhost:5050:

หน้าเข้าสู่ระบบ pgAdmin
เข้าสู่ระบบด้วยอีเมลและรหัสผ่านที่ตั้งไว้ใน PGADMIN_DEFAULT_EMAIL และ PGADMIN_DEFAULT_PASSWORD จะไปยังแดชบอร์ด pgAdmin พร้อมลงทะเบียนเซิร์ฟเวอร์ PostgreSQL:

หน้าแรก pgAdmin
เชื่อมต่อ pgAdmin 4 กับคอนเทนเนอร์ PostgreSQL
ในแถบด้านข้างของ pgAdmin คลิกขวาที่ Servers - Register - Server จะมีไดอะล็อกเปิดขึ้นพร้อมแท็บสองแท็บที่ต้องกรอก: General และ Connection
แท็บ General
ตั้งชื่อเซิร์ฟเวอร์ให้สื่อความหมาย เช่น local-dev-postgres นี่เป็นเพียงป้ายชื่อภายใน pgAdmin เลือกอะไรก็ได้ที่เหมาะกับการตั้งค่าของคุณ

ลงทะเบียนเซิร์ฟเวอร์ - แท็บ General
แท็บ Connection
อย่าใช้ localhost ที่นี่
ภายในเครือข่าย Docker localhost จะอ้างถึงคอนเทนเนอร์นั้นเอง ไม่ใช่เครื่องโฮสต์ และไม่ใช่คอนเทนเนอร์ PostgreSQL Docker มี DNS ภายในของตัวเอง และจะ resolve ชื่อคอนเทนเนอร์ตาม service name ที่กำหนดใน docker-compose.yml ดังนั้นหากบริการ PostgreSQL ชื่อ postgres นั่นคือ hostname ที่ต้องใช้
กรอกฟิลด์ดังนี้:
-
Host name/address: postgres (ชื่อตามบริการใน docker-compose.yml)
-
Port: 5432
-
Maintenance database: ค่า POSTGRES_DB จากไฟล์ Compose (เช่น mydb)
-
Username: ค่า POSTGRES_USER (เช่น admin)
-
Password: ค่า POSTGRES_PASSWORD
คลิก Save.

ลงทะเบียนเซิร์ฟเวอร์ - แท็บ Connection
หากกรอกถูกต้อง เซิร์ฟเวอร์จะปรากฏในแถบข้างและสามารถขยายดูฐานข้อมูลได้

ลงทะเบียนเซิร์ฟเวอร์สำเร็จ
แปลว่าเชื่อมต่อเรียบร้อยแล้ว
ตอนนี้เชื่อมต่อแล้ว มาดูพื้นฐานของ pgAdmin 4 และ Postgres โดยรวม
เปิด Query Tool โดยคลิก Tools - Query Tool จากเมนูด้านบน อินเทอร์เฟซมีสามพาเนล:
- Editor: พื้นที่เขียน SQL
- Data Output: แสดงผลลัพธ์หลังรันคิวรี
- Messages: ข้อความสถานะ ข้อผิดพลาด และข้อมูลการรันจาก PostgreSQL

Query tool
การเขียนและรัน SQL
มาสร้างตาราง orders แบบง่ายและเพิ่มข้อมูล สามารถรันแต่ละบล็อกด้วยปุ่ม Play หรือกด F5 ซึ่งเป็นทางลัด
รันคำสั่งนี้เพื่อสร้างตาราง:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
product VARCHAR(100) NOT NULL,
quantity INT NOT NULL,
order_date DATE DEFAULT CURRENT_DATE
);ขับเคลื่อนโดย
แทรกข้อมูลสองสามแถว:
INSERT INTO orders (customer_name, product, quantity)
VALUES
('Alice Johnson', 'Wireless Keyboard', 2),
('Bob Smith', 'USB-C Hub', 1),
('Carol White', 'Mechanical Keyboard', 3);ขับเคลื่อนโดย
แล้วคิวรีข้อมูล:
SELECT * FROM orders;ขับเคลื่อนโดย

การคิวรีข้อมูล
ผลลัพธ์จะแสดงในพาเนล Data Output เป็นตาราง สามารถเรียงคอลัมน์ ปรับขนาด และคัดลอกแถวจากกริดได้โดยตรง
การอ่านแผนคิวรีแบบภาพ
เพื่อดูว่าเบื้องหลังเกิดอะไรขึ้นเมื่อรันคิวรี ให้รัน EXPLAIN ANALYZE กับคำสั่ง SELECT ของคุณ:
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_name = 'Alice Johnson';ขับเคลื่อนโดย

ผลลัพธ์ Explain Analyze
พาเนล Data Output จะแสดงผลดิบ แต่ pgAdmin มีทางเลือกที่ดีกว่า คลิกปุ่ม Explain ในทูลบาร์ แล้ว pgAdmin จะเรนเดอร์แผนคิวรีเป็นกราฟเชิงโต้ตอบ

แผนคิวรีแบบกราฟ
สำหรับคิวรีนี้มันง่าย แต่เมื่อมีการ join ตารางหรือรวมข้อมูลซับซ้อน คุณจะได้ข้อมูลเชิงลึกมากขึ้น
สิ่งนี้สำคัญเพราะการอ่านผลลัพธ์ EXPLAIN แบบดิบช้าและเกิดข้อผิดพลาดง่าย แผนแบบภาพทำให้เห็นชัดว่าเมื่อใดที่ PostgreSQL สแกนทั้งตารางขนาดใหญ่ หรือเมื่อมีอินเด็กซ์แต่ไม่ได้ถูกใช้งาน
จัดการสคีมาฐานข้อมูล
แถบด้านข้างของ pgAdmin แสดงโครงสร้างฐานข้อมูลทั้งหมด และให้ปรับแก้ผ่าน GUI ได้
โครงสร้างต้นไม้ในแถบข้างคือ Servers - ชื่อเซิร์ฟเวอร์ของคุณ - Databases - ฐานข้อมูลของคุณ - Schemas - public - Tables ขยายตารางใดๆ จะเห็น Columns, Indexes และ Constraints เป็นโหนดย่อย คลิกเพื่อดูรายละเอียดในพาเนลขวา
การสร้างและแก้ไขตาราง
เพื่อสร้างตารางใหม่ คลิกขวาที่ Tables ใต้สคีมาของคุณ แล้วเลือก Create - Table จะมีไดอะล็อกเปิดพร้อมหลายแท็บ

การสร้างตาราง
แท็บ General ใช้ตั้งชื่อตาราง สลับไปแท็บ Columns เพื่อเพิ่มคอลัมน์ แต่ละแถวกำหนดชื่อคอลัมน์ ชนิดข้อมูล ความยาว และอนุญาตให้ว่างหรือไม่ แท็บ Constraints ใช้กำหนดคีย์หลัก คีย์ต่างประเทศ และข้อจำกัดแบบยูนีก
เพื่อเพิ่มอินเด็กซ์ให้ตารางที่มีอยู่ ให้ขยายตารางในแถบข้าง คลิกขวาที่ Indexes แล้วเลือก Create - Index เลือกคอลัมน์ที่จะทำดัชนีและชนิดอินเด็กซ์ โดย btree เป็นค่าเริ่มต้นและเหมาะกับส่วนใหญ่

การสร้างอินเด็กซ์
สำรองและกู้คืน
เพื่อสำรองฐานข้อมูล ไปที่ Tools - Backup แล้วเลือกฟอร์แมต:
- Custom: ไบนารีแบบบีบอัด ที่ยืดหยุ่นที่สุด และเหมาะกับส่วนใหญ่ เพราะสามารถกู้คืนเฉพาะบางตารางได้
- Plain: สคริปต์ SQL ธรรมดาที่เปิดอ่านได้ด้วยโปรแกรมแก้ไขข้อความใดๆ เหมาะสำหรับตรวจทานหรือแก้ไขก่อนกู้คืน
- Tar: แฟ้มบีบอัดแบบไม่บีบอัด พบไม่บ่อยแต่มีประโยชน์ในเวิร์กโฟลว์กู้คืนบางแบบ
หลังเลือกฟอร์แมตและพาธปลายทาง pgAdmin จะรัน pg_dump เบื้องหลังและบันทึกไฟล์ลงเครื่องท้องถิ่น

การสร้างสำรองข้อมูล
เมื่อต้องการกู้คืน ไปที่ Tools - Restore เลือกไฟล์สำรอง แล้วระบุฐานข้อมูลเป้าหมาย

การกู้คืนจากไฟล์สำรอง
หากสงสัยว่าทำไมสิ่งนี้จึงมีประโยชน์ ลองนึกถึงการทดสอบไมเกรชันที่อาจทำลายข้อมูลบนฐานข้อมูลสำหรับพัฒนา สำรองไว้ก่อน รันไมเกรชัน และหากมีอะไรพัง ก็คืนค่าจากสำรองเพื่อกลับสู่สถานะที่แน่นอน
แนวปฏิบัติที่ดีสำหรับการรัน pgAdmin 4 ใน Docker
การทำให้ pgAdmin 4 รันได้คืออย่างหนึ่ง แต่การให้รันได้ราบรื่นต้องรู้เพิ่มเติมเล็กน้อย ต่อไปนี้คือเคล็ดลับเชิงปฏิบัติ
อย่าเก็บข้อมูลรับรองไว้ในไฟล์ Compose
หาก docker-compose.yml ถูกเก็บในระบบควบคุมเวอร์ชัน ซึ่งมักเป็นเช่นนั้น รหัสผ่านที่ฮาร์ดโค้ดก็จะไปด้วย ใช้ไฟล์ .env สำหรับข้อมูลรับรองและเพิ่มไว้ใน .gitignore สำหรับสภาพแวดล้อมโปรดักชัน ให้ยกระดับด้วย Docker secrets ซึ่งเมานต์ค่าที่อ่อนไหวเป็นไฟล์แทนตัวแปรสภาพแวดล้อม
อย่าเปิดเผยพอร์ตของ pgAdmin ต่อสาธารณะ
โดยค่าเริ่มต้น Docker จะ bind พอร์ตไปยัง 0.0.0.0 ซึ่งหมายถึงทุกอินเทอร์เฟซเครือข่าย รวมถึงสาธารณะ บนเซิร์ฟเวอร์ระยะไกล นั่นทำให้อินสแตนซ์ pgAdmin เข้าถึงได้จากอินเทอร์เน็ต ให้ bind ไปยัง 127.0.0.1 โดยชัดเจนแทน:
ports:
- "127.0.0.1:5050:5050"ขับเคลื่อนโดย
วิธีนี้ทำให้เข้าถึง pgAdmin ได้จากตัวเซิร์ฟเวอร์เท่านั้น หากต้องการเข้าถึงจากระยะไกล ให้ใช้ SSH tunnel หรือ reverse proxy
ปักหมุดแท็กของอิมเมจ
การใช้ dpage/pgadmin4:latest จะดึงเวอร์ชันใหม่เมื่อมีใครรัน docker compose pull เวอร์ชันใหม่อาจทำงานต่างออกไป ทำให้คอนฟิกเสีย หรือมีการเปลี่ยนแปลงที่ไม่คาดคิด ใช้แท็กเฉพาะอย่าง dpage/pgadmin4:9.13 เพื่อให้ทุกคนในทีมรันเวอร์ชันเดียวกัน
พรีโหลดการเชื่อมต่อเซิร์ฟเวอร์ด้วย servers.json
หากทั้งทีมใช้ชุด Compose เดียวกัน อย่าปล่อยให้ทุกคนต้องลงทะเบียนเซิร์ฟเวอร์ PostgreSQL หลังสตาร์ตสแตก pgAdmin รองรับไฟล์ servers.json ที่เติมการเชื่อมต่อให้โดยอัตโนมัติขณะเริ่มต้น เมานต์ไฟล์เข้าไปในคอนเทนเนอร์แบบนี้:
volumes:
- ./servers.json:/pgadmin4/servers.jsonขับเคลื่อนโดย
ตัวอย่าง servers.json แบบมินิมัลมีดังนี้:
{
"Servers": {
"1": {
"Name": "local-dev-postgres",
"Group": "Servers",
"Host": "postgres",
"Port": 5432,
"MaintenanceDB": "mydb",
"Username": "admin",
"SSLMode": "prefer"
}
}
}ขับเคลื่อนโดย
เซิร์ฟเวอร์จะปรากฏขึ้นเมื่อ pgAdmin เริ่มทำงาน โดยไม่ต้องตั้งค่าด้วยตนเอง
สรุป
บทความนี้พาเดินตั้งค่า pgAdmin 4 ใน Docker ตั้งแต่ศูนย์ เขียนไฟล์ Docker Compose ที่เปิดทั้ง PostgreSQL และ pgAdmin 4 พร้อมกัน เชื่อมต่อคอนเทนเนอร์ทั้งสองด้วย DNS ภายในของ Docker และใช้ฟีเจอร์หลักของ pgAdmin ได้แก่ Query Tool ตัวเรียกดูสคีมา และเวิร์กโฟลว์สำรอง/กู้คืน
หลักการสำคัญคือความทำซ้ำได้
ไฟล์ docker-compose.yml ไฟล์ servers.json และไฟล์ .env คือทั้งหมดที่ต้องใช้เพื่อส่งมอบสภาพแวดล้อมฐานข้อมูลที่ตั้งค่าเสร็จให้เพื่อนร่วมทีม สิ่งนี้ช่วยให้ปัญหา “ทำไมของฉันใช้ได้ แต่อีกเครื่องใช้ไม่ได้” ไม่เกิดขึ้นอีก
หากอยากเจาะลึก Docker และการทำคอนเทนเนอร์ ลองดูคอร์ส Intermediate Docker ของเรา อัดแน่นด้วยทิปที่เป็นประโยชน์เกี่ยวกับ multi-stage builds เน็ตเวิร์กกิง และเจาะลึก Compose
สลับเซสชันไปมา จำไวยากรณ์ให้ขึ้นใจ และภาวนาไม่ให้พิมพ์ผิดกับคิวรีที่อาจทำลายข้อมูล เป็นเรื่องที่น่าเบื่อเร็วมาก ไม่มีแผนคิวรีแบบภาพ ไม่มีตัวเรียกดูสคีมา และไม่มีวิธีสำรองฐานข้อมูลที่สะดวก มันใช้งานได้ แต่ยังห่างไกลจากคำว่าเหมาะที่สุด
pgAdmin 4 แก้ปัญหานี้ด้วย GUI บนเบราว์เซอร์ที่สร้างมาเพื่อ PostgreSQL โดยเฉพาะ และการรันใน Docker หมายถึงไม่ต้องติดตั้งใดๆ ในเครื่อง เพียงแค่สตาร์ตคอนเทนเนอร์ก็พอ
ในบทความนี้ จะสาธิตการตั้งค่า PostgreSQL และ pgAdmin 4 ด้วย Docker Compose เชื่อมต่อคอนเทนเนอร์ทั้งสอง และใช้งาน Query Tool ตัวเรียกดูสคีมา และฟีเจอร์สำรองข้อมูลของ pgAdmin
ในการทำตาม จะต้องมี Docker ติดตั้งและกำลังทำงานอยู่บนเครื่อง หากเพิ่งเริ่มใช้ Docker Compose โปรดอ่านคู่มือของเราเพื่อดูว่า ช่วยให้งานพัฒนาหลายคอนเทนเนอร์ง่ายขึ้นอย่างไร.
pgAdmin 4 คืออะไร?
pgAdmin 4 เป็นแพลตฟอร์มโอเพ่นซอร์สแบบเบราว์เซอร์สำหรับงานแอดมินและพัฒนาบน PostgreSQL เข้าถึงผ่านเว็บเบราว์เซอร์ จึงไม่ต้องติดตั้งเดสก์ท็อปแอป ให้ GUI สำหรับจัดการฐานข้อมูล รันคิวรี ตรวจสอบสคีมา และจัดการสำรองข้อมูล โดยไม่ต้องใช้บรรทัดคำสั่ง
Docker image ทางการคือ
dpage/pgadmin4ซึ่งดูแลโดยทีมพัฒนา pgAdminการรัน pgAdmin 4 ใน Docker มีข้อดีหลายอย่างเหนือการติดตั้งในเครื่อง ข้อแรกคือความพกพา ทั้งสภาพแวดล้อมฐานข้อมูลอยู่ในไฟล์
docker-compose.ymlที่แชร์กับทีมได้ ข้อสองคือไม่มีปัญหาเวอร์ชันชนกัน pgAdmin รันในคอนเทนเนอร์ของตัวเอง แยกขาดจากสิ่งอื่นๆ บนเครื่อง และเมื่อเสร็จงานdocker compose downก็ลบทุกอย่างสะอาดpgAdmin 4 เทียบกับ GUI อื่นของ PostgreSQL
มีเครื่องมือ GUI สำหรับจัดการฐานข้อมูลอยู่มากมาย นี่คือการเปรียบเทียบ pgAdmin 4 กับสองทางเลือกยอดนิยม
pgAdmin 4 เทียบกับตัวเลือกยอดนิยม
DBeaver และ TablePlus เป็นเครื่องมือที่ดี แต่ทั้งคู่ไม่มี Docker image ทางการ หากอินสแตนซ์ PostgreSQL ของคุณรันอยู่ใน Docker อยู่แล้ว pgAdmin 4 คือคู่ที่เข้ากันได้ดี เพียงเพิ่มหนึ่งบริการลงใน
docker-compose.ymlแล้วทุกอย่างก็รันร่วมกันในเครือข่ายเดียวตั้งค่าสภาพแวดล้อมด้วย Docker Compose
วิธีที่เร็วที่สุดในการให้ PostgreSQL และ pgAdmin 4 รันร่วมกันคือไฟล์
docker-compose.ymlไฟล์เดียว หากยังใหม่กับหัวข้อนี้ Docker Compose Guide ของเราครอบคลุมพื้นฐานไว้ ที่นี่จะโฟกัสการตั้งค่าเฉพาะของ pgAdminนี่คือไฟล์ฉบับสมบูรณ์ที่คัดลอกวางได้เลย:
ฟิลด์
depends_onบอก Docker Compose ให้สตาร์ตคอนเทนเนอร์postgresก่อนpgadminหากไม่มี pgAdmin อาจเริ่มก่อนที่ PostgreSQL จะพร้อมและเชื่อมต่อไม่สำเร็จ ทั้งนี้มันไม่ได้รอจน PostgreSQL สุขภาพดีสมบูรณ์ แค่รอให้คอนเทนเนอร์เริ่มเท่านั้น แต่ก็เพียงพอสำหรับหลีกเลี่ยง race condition ส่วนใหญ่ตัวแปรสภาพแวดล้อมของ pgAdmin 4
ต้องมีตัวแปรสภาพแวดล้อมสองตัว:
PGADMIN_DEFAULT_EMAIL- อีเมลที่ใช้ล็อกอินหน้าเว็บของ pgAdminPGADMIN_DEFAULT_PASSWORD- รหัสผ่านของบัญชีนั้นตัวที่สามเป็นทางเลือก แต่ควรกำหนดไว้:
PGADMIN_LISTEN_PORT- พอร์ตที่ pgAdmin รับฟังภายในคอนเทนเนอร์ ค่าเริ่มต้นคือ 80 แต่ตั้งเป็น5050จะทำให้จัดการ mapping พอร์ตได้ชัดเจนขึ้นอย่างไรก็ดี การฮาร์ดโค้ดข้อมูลรับรองไว้ในไฟล์ Compose เป็นแนวปฏิบัติที่ไม่ดี โดยเฉพาะหากไฟล์ถูกเก็บในระบบควบคุมเวอร์ชัน ให้ย้ายไปไว้ในไฟล์
.envแทนสร้างไฟล์
.envในไดเรกทอรีเดียวกับdocker-compose.yml:จากนั้นอ้างอิงตัวแปรในไฟล์ Compose:
Docker Compose จะอ่านไฟล์
.envเมื่อรันคำสั่ง จึงไม่ต้องมีการตั้งค่าเพิ่มเติม เพียงอย่าลืมเพิ่ม.envลงใน.gitignoreเพื่อกันข้อมูลรับรองไม่ให้เข้าไปในรีโปโวลโยมและการคงอยู่ของข้อมูล
โวลยูมที่แมปไปยัง
/var/lib/pgadminคือที่ที่ pgAdmin เก็บข้อมูล เช่น ข้อมูลเซสชัน การเชื่อมต่อเซิร์ฟเวอร์ที่บันทึกไว้ และการตั้งค่า หากตัดส่วนนี้ออกจากไฟล์ compose คุณจะสูญเสียทั้งหมดทุกครั้งที่คอนเทนเนอร์รีสตาร์ตในไฟล์ compose ปัจจุบัน คุณมี named volume ที่ Docker จัดการบนเครื่องโฮสต์ ข้อมูลจะคงอยู่แม้คอนเทนเนอร์รีสตาร์ต สร้างใหม่ หรืออัปเดตอิมเมจ ตราบใดที่ยังไม่ลบโวลยูมด้วย
docker volume rmโดยเจตนาเริ่มสแตกและเข้าถึง pgAdmin 4
เมื่อพร้อมไฟล์
docker-compose.ymlการเริ่มสแตกใช้คำสั่งเดียว:แฟลก
-dจะรันทั้งสองคอนเทนเนอร์แบบ detached คือรันเบื้องหลังและเทอร์มินัลยังใช้งานต่อได้ เพื่อตรวจสอบว่าคอนเทนเนอร์ทั้งคู่กำลังรันอยู่:ควรเห็นทั้ง
postgresและpgadminแสดงสถานะUpสถานะคอนเทนเนอร์
หากมีสิ่งผิดปกติ ให้ตรวจสอบบันทึกของ pgAdmin:
การสตาร์ตที่ปกติจะมีลักษณะดังนี้:
บันทึกการสตาร์ตของ pgAdmin
หากเห็นข้อผิดพลาด มักจะเป็นสามกรณีนี้:
การยืนยันรหัสผ่านล้มเหลว: ค่า
PGADMIN_DEFAULT_PASSWORDขาดหายหรือผิดรูปแบบในไฟล์.envพอร์ตถูกใช้งานแล้ว: มีอย่างอื่นรันอยู่ที่พอร์ต 5050 ให้เปลี่ยนพอร์ตฝั่งโฮสต์ในไฟล์ Compose
ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว: พาธของโวลยูมผิดหรือคอนเทนเนอร์ไม่มีสิทธิ์เขียน
เมื่อคอนเทนเนอร์ทั้งสองขึ้นและบันทึกดูเรียบร้อย เปิดเบราว์เซอร์แล้วไปที่
http://localhost:5050:หน้าเข้าสู่ระบบ pgAdmin
เข้าสู่ระบบด้วยอีเมลและรหัสผ่านที่ตั้งไว้ใน
PGADMIN_DEFAULT_EMAILและPGADMIN_DEFAULT_PASSWORDจะไปยังแดชบอร์ด pgAdmin พร้อมลงทะเบียนเซิร์ฟเวอร์ PostgreSQL:หน้าแรก pgAdmin
เชื่อมต่อ pgAdmin 4 กับคอนเทนเนอร์ PostgreSQL
ในแถบด้านข้างของ pgAdmin คลิกขวาที่ Servers - Register - Server จะมีไดอะล็อกเปิดขึ้นพร้อมแท็บสองแท็บที่ต้องกรอก: General และ Connection
แท็บ General
ตั้งชื่อเซิร์ฟเวอร์ให้สื่อความหมาย เช่น
local-dev-postgresนี่เป็นเพียงป้ายชื่อภายใน pgAdmin เลือกอะไรก็ได้ที่เหมาะกับการตั้งค่าของคุณลงทะเบียนเซิร์ฟเวอร์ - แท็บ General
แท็บ Connection
อย่าใช้
localhostที่นี่ภายในเครือข่าย Docker
localhostจะอ้างถึงคอนเทนเนอร์นั้นเอง ไม่ใช่เครื่องโฮสต์ และไม่ใช่คอนเทนเนอร์ PostgreSQL Docker มี DNS ภายในของตัวเอง และจะ resolve ชื่อคอนเทนเนอร์ตาม service name ที่กำหนดในdocker-compose.ymlดังนั้นหากบริการ PostgreSQL ชื่อpostgresนั่นคือ hostname ที่ต้องใช้กรอกฟิลด์ดังนี้:
Host name/address:
postgres(ชื่อตามบริการในdocker-compose.yml)Port:
5432Maintenance database: ค่า
POSTGRES_DBจากไฟล์ Compose (เช่นmydb)Username: ค่า
POSTGRES_USER(เช่นadmin)Password: ค่า
POSTGRES_PASSWORDคลิก Save.
ลงทะเบียนเซิร์ฟเวอร์ - แท็บ Connection
หากกรอกถูกต้อง เซิร์ฟเวอร์จะปรากฏในแถบข้างและสามารถขยายดูฐานข้อมูลได้
ลงทะเบียนเซิร์ฟเวอร์สำเร็จ
แปลว่าเชื่อมต่อเรียบร้อยแล้ว
การใช้ Query Tool
ตอนนี้เชื่อมต่อแล้ว มาดูพื้นฐานของ pgAdmin 4 และ Postgres โดยรวม
เปิด Query Tool โดยคลิก Tools - Query Tool จากเมนูด้านบน อินเทอร์เฟซมีสามพาเนล:
Query tool
การเขียนและรัน SQL
มาสร้างตาราง
ordersแบบง่ายและเพิ่มข้อมูล สามารถรันแต่ละบล็อกด้วยปุ่ม Play หรือกด F5 ซึ่งเป็นทางลัดรันคำสั่งนี้เพื่อสร้างตาราง:
แทรกข้อมูลสองสามแถว:
แล้วคิวรีข้อมูล:
การคิวรีข้อมูล
ผลลัพธ์จะแสดงในพาเนล Data Output เป็นตาราง สามารถเรียงคอลัมน์ ปรับขนาด และคัดลอกแถวจากกริดได้โดยตรง
การอ่านแผนคิวรีแบบภาพ
เพื่อดูว่าเบื้องหลังเกิดอะไรขึ้นเมื่อรันคิวรี ให้รัน
EXPLAIN ANALYZEกับคำสั่งSELECTของคุณ:ผลลัพธ์ Explain Analyze
พาเนล Data Output จะแสดงผลดิบ แต่ pgAdmin มีทางเลือกที่ดีกว่า คลิกปุ่ม Explain ในทูลบาร์ แล้ว pgAdmin จะเรนเดอร์แผนคิวรีเป็นกราฟเชิงโต้ตอบ
แผนคิวรีแบบกราฟ
สำหรับคิวรีนี้มันง่าย แต่เมื่อมีการ join ตารางหรือรวมข้อมูลซับซ้อน คุณจะได้ข้อมูลเชิงลึกมากขึ้น
สิ่งนี้สำคัญเพราะการอ่านผลลัพธ์
EXPLAINแบบดิบช้าและเกิดข้อผิดพลาดง่าย แผนแบบภาพทำให้เห็นชัดว่าเมื่อใดที่ PostgreSQL สแกนทั้งตารางขนาดใหญ่ หรือเมื่อมีอินเด็กซ์แต่ไม่ได้ถูกใช้งานจัดการสคีมาฐานข้อมูล
แถบด้านข้างของ pgAdmin แสดงโครงสร้างฐานข้อมูลทั้งหมด และให้ปรับแก้ผ่าน GUI ได้
โครงสร้างต้นไม้ในแถบข้างคือ Servers - ชื่อเซิร์ฟเวอร์ของคุณ - Databases - ฐานข้อมูลของคุณ - Schemas - public - Tables ขยายตารางใดๆ จะเห็น Columns, Indexes และ Constraints เป็นโหนดย่อย คลิกเพื่อดูรายละเอียดในพาเนลขวา
การสร้างและแก้ไขตาราง
เพื่อสร้างตารางใหม่ คลิกขวาที่ Tables ใต้สคีมาของคุณ แล้วเลือก Create - Table จะมีไดอะล็อกเปิดพร้อมหลายแท็บ
การสร้างตาราง
แท็บ General ใช้ตั้งชื่อตาราง สลับไปแท็บ Columns เพื่อเพิ่มคอลัมน์ แต่ละแถวกำหนดชื่อคอลัมน์ ชนิดข้อมูล ความยาว และอนุญาตให้ว่างหรือไม่ แท็บ Constraints ใช้กำหนดคีย์หลัก คีย์ต่างประเทศ และข้อจำกัดแบบยูนีก
เพื่อเพิ่มอินเด็กซ์ให้ตารางที่มีอยู่ ให้ขยายตารางในแถบข้าง คลิกขวาที่ Indexes แล้วเลือก Create - Index เลือกคอลัมน์ที่จะทำดัชนีและชนิดอินเด็กซ์ โดย
btreeเป็นค่าเริ่มต้นและเหมาะกับส่วนใหญ่การสร้างอินเด็กซ์
สำรองและกู้คืน
เพื่อสำรองฐานข้อมูล ไปที่ Tools - Backup แล้วเลือกฟอร์แมต:
หลังเลือกฟอร์แมตและพาธปลายทาง pgAdmin จะรัน
pg_dumpเบื้องหลังและบันทึกไฟล์ลงเครื่องท้องถิ่นการสร้างสำรองข้อมูล
เมื่อต้องการกู้คืน ไปที่ Tools - Restore เลือกไฟล์สำรอง แล้วระบุฐานข้อมูลเป้าหมาย
การกู้คืนจากไฟล์สำรอง
หากสงสัยว่าทำไมสิ่งนี้จึงมีประโยชน์ ลองนึกถึงการทดสอบไมเกรชันที่อาจทำลายข้อมูลบนฐานข้อมูลสำหรับพัฒนา สำรองไว้ก่อน รันไมเกรชัน และหากมีอะไรพัง ก็คืนค่าจากสำรองเพื่อกลับสู่สถานะที่แน่นอน
แนวปฏิบัติที่ดีสำหรับการรัน pgAdmin 4 ใน Docker
การทำให้ pgAdmin 4 รันได้คืออย่างหนึ่ง แต่การให้รันได้ราบรื่นต้องรู้เพิ่มเติมเล็กน้อย ต่อไปนี้คือเคล็ดลับเชิงปฏิบัติ
อย่าเก็บข้อมูลรับรองไว้ในไฟล์ Compose
หาก
docker-compose.ymlถูกเก็บในระบบควบคุมเวอร์ชัน ซึ่งมักเป็นเช่นนั้น รหัสผ่านที่ฮาร์ดโค้ดก็จะไปด้วย ใช้ไฟล์.envสำหรับข้อมูลรับรองและเพิ่มไว้ใน.gitignoreสำหรับสภาพแวดล้อมโปรดักชัน ให้ยกระดับด้วย Docker secrets ซึ่งเมานต์ค่าที่อ่อนไหวเป็นไฟล์แทนตัวแปรสภาพแวดล้อมอย่าเปิดเผยพอร์ตของ pgAdmin ต่อสาธารณะ
โดยค่าเริ่มต้น Docker จะ bind พอร์ตไปยัง
0.0.0.0ซึ่งหมายถึงทุกอินเทอร์เฟซเครือข่าย รวมถึงสาธารณะ บนเซิร์ฟเวอร์ระยะไกล นั่นทำให้อินสแตนซ์ pgAdmin เข้าถึงได้จากอินเทอร์เน็ต ให้ bind ไปยัง127.0.0.1โดยชัดเจนแทน:วิธีนี้ทำให้เข้าถึง pgAdmin ได้จากตัวเซิร์ฟเวอร์เท่านั้น หากต้องการเข้าถึงจากระยะไกล ให้ใช้ SSH tunnel หรือ reverse proxy
ปักหมุดแท็กของอิมเมจ
การใช้
dpage/pgadmin4:latestจะดึงเวอร์ชันใหม่เมื่อมีใครรันdocker compose pullเวอร์ชันใหม่อาจทำงานต่างออกไป ทำให้คอนฟิกเสีย หรือมีการเปลี่ยนแปลงที่ไม่คาดคิด ใช้แท็กเฉพาะอย่างdpage/pgadmin4:9.13เพื่อให้ทุกคนในทีมรันเวอร์ชันเดียวกันพรีโหลดการเชื่อมต่อเซิร์ฟเวอร์ด้วย
servers.jsonหากทั้งทีมใช้ชุด Compose เดียวกัน อย่าปล่อยให้ทุกคนต้องลงทะเบียนเซิร์ฟเวอร์ PostgreSQL หลังสตาร์ตสแตก pgAdmin รองรับไฟล์
servers.jsonที่เติมการเชื่อมต่อให้โดยอัตโนมัติขณะเริ่มต้น เมานต์ไฟล์เข้าไปในคอนเทนเนอร์แบบนี้:ตัวอย่าง
servers.jsonแบบมินิมัลมีดังนี้:เซิร์ฟเวอร์จะปรากฏขึ้นเมื่อ pgAdmin เริ่มทำงาน โดยไม่ต้องตั้งค่าด้วยตนเอง
สรุป
บทความนี้พาเดินตั้งค่า pgAdmin 4 ใน Docker ตั้งแต่ศูนย์ เขียนไฟล์ Docker Compose ที่เปิดทั้ง PostgreSQL และ pgAdmin 4 พร้อมกัน เชื่อมต่อคอนเทนเนอร์ทั้งสองด้วย DNS ภายในของ Docker และใช้ฟีเจอร์หลักของ pgAdmin ได้แก่ Query Tool ตัวเรียกดูสคีมา และเวิร์กโฟลว์สำรอง/กู้คืน
หลักการสำคัญคือความทำซ้ำได้
ไฟล์
docker-compose.ymlไฟล์servers.jsonและไฟล์.envคือทั้งหมดที่ต้องใช้เพื่อส่งมอบสภาพแวดล้อมฐานข้อมูลที่ตั้งค่าเสร็จให้เพื่อนร่วมทีม สิ่งนี้ช่วยให้ปัญหา “ทำไมของฉันใช้ได้ แต่อีกเครื่องใช้ไม่ได้” ไม่เกิดขึ้นอีกหากอยากเจาะลึก Docker และการทำคอนเทนเนอร์ ลองดูคอร์ส Intermediate Docker ของเรา อัดแน่นด้วยทิปที่เป็นประโยชน์เกี่ยวกับ multi-stage builds เน็ตเวิร์กกิง และเจาะลึก Compose