Chuyển đến nội dung chính

Chạy MongoDB trong Docker: Hướng dẫn đầy đủ kèm ví dụ

Hướng dẫn này chỉ dẫn bạn chạy MongoDB trong Docker, bao gồm cả triển khai nhanh qua dòng lệnh và cấu hình Docker Compose đầy đủ. Rất phù hợp cho nhà phát triển muốn tự triển khai hoặc thử nghiệm cục bộ mà không cần nhảy ngay lên dịch vụ đám mây.
· 5 phút đọc

Khám phá cùng AI

Vậy là bạn đang muốn tự triển khai MongoDB hoặc thử nghiệm với nó trong môi trường cục bộ? Có một vài cách để bắt đầu nếu bạn không muốn nhảy thẳng vào MongoDB Atlas, trong đó có lựa chọn dùng container với Docker. 

Sử dụng Docker là một lựa chọn vững chắc khi quản lý phiên bản MongoDB của bạn vì thao tác không mất quá một phút và dễ bảo trì hoặc di chuyển giữa các máy chủ.

Trong bài viết này, chúng ta sẽ xem qua một vài cách triển khai MongoDB với Docker và khám phá một số mẹo nhỏ trong quá trình thực hiện. Bạn cũng có thể xem video này để có cái nhìn nhanh về chủ đề.

Yêu cầu tiên quyết

Để theo dõi bài hướng dẫn này, bạn cần có Docker Engine được cài đặt trên máy tính. Có thể là trên macOS, Windows hoặc Linux. Bạn không nhất thiết phải cài Docker Desktop, nhưng tùy hệ điều hành bạn dùng, nó có thể giúp trải nghiệm Docker dễ dàng hơn. 

Ví dụ, tôi đang dùng Docker Engine thông qua Rancher Desktop trên macOS và nó hoạt động tốt.

Để ôn lại kỹ năng Docker, bạn nên xem Docker cho người mới bắt đầu: Hướng dẫn thực hành về Containers để nắm lại các kiến thức cơ bản.

Tải một Docker Image của MongoDB

Trước khi có thể chạy MongoDB trong một container Docker, trước hết bạn cần tải về một image phù hợp với nhu cầu. Từ dòng lệnh, hãy chạy lệnh sau:

docker pull mongodb/mongodb-community-server:latest

Lệnh trên sẽ tải về image chính thức MongoDB Community Edition (CE) với thẻ "latest." 

Lưu ý rằng mongodb/mongodb-community-server và mongodb/mongodb-enterprise-server là các Docker image chính thức do MongoDB duy trì. Tất cả image khác do cộng đồng bên ngoài duy trì và có thể cho kết quả khác hoặc không mong muốn.

Khi đã tải image, chúng ta có thể xem các lựa chọn triển khai.

Chạy MongoDB như một Container độc lập với lệnh Docker Run

Cách nhanh nhất để triển khai MongoDB với Docker là dùng lệnh docker run cùng vài tham số cấu hình. Ví dụ, bạn có thể chạy lệnh sau từ dòng lệnh:

docker run -d -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=nraboy -e MONGO_INITDB_ROOT_PASSWORD=password1234 --name mongodb mongodb/mongodb-community-server:latest

Lệnh trên sẽ lấy image của chúng ta và triển khai nó thành một container tên là "MongoDB." Container sẽ được ánh xạ cổng, nghĩa là máy chủ có thể tương tác với nó qua cổng "27017." Thông tin xác thực root cũng được thiết lập trong ví dụ này, nhưng tùy nhu cầu triển khai, bạn có thể dùng Docker Secrets hoặc cách bảo vệ khác để truyền thông tin nhạy cảm.

Trong ví dụ trên, mọi dữ liệu được lưu bên trong container. Dữ liệu MongoDB, bao gồm cơ sở dữ liệu, collection, và thậm chí cả tài liệu, chỉ tồn tại chừng nào container đó còn tồn tại. Điều này có thể phù hợp cho thử nghiệm, nhưng nhiều khi bạn sẽ muốn dữ liệu MongoDB trong Docker được lưu bền vững đáng tin cậy. Để xử lý việc này, bạn nên tạo một Docker volume bằng lệnh sau:

