Back to articles
Technology Insight

Tự Host FerretDB Trên Docker: Giải Pháp Chạy Ứng Dụng MongoDB Trên Nền Tảng PostgreSQL Ổn Định Và Miễn Phí

June 3, 2026

Giới Thiệu Về Xu Hướng Thay Thế MongoDB Và Sự Trỗi Dậy Của FerretDB

Trong kỷ nguyên chuyển đổi số, việc lựa chọn một hệ quản trị cơ sở dữ liệu (DBMS) phù hợp đóng vai trò quyết định đến sự thành bại của mọi dự án phần mềm. Nhiều năm qua, MongoDB đã khẳng định vị thế là lựa chọn hàng đầu cho các ứng dụng cần lưu trữ dữ liệu dạng tài liệu (Document-oriented NoSQL). Sự linh hoạt trong schema, khả năng mở rộng tốt và cộng đồng hỗ trợ đông đảo đã giúp MongoDB trở thành một phần không thể thiếu trong stack công nghệ của nhiều doanh nghiệp.

Tuy nhiên, những thay đổi mang tính bước ngoặt về chính sách cấp phép của MongoDB — cụ thể là việc chuyển từ AGPL sang Server Side Public License (SSPL) — đã tạo ra một làn sóng lo ngại sâu sắc trong cộng đồng mã nguồn mở và các doanh nghiệp lớn. SSPL đặt ra nhiều hạn chế khắt khe đối với các nhà cung cấp dịch vụ đám mây và các tổ chức muốn cung cấp MongoDB như một dịch vụ, buộc họ phải chia sẻ toàn bộ mã nguồn của hạ tầng quản lý xung quanh. Điều này không chỉ làm tăng chi phí tuân thủ pháp lý mà còn làm giảm đi tính tự do vốn có của phần mềm mã nguồn mở.

Chính trong bối cảnh thách thức đó, FerretDB đã xuất hiện như một giải pháp cứu cánh hoàn hảo. FerretDB là một giải pháp thay thế mã nguồn mở (open-source alternative) cho MongoDB, được xây dựng dựa trên nguyên lý chuyển đổi các lệnh truy vấn của MongoDB thành SQL và thực thi chúng trực tiếp trên nền tảng PostgreSQL. Bằng cách này, doanh nghiệp có thể giữ nguyên toàn bộ mã nguồn ứng dụng và driver kết nối của MongoDB, nhưng dữ liệu thực tế lại được lưu trữ và vận hành trên một trong những hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) ổn định, tin cậy và chuẩn mực nhất thế giới là PostgreSQL.

Tại Sao Nên Chọn FerretDB Kết Hợp Với PostgreSQL Trên Docker?

Việc kết hợp FerretDB với PostgreSQL mang lại nhiều lợi ích chiến lược mà một doanh nghiệp không thể bỏ qua, đặc biệt khi được triển khai thông qua công nghệ đóng gói container của Docker. Dưới đây là những lý do cốt lõi tạo nên sức hút của giải pháp này:

  • Giữ nguyên mã nguồn ứng dụng (Zero Code Changes): FerretDB hoạt động như một proxy chuyển đổi giao thức (protocol proxy). Ứng dụng của bạn sẽ giao tiếp với FerretDB bằng chính giao thức dây (wire protocol) của MongoDB. Điều này đồng nghĩa với việc các lập trình viên không cần phải viết lại bất kỳ dòng code nào, không cần thay đổi thư viện hay driver hiện tại. Tất cả những gì cần làm chỉ là thay đổi chuỗi kết nối (connection string).
  • Thừa hưởng sự ổn định và tính năng cao cấp của PostgreSQL: PostgreSQL nổi tiếng toàn cầu với tính toàn vẹn dữ liệu cực cao, tuân thủ nghiêm ngặt chuẩn ACID, hỗ trợ backup/restore mạnh mẽ, tính năng replication (sao lưu) và bảo mật nâng cao. Khi dùng FerretDB, dữ liệu NoSQL của bạn thực chất được lưu trữ dưới dạng các trường JSONB trong PostgreSQL, giúp tận dụng tối đa sức mạnh lập chỉ mục (indexing) tối ưu của Postgres.
  • Độc lập hoàn toàn về mặt bản quyền: FerretDB tuân thủ giấy phép Apache 2.0 mã nguồn mở hoàn toàn tự do. Bạn có thể tự host, chỉnh sửa, tích hợp vào các sản phẩm thương mại mà không lo ngại về rủi ro pháp lý hay chi phí bản quyền ẩn như với SSPL của MongoDB.
  • Triển khai nhanh chóng với Docker: Docker giúp chuẩn hóa môi trường, đảm bảo FerretDB và PostgreSQL hoạt động đồng bộ trên mọi hạ tầng từ máy local của lập trình viên cho đến các server production của doanh nghiệp. Việc quản lý, nâng cấp và mở rộng quy mô trở nên dễ dàng hơn bao giờ hết thông qua các file cấu hình trực quan.

