Tag Archive pgsql

Byphunsanit

Docker: PostgreSQL Container

การสร้าง Docker container เพื่อ run PostgreSQL ในการใช้ database

  1. สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
    mkdir -p /Users/Shared/Portable/docker-postgresql
  2. ไปที่ folder
    cd /Users/Shared/Portable/docker-postgresql
  3. สร้างไฟล์
    touch docker-compose.yml
  4. ใส่เนื้อหา
    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
  5. ติดตั้งและรัน
    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=# แล้ว ให้รันคำสั่งตามลำดับนี้ครับ:

  1. สร้าง Database ใหม่
    CREATE DATABASE {NEW_POSTGRES_DB};
  2. สร้าง User ใหม่พร้อมรหัสผ่าน
    CREATE USER {NEW_POSTGRES_USER} WITH ENCRYPTED PASSWORD '{NEW_POSTGRES_PASSWORD}';
  3. มอบสิทธิ์ (Grant)
    ใน PostgreSQL สิทธิ์จะแยกเป็นระดับ Database และระดับ Schema (ปกติคือ public)
    1. มอบสิทธิ์การเชื่อมต่อ Database
      GRANT ALL PRIVILEGES ON DATABASE {NEW_POSTGRES_DB} TO {NEW_POSTGRES_USER};
    2. มอบสิทธิ์จัดการ Schema ภายใน DB นั้น
      \c {NEW_POSTGRES_DB}
      GRANT ALL ON SCHEMA public TO {NEW_POSTGRES_USER;

ข้อแตกต่างที่สำคัญระหว่าง Postgres กับ MySQL

หัวข้อMySQL / MariaDBPostgreSQL
User Scopeผูกกับ Host (เช่น 'user'@'%')ไม่ผูกกับ Host (เช็คผ่านไฟล์ pg_hba.conf)
PrivilegesGRANT ALL ON db.* จบในคำสั่งเดียวต้อง Grant ทั้งระดับ Database และ Schema
Case Sensitivityชื่อ DB/Table มักเป็น Case-Insensitive (บน Windows)Case-Sensitive (ถ้าไม่ใส่ฟันหนู " " จะถูกเปลี่ยนเป็นตัวเล็กทั้งหมดอัตโนมัติ)

วิธี “ทางลัด” (Initialization Script)

หากคุณอยากให้มันสร้างหลายๆ DB/User ตั้งแต่ตอน docker-compose up ครั้งแรก (ตอนที่ folder data ยังว่าง)

  1. สร้างไฟล์ชื่อ init.sql
  2. ใส่คำสั่ง CREATE DATABASE... และ CREATE USER... ลงไป
  3. แก้ไขไฟล์ YAML เพิ่ม Volume ตรงส่วนนี้:
volumes:
      - ./data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql  # ไฟล์นี้จะรันเฉพาะครั้งแรกเท่านั้น

อ่านเพิ่มเติม