การสร้าง Docker container เพื่อ run PostgreSQL ในการใช้ database
- สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
mkdir -p /Users/Shared/Portable/docker-postgresql - ไปที่ folder
cd /Users/Shared/Portable/docker-postgresql - สร้างไฟล์
touch docker-compose.yml - ใส่เนื้อหา
services: db: container_name: docker-postgresql image: postgres:latest restart: always environment: POSTGRES_DB: LexPb8byzAka POSTGRES_USER: uGFtCu82VpkkE POSTGRES_PASSWORD: ecStstxjfaRS ports: - "5432:5432" volumes: - ./data:/var/lib/postgresql- container_name เช่น docker-postgresql
- POSTGRES_USER: username เช่น uGFtCu82VpkkE
- POSTGRES_PASSWORD: รหัสผ่านคือ เช่น ecStstxjfaRS
- POSTGRES_DB: database ชื่ออะไร เช่น LexPb8byzAka
- ports เช่น 5432
- ติดตั้งและรัน
docker compose up -d
ทดสอบ
ใช้คำสั่งdocker exec -it {container_name} psql -U {POSTGRES_USER} -d {POSTGRES_PASSWORD}
เข่นdocker exec -it docker-postgresql psql -U uGFtCu82VpkkE -d LexPb8byzAka
เข้าไปที่ Bash ของ Container
ก่อนอื่นต้องเข้าไปยังตัว Container เพื่อสั่งงาน PostgreSQL
docker exec -it {container_name} psql -U {POSTGRES_USER} -d {POSTGRES_PASSWORD}
หรือ
docker exec -it docker-postgresql psql -U uGFtCu82VpkkE -d LexPb8byzAka
คำสั่ง SQL สำหรับเพิ่ม Database และ User
เมื่อเข้ามาหน้า postgres=# แล้ว ให้รันคำสั่งตามลำดับนี้ครับ:
- สร้าง Database ใหม่
CREATE DATABASE {NEW_POSTGRES_DB}; - สร้าง User ใหม่พร้อมรหัสผ่าน
CREATE USER {NEW_POSTGRES_USER} WITH ENCRYPTED PASSWORD '{NEW_POSTGRES_PASSWORD}'; - มอบสิทธิ์ (Grant)
ใน PostgreSQL สิทธิ์จะแยกเป็นระดับ Database และระดับ Schema (ปกติคือ public)- มอบสิทธิ์การเชื่อมต่อ Database
GRANT ALL PRIVILEGES ON DATABASE{NEW_POSTGRES_DB}TO{NEW_POSTGRES_USER}; - มอบสิทธิ์จัดการ Schema ภายใน DB นั้น
\c{NEW_POSTGRES_DB}
GRANT ALL ON SCHEMA public TO{NEW_POSTGRES_USER;
- มอบสิทธิ์การเชื่อมต่อ Database
ข้อแตกต่างที่สำคัญระหว่าง Postgres กับ MySQL
| หัวข้อ | MySQL / MariaDB | PostgreSQL |
| User Scope | ผูกกับ Host (เช่น 'user'@'%') | ไม่ผูกกับ Host (เช็คผ่านไฟล์ pg_hba.conf) |
| Privileges | GRANT ALL ON db.* จบในคำสั่งเดียว | ต้อง Grant ทั้งระดับ Database และ Schema |
| Case Sensitivity | ชื่อ DB/Table มักเป็น Case-Insensitive (บน Windows) | Case-Sensitive (ถ้าไม่ใส่ฟันหนู " " จะถูกเปลี่ยนเป็นตัวเล็กทั้งหมดอัตโนมัติ) |
วิธี “ทางลัด” (Initialization Script)
หากคุณอยากให้มันสร้างหลายๆ DB/User ตั้งแต่ตอน docker-compose up ครั้งแรก (ตอนที่ folder data ยังว่าง)
- สร้างไฟล์ชื่อ
init.sql - ใส่คำสั่ง
CREATE DATABASE...และCREATE USER...ลงไป - แก้ไขไฟล์ YAML เพิ่ม Volume ตรงส่วนนี้:
volumes:
- ./data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # ไฟล์นี้จะรันเฉพาะครั้งแรกเท่านั้น
อ่านเพิ่มเติม