Kiến Trúc Hoạt Động Của FerretDB

Để vận hành hiệu quả, chúng ta cần hiểu rõ cách thức hoạt động của giải pháp này. Kiến trúc của hệ thống rất tường minh và có thể mô tả theo mô hình ba lớp tách biệt:

Ứng dụng (MongoDB Driver) → FerretDB Proxy → PostgreSQL Database

Khi ứng dụng của bạn gửi một yêu cầu truy vấn dữ liệu (ví dụ lệnh db.collection.find()), lệnh này sẽ được gửi đến cổng lắng nghe của FerretDB. Tại đây, công cụ phân tích của FerretDB sẽ dịch mã lệnh NoSQL đó thành một câu lệnh SQL tương đương (ví dụ SELECT ... FROM ... WHERE ...) phù hợp với cú pháp của PostgreSQL. PostgreSQL thực thi câu lệnh SQL, trả về kết quả cho FerretDB, và FerretDB lại đóng gói kết quả đó dưới dạng định dạng BSON tiêu chuẩn của MongoDB để trả về cho ứng dụng. Toàn bộ quá trình diễn ra hoàn toàn mượt mà và trong suốt đối với ứng dụng của bạn.

Hướng Dẫn Chi Tiết Cách Triển Khai FerretDB Bằng Docker Compose

Trong phần này, chúng ta sẽ tiến hành xây dựng một môi trường hoàn chỉnh bao gồm một container PostgreSQL làm backend lưu trữ dữ liệu và một container FerretDB đóng vai trò cổng giao tiếp MongoDB API.

Bước 1: Chuẩn bị môi trường hệ thống

Trước khi bắt đầu, hãy đảm bảo rằng máy chủ hoặc máy tính cá nhân của bạn đã được cài đặt sẵn Docker và Docker Compose. Bạn có thể kiểm tra bằng cách chạy các lệnh sau trong terminal:

docker --version
docker compose version

Bước 2: Tạo file cấu hình Docker Compose

Tạo một thư mục mới cho dự án của bạn và tạo một file có tên là docker-compose.yml bên trong thư mục đó. Sao chép nội dung cấu hình tiêu chuẩn dưới đây:

version: '3.8'

services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres_backend
    environment:
      POSTGRES_USER: ferret_user
      POSTGRES_PASSWORD: secret_password_123
      POSTGRES_DB: ferret_db
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: always

  ferretdb:
    image: ghcr.io/ferretdb/ferretdb:latest
    container_name: ferretdb_proxy
    environment:
      FERRETDB_POSTGRESQL_URL: "postgres://ferret_user:secret_password_123@postgres:5432/ferret_db?sslmode=disable"
    ports:
      - "27017:27017"
    restart: always
    depends_on:
      - postgres

volumes:
  pgdata:

Bước 3: Giải thích các thông số cấu hình quan trọng

Trong file cấu hình trên, chúng ta cần lưu ý các điểm mấu chốt sau đây:

  • postgres (Service): Sử dụng phiên bản PostgreSQL 16 chạy trên nền Alpine Linux nhẹ nhàng và tối ưu. Dữ liệu được lưu trữ lâu dài (persistent) thông qua volume pgdata để đảm bảo dữ liệu không bị mất khi container bị khởi động lại hoặc xóa bỏ.
  • ferretdb (Service): Sử dụng image chính thức từ FerretDB. Biến môi trường FERRETDB_POSTGRESQL_URL cực kỳ quan trọng, nó định nghĩa đường dẫn kết nối để FerretDB biết cách đăng nhập và tương tác với container PostgreSQL bên cạnh.
  • Ports Mapping: Container FerretDB map port 27017 ra ngoài máy host. Đây chính là port mặc định kinh điển của MongoDB, giúp các ứng dụng và công cụ quản trị kết nối một cách tự nhiên nhất.

Bước 4: Khởi động hệ thống

Tại thư mục chứa file docker-compose.yml, hãy chạy lệnh sau để tải các image và khởi chạy các dịch vụ ở chế độ chạy ngầm (detached mode):

docker compose up -d

Kiểm tra trạng thái hoạt động của các container để đảm bảo mọi thứ đã sẵn sàng:

docker compose ps

