Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

7. Triển khai MariaDB bằng Docker theo mô hình cách ly database

ICT

Trong kiến trúc Web Server đã xác định ở các bài trước, Docker được sử dụng có chọn lọc, tập trung vào thành phần mang rủi ro cao nhất: MariaDB.
Nginx và PHP-FPM tiếp tục chạy trên host để giữ hệ thống đơn giản, ổn định và dễ vận hành, trong khi database được cách ly theo nhóm site bằng Docker.

Bài viết này trình bày mô hình triển khai MariaDB bằng Docker cho production, áp dụng trực tiếp cho Web Server chạy nhiều website.


1. Nguyên tắc của mô hình cách ly database

Mô hình được xây dựng trên các nguyên tắc sau:

  1. Không “1 database cho tất cả”

  2. Không “1 container cho mỗi site”

  3. Mỗi nhóm site giống nhau → 1 MariaDB container

  4. Mỗi site → 1 database + 1 user riêng

  5. Nginx/PHP-FPM trên host, DB trong Docker

  6. MariaDB chỉ bind localhost, không mở ra Internet

Mô hình này cân bằng tốt giữa:

  • cách ly rủi ro

  • đơn giản vận hành

  • khả năng mở rộng về sau


2. Phân nhóm MariaDB theo nhóm site

Ví dụ cấu trúc thực tế:

Ý nghĩa:

  • sites_web: website giới thiệu, nội dung, tải nhẹ

  • sites_qms: hệ thống nghiệp vụ, dữ liệu quan trọng

  • sites_art: nội dung media, ít giao dịch

Mỗi thư mục = 1 MariaDB instance độc lập.


3. Chuẩn bị cấu trúc thư mục cho một nhóm MariaDB

Ví dụ với sites_art:

/srv/docker/mariadb/art/
├── docker-compose.yml
├── .env
└── data/
 

Đây là cấu trúc tối thiểu nhưng an toàn cho production.


4. Docker Compose mẫu cho MariaDB (sites_qms)

4.1. File .env

MYSQL_ROOT_PASSWORD=STRONG_ROOT_PASSWORD
TZ=Asia/Ho_Chi_Minh

Lưu ý:

  • Không tạo database mặc định trong container

  • Database và user sẽ tạo thủ công cho từng site


4.2. File docker-compose.yml

services:
 mariadb:
   image: mariadb:10.11
   container_name: mariadb_art
   restart: unless-stopped
   ports:
     - "127.0.0.1:3308:3306"
   environment:
     MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
     TZ: ${TZ}
   volumes:
     - ./data:/var/lib/mysql
   command:
     - --character-set-server=utf8mb4
     - --collation-server=utf8mb4_unicode_ci
     - --transaction-isolation=READ-COMMITTED
     - --innodb-file-per-table=1
   healthcheck:
     test: ["CMD", "mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
     interval: 30s
     timeout: 5s
     retries: 5

 

Giải thích nhanh:

  • 127.0.0.1:3308: chỉ cho host truy cập

  • ./data:/var/lib/mysql: dữ liệu an toàn ngoài container

  • READ-COMMITTED: phù hợp Drupal và CMS

  • Không expose ra mạng ngoài


5. Khởi động MariaDB container

 
cd /srv/docker/mariadb/art
docker compose up -d
docker ps

 

Kiểm tra:

docker logs art --tail 50

6. Tạo database và user cho từng site

6.1. Truy cập MariaDB

 
mysql -h 127.0.0.1 -P 3308 -u root -p

6.2. Tạo database và user (ví dụ site qms1)

 
CREATE DATABASE art_shop
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;
 
CREATE USER 'art_user'@'%' IDENTIFIED BY 'STRONG_PASSWORD';
 
GRANT ALL PRIVILEGES ON art_shop.* TO 'art_user'@'%';
 
FLUSH PRIVILEGES;

 

Nguyên tắc:

  • Mỗi site một database

  • Mỗi site một user

  • Không dùng root cho ứng dụng


7. Kết nối từ Drupal (chạy trên host)

Ví dụ settings.php:

$databases['default']['default'] = [
 'database' => 'art_shop',
 'username' => 'art_user',
 'password' => 'STRONG_PASSWORD',
 'host' => '127.0.0.1',
 'port' => '3308',
 'driver' => 'mysql',
 'prefix' => '',
 'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
];

Drupal không cần biết MariaDB đang chạy trong Docker.


8. Lặp lại cho các nhóm site khác

Ví dụ:

  • sites_web → port 3307

  • sites_art → port 3308

  • sites_qms → port 3309

Quy ước rõ ràng:

NhómPort
sites_web3307
sites_art3308
sites_qms3309

9. Khi nào cần tách thêm MariaDB container?

Tách thêm khi:

  • Một nhóm site tăng tải đột biến

  • Backup mất quá nhiều thời gian

  • Cần chính sách replication khác

Ví dụ:

 
sites_qms_1
sites_qms_2

Di chuyển database theo site, không ảnh hưởng các site khác.


10. Những lỗi cần tránh

  • Bind 0.0.0.0:3306

  • Dùng chung user cho nhiều site

  • Chạy nhiều nhóm site trong một DB container

  • Không backup data/ trước khi thay đổi


11. Kết luận

Mô hình Nginx + PHP-FPM trên host, MariaDB Docker theo nhóm site mang lại:

  • Cách ly rủi ro hiệu quả

  • Vận hành đơn giản

  • Dễ backup, dễ mở rộng

  • Phù hợp Web Server production thực tế

Docker ở đây không làm hệ thống phức tạp hơn, mà giảm rủi ro tại đúng điểm cần giảm.