docker volume create mongodb

Để báo cho container dùng volume đó, bạn có thể thay đổi lệnh triển khai thành như sau:

docker run -d -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=nraboy -e MONGO_INITDB_ROOT_PASSWORD=password1234 -v mongodb:/data/db --name mongodb mongodb/mongodb-community-server:latest

Lần này, hãy để ý rằng chúng ta chỉ định volume sẽ dùng. Khi dùng volume, bạn có thể yên tâm dữ liệu sẽ vẫn tồn tại ngay cả sau khi dừng hoặc cập nhật container.

Khi MongoDB đang chạy bên trong một container Docker, bạn có thể kết nối đến nó bằng chuỗi kết nối mongodb://nraboy:password1234@localhost:27017 từ công cụ bạn ưa thích.

Đưa MongoDB vào stack hoặc dự án của bạn với Docker Compose

Nếu bạn dự định dùng MongoDB với một dự án cụ thể cũng được quản lý bằng Docker, có lẽ hợp lý nhất là quản lý MongoDB bằng cấu hình Docker Compose. Các cấu hình này thường được dùng để cô lập môi trường dự án của bạn, thường gọi là stack.

Tạo một tệp docker-compose.yml đâu đó trên máy tính của bạn với nội dung sau:

services:
    mongodb:
        image: mongodb/mongodb-community-server:latest
        container_name: mongodb
        restart: unless-stopped
        ports:
            - "27017:27017"
        volumes:
            - mongodb:/data/db
        environment:
            MONGO_INITDB_ROOT_USERNAME: nraboy
            MONGO_INITDB_ROOT_PASSWORD: password1234

volumes:
    mongodb:
        external: true

Cấu hình trên sử dụng những thông tin mà chúng ta đã thấy trong lệnh dòng lệnh đơn lẻ. Tương tự phương pháp trước, giả định ở đây là bạn đã tạo sẵn một volume mongodb để Docker quản lý. Một lần nữa, nếu cần làm điều này, hãy chạy lệnh sau:

docker volume create mongodb

Tất nhiên, bạn có thể quản lý các Docker volume theo cách nào phù hợp với mình. Tạo một volume chỉ là một trong số nhiều khả năng.

Khi dòng lệnh của bạn đang ở cùng thư mục làm việc với tệp docker-compose.yml, hãy chạy lệnh sau:

docker compose up -d

Lệnh trên khởi động stack của bạn ở chế độ nền (detached). 

Bạn có thể kiểm tra mọi thứ hoạt động ổn bằng cách thử kết nối tới phiên bản của mình bằng một công cụ như MongoDB Compass, một trong các driver ngôn ngữ như Node.js, hoặc qua MongoDB Shell. 

Nếu làm đúng theo ví dụ, chuỗi kết nối của bạn sẽ là mongodb://nraboy:password1234@localhost:27017, nhưng tùy bạn đã làm theo thế nào, nó có thể khác.

Để dừng phiên bản MongoDB của bạn, hãy chạy lệnh sau từ dòng lệnh khi tệp YAML của bạn ở cùng thư mục làm việc:

docker compose down

Vì chúng ta đang dùng một volume bên ngoài, lần tới khi bạn khởi động container, mọi thứ vẫn sẽ được lưu lại.

Kết luận

Docker giúp làm việc với MongoDB trong môi trường tự triển khai hoặc cục bộ trở nên dễ dàng. Bạn không cần bận tâm đến cấu hình hệ điều hành chung hay trải nghiệm khác nhau giữa các máy tính. Bạn sẽ có trải nghiệm nhất quán mỗi lần. 

Để tiến xa hơn, rất đáng để học cách tạo cơ sở dữ liệu trong MongoDB.

FAQs

Tôi có thể chạy nhiều container MongoDB cùng lúc với Docker không?

Có, bạn có thể chạy nhiều container MongoDB miễn là mỗi container ánh xạ tới một cổng khác nhau hoặc chạy trên các mạng Docker riêng để tránh xung đột.

Làm thế nào để sao lưu dữ liệu của một container MongoDB trong Docker?

Để sao lưu dữ liệu, bạn có thể dùng docker cp để trích xuất tệp từ volume hoặc dùng mongodump bên trong container. Các volume được lưu bền cũng giúp duy trì dữ liệu giữa các phiên.

Có an toàn không nếu lưu mật khẩu MongoDB trong tệp Docker Compose?

Không lý tưởng. Thay vào đó, hãy dùng Docker Secrets hoặc các tệp biến môi trường (.env) được loại trừ khỏi kiểm soát phiên bản để quản lý thông tin xác thực nhạy cảm một cách an toàn.

MongoDB có chạy tốt trong Docker trên Windows không?

Có. MongoDB chạy mượt trong Docker trên Windows, macOS và Linux, đặc biệt khi dùng WSL 2 hoặc Docker Desktop for Windows để đảm bảo khả năng tương thích.

Tôi có thể dùng MongoDB với Docker trong môi trường sản xuất không?

Có, nhưng nên thiết lập mạng, volume lưu trữ, xác thực và sao lưu đúng cách trước khi dùng MongoDB chạy trong Docker ở môi trường sản xuất.

Làm thế nào để kết nối tới MongoDB trong Docker từ một container khác?

Hãy dùng Docker Compose và tham chiếu container MongoDB bằng tên service của nó làm hostname. Cách này cho phép các service giao tiếp với nhau trên cùng một mạng.

Tôi có cần cài MongoDB cục bộ nếu dùng Docker không?

Không. Docker chạy MongoDB trong môi trường container, vì vậy bạn không cần cài MongoDB trực tiếp trên máy chủ của mình.

Tôi có thể dùng MongoDB Compass với phiên bản MongoDB chạy bằng Docker không?

Chắc chắn rồi. Chỉ cần dùng đúng chuỗi kết nối (ví dụ, mongodb://user:pass@localhost:27017) để kết nối từ MongoDB Compass tới container cục bộ của bạn.

Làm thế nào để giám sát hiệu năng của MongoDB trong Docker?

Bạn có thể tích hợp các công cụ như mongostat, mongotop, hoặc các giải pháp giám sát bên ngoài như Prometheus và Grafana để theo dõi hiệu năng bên trong Docker.

Dữ liệu MongoDB của tôi có được lưu bền trong container Docker không?

Miễn là bạn đã ánh xạ thư mục của container tới một volume trên máy chủ, dữ liệu sẽ được lưu bền mà không gặp vấn đề giữa các lần cập nhật và khởi chạy.

Tôi nên dùng Docker hay MongoDB Atlas?

Trong hầu hết trường hợp, dùng MongoDB Atlas sẽ tốt hơn nhờ tính năng sẵn có, chi phí và độ dễ dùng, nhưng MongoDB qua Docker cũng là một lựa chọn hợp lệ.

Tôi có bắt buộc phải dùng Docker Desktop với MongoDB không?

Docker Desktop thường giúp làm việc với Docker dễ dàng hơn, nhưng không bắt buộc. Hầu hết bản phân phối Linux bao gồm Docker Engine, và các giao diện khác như Rancher Desktop cũng hoạt động tốt.

Nic Raboy

Tác giả

Nic Raboy

Nic Raboy là Trưởng bộ phận Quan hệ Nhà phát triển tại MongoDB, nơi anh dẫn dắt một đội ngũ các nhà phát triển Python, Java, C# và PHP tạo ra nội dung xuất sắc giúp các nhà phát triển triển khai MongoDB thành công trong dự án của mình. Anh có kinh nghiệm với Golang và JavaScript, và thường xuyên viết về nhiều hành trình phát triển của bản thân.

Chủ đề

Liên quan