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.sqlhoặc.shtự độ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.confvà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:
-
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. -
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ụcdatacòn trống. -
Cờ
command: Cho phép ghi đè các tham số hệ thống nhưshared_buffers,work_memvà bật logging truy vấn trực tiếp mà không cần sửa filepostgresql.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.dhỗ trợ tự động hóa schema ban đầu. -
Nắm vững
psqlvà 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_catalogvàinformation_schema.
All rights reserved