Kiểm Tra Và Kết Nối Đến Hệ Thống FerretDB

Sau khi hệ thống đã vận hành ổn định, bạn có thể kiểm tra tính tương thích bằng các công cụ quản trị phổ biến như Mongosh (MongoDB Shell) hoặc các phần mềm giao diện trực quan như MongoDB Compass.

Để kết nối thông qua MongoDB Shell từ máy host, bạn sử dụng chuỗi kết nối tiêu chuẩn sau:

mongosh "mongodb://127.0.0.1:27017/ferret_db"

Khi đã vào được giao diện dòng lệnh, bạn có thể thực hiện các thao tác thêm, sửa, xóa dữ liệu hoàn toàn giống như đang làm việc với một database MongoDB thực thụ:

// Thêm một document mới
db.users.insertOne({ name: "Nguyen Van A", email: "[email protected]", role: "Manager" })

// Tìm kiếm dữ liệu
db.users.find({ role: "Manager" })

Lúc này, nếu bạn truy cập vào bên trong database PostgreSQL bằng một công cụ quản lý SQL (như pgAdmin hay DBeaver), bạn sẽ thấy một bảng dữ liệu tương ứng được tạo ra một cách tự động, trong đó dữ liệu của tài liệu MongoDB được tổ chức tinh vi trong các cột định dạng nhị phân JSONB của Postgres. Đó chính là sự kỳ diệu của việc chuyển đổi giao thức mà FerretDB mang lại.

Những Lưu Ý Quan Trọng Khi Sử Dụng FerretDB Trong Thực Tế

Mặc dù FerretDB mang lại những lợi ích vô cùng to lớn về mặt chi phí và sự tự do công nghệ, nhưng với tư cách là một kiến trúc sư hệ thống hoặc nhà quản lý kỹ thuật, bạn cần lưu ý một số điểm khác biệt sau để đảm bảo dự án vận hành trơn tru:

  1. Mức độ tương thích tính năng: FerretDB đang phát triển rất nhanh và đã hỗ trợ hầu hết các câu lệnh căn bản (CRUD), các phép toán lập chỉ mục (indexes) và các pipeline aggregation thông dụng. Tuy nhiên, một số tính năng quá nâng cao hoặc đặc thù riêng của các phiên bản MongoDB mới nhất có thể chưa được hỗ trợ đầy đủ. Hãy luôn kiểm tra lộ trình cập nhật tính năng (roadmap) trên trang chủ của FerretDB trước khi chuyển đổi các hệ thống quá phức tạp.
  2. Hiệu năng (Performance Trade-off): Do phải trải qua một lớp dịch mã từ NoSQL sang SQL, hiệu năng của FerretDB có thể có sự chênh lệch nhỏ so với MongoDB thuần túy trong một số kịch bản truy vấn cực kỳ phức tạp hoặc tải cao (high throughput). Tuy nhiên, nhờ vào sức mạnh tối ưu hóa truy vấn huyền thoại của PostgreSQL, đối với phần lớn các ứng dụng doanh nghiệp vừa và nhỏ, sự khác biệt này là không đáng kể và hoàn toàn chấp nhận được.
  3. Chiến lược Backup: Điểm tuyệt vời khi dữ liệu nằm trong PostgreSQL là bạn có thể áp dụng toàn bộ các quy trình backup tiêu chuẩn của SQL như sử dụng lệnh pg_dump hoặc các giải pháp tự động hóa sao lưu định kỳ của Postgres, giúp giảm thiểu rủi ro mất mát dữ liệu và đơn giản hóa công tác quản trị hệ thống của đội ngũ DevOps.

Lời Kết

Việc tự host FerretDB trên Docker kết hợp với backend PostgreSQL là một giải pháp mang tính chiến lược, mở ra hướng đi mới đầy tiềm năng cho các doanh nghiệp mong muốn thoát khỏi sự ràng buộc mang tính thương mại và pháp lý của MongoDB mà không phải đánh đổi bằng chi phí tái cấu trúc mã nguồn khổng lồ. Đây là minh chứng rõ ràng cho sức mạnh của sự sáng tạo trong cộng đồng mã nguồn mở — kết hợp sự linh hoạt của NoSQL với nền tảng vững chắc như bàn thạch của RDBMS truyền thống. Hãy áp dụng giải pháp này ngay hôm nay cho các dự án của bạn để tối ưu hóa chi phí hạ tầng và nâng cao tính tự chủ công nghệ.

Tự Host FerretDB Trên Docker: Giải Pháp Chạy Ứng Dụng MongoDB Trên Nền Tảng PostgreSQL Ổn Định Và Miễn Phí | DPTCloud