0

PostgreSQL Bài 3: Thiết lập môi trường thực hành chuẩn với Docker, Docker Compose và kết nối qua psql

Để học sâu và thực hành mọi tính năng mà không làm bẩn hệ điều hành host, Docker là công cụ tiêu chuẩn nhất. Bài này sẽ hướng dẫn thiết lập một môi trường PostgreSQL chuẩn production-ready cục bộ, cấu hình mount volume bền vững, tự động chạy script khởi tạo và làm chủ giao diện dòng lệnh psql.

1. Cấu trúc thư mục dự án

Tạo một thư mục làm việc riêng biệt để quản lý cấu hình và dữ liệu:

Bash

mkdir postgres-lab && cd postgres-lab
mkdir -p data init-scripts config

  • data/: Lưu trữ dữ liệu vật lý (tránh mất mát khi container bị xóa).

  • init-scripts/: Chứa các script .sql hoặc .sh tự động chạy trong lần khởi động đầu tiên.

  • config/: Chứa file cấu hình tùy biến như postgresql.conf và pg_hba.conf.

2. Thiết lập Docker Compose chuẩn

Tạo file docker-compose.yml tại thư mục gốc:

YAML

services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres_lab
    restart: unless-stopped
    environment:
      POSTGRES_DB: practical_db
      POSTGRES_USER: dev_admin
      POSTGRES_PASSWORD: secret_password
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - "5432:5432"
    volumes:
      - ./data:/var/lib/postgresql/data
      - ./init-scripts:/docker-entrypoint-initdb.d
    command: >
      postgres
        -c shared_buffers=256MB
        -c work_mem=16MB
        -c log_statement=all
        -c log_duration=on
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U dev_admin -d practical_db"]
      interval: 10s
      timeout: 5s
      retries: 5

  # Web UI trực quan (tùy chọn)
  pgweb:
    image: sosedoff/pgweb:latest
    container_name: pgweb_lab
    restart: unless-stopped
    ports:
      - "8081:8081"
    environment:
      DATABASE_URL: postgres://dev_admin:secret_password@postgres:5432/practical_db?sslmode=disable
    depends_on:
      postgres:
        condition: service_healthy

Các điểm mấu chốt trong file cấu hình:

  1. postgres:16-alpine: Sử dụng bản Alpine nhỏ gọn, tiết kiệm tài nguyên nhưng vẫn đầy đủ tính năng cốt lõi.

  2. init-scripts:/docker-entrypoint-initdb.d: Mọi file .sql đặt trong thư mục này sẽ được PostgreSQL tự động thực thi theo thứ tự bảng chữ cái khi thư mục data còn trống.

  3. Cờ command: Cho phép ghi đè các tham số hệ thống như shared_buffers, work_mem và bật logging truy vấn trực tiếp mà không cần sửa file postgresql.conf.

3. Script khởi tạo ban đầu (Init Script)

Tạo file init-scripts/01-init.sql:

SQL

-- Kích hoạt extension kiểm tra hiệu năng
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

-- Tạo bảng mẫu kiểm thử
CREATE TABLE users (
    id BIGSERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (username, email) VALUES
('hieu_dev', 'hieu@example.com'),
('admin_core', 'admin@example.com');

Khởi chạy container:

Bash

docker compose up -d

Kiểm tra trạng thái container bằng lệnh:

Bash

docker compose ps

Nếu cột STATUS hiển thị Up (healthy), hệ thống đã sẵn sàng kết nối.

4. Kết nối và làm chủ dòng lệnh với psql

Để truy cập trực tiếp vào client bên trong container:

Bash

docker exec -it postgres_lab psql -U dev_admin -d practical_db

Giao diện dòng lệnh sẽ xuất hiện dạng:

Plaintext

practical_db=# 

Bảng phím tắt (Meta-commands) quan trọng nhất trong psql

Các lệnh meta bắt đầu bằng dấu gạch chéo \ và không cần kết thúc bằng dấu chấm phẩy ;.

Lệnh Ý nghĩa Ví dụ áp dụng
\l hoặc \l+ Danh sách cơ sở dữ liệu (+ để xem thêm kích thước, collate) Kiểm tra database hiện có
\c <dbname> Chuyển đổi (connect) sang database khác \c postgres
\dt hoặc \dt+ Liệt kê các bảng trong schema hiện tại Xem các bảng người dùng
\d <tablename> Xem chi tiết cấu trúc bảng, khóa ngoại, index \d users
\dn Liệt kê danh sách các Schema Quản lý schema
\du Xem danh sách các Role / User và quyền hạn Kiểm tra user permissions
\dx Liệt kê các extension đã được cài đặt Xem pg_stat_statements
\timing Bật/tắt hiển thị thời gian thực thi câu lệnh (ms) Đo thời gian chạy query
\x Bật/tắt chế độ hiển thị dạng cột (Expanded display) Dùng khi bảng có quá nhiều cột
\i <path/to/file.sql> Thực thi câu lệnh SQL từ một file ngoài Nạp dữ liệu tự động
\q Thoát khỏi psql Trở lại terminal máy host

5. Thực hành một số thủ thuật psql thực chiến

Bật đo thời gian truy vấn

SQL

practical_db=# \timing
Timing is on.

practical_db=# SELECT * FROM users;
 id |  username  |       email       |          created_at           
----+------------+-------------------+-------------------------------
  1 | hieu_dev   | hieu@example.com  | 2026-10-08 15:49:00+00
  2 | admin_core | admin@example.com | 2026-10-08 15:49:00+00
(2 rows)

Time: 0.812 ms

Chế độ hiển thị dạng dọc (\x)

Khi bảng có hàng chục cột, chế độ mặc định sẽ làm vỡ giao diện terminal. Gõ \x để xem từng record theo chiều dọc:

SQL

practical_db=# \x
Expanded display is on.

practical_db=# SELECT * FROM users WHERE id = 1;
-[ RECORD 1 ]--------------------------
id         | 1
username   | hieu_dev
email      | hieu@example.com
created_at | 2026-10-08 15:49:00+00

6. Tóm tắt & Bài tiếp theo

  • Môi trường thực hành chuẩn được đóng gói bằng Docker Compose với cấu hình volume lưu trữ bền bỉ.

  • Các lệnh trong thư mục docker-entrypoint-initdb.d hỗ trợ tự động hóa schema ban đầu.

  • Nắm vững psql và các meta-commands (\d, \dt, \timing, \x) giúp thao tác và gỡ lỗi nhanh chóng trực tiếp trên terminal server.

Bài 4 xem tiếp: Khởi tạo Database, Schema và cấu trúc Catalog của PostgreSQL — chúng ta sẽ tìm hiểu cách phân tách dữ liệu đa người dùng bằng Schema, tư duy Multi-tenant và cách tra cứu metadata bên trong pg_catalog và information_schema.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí