ป้ายกำกับ: South Korea

Docker: PostgreSQL ContainerDocker: 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. ใส่เนื้อหา

    SQL

    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=# แล้ว ให้รันคำสั่งตามลำดับนี้ครับ:

    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 ตรงส่วนนี้:

    SQL

    volumes: - ./data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql # ไฟล์นี้จะรันเฉพาะครั้งแรกเท่านั้น
    

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