1. Chuẩn bị cấu trúc thư mục và quyền truy cập
Tạo thư mục dữ liệu và cấu hình
Ta cần tạo hai thư mục riêng biệt trên host: một để lưu trữ dữ liệu thực tế của bucket (data) và một để chứa cấu hình MinIO (config). Việc tách biệt giúp việc backup và recovery trở nên linh hoạt hơn, đồng thời đảm bảo dữ liệu không bị mất khi container bị xóa.
Thực hiện lệnh tạo thư mục và gán quyền sở hữu cho user hiện tại (hoặc user sẽ chạy Docker) để tránh lỗi "Permission denied" khi container cố gắng ghi file vào volume.
sudo mkdir -p /opt/minio/data
sudo mkdir -p /opt/minio/config
sudo chown -R $USER:$USER /opt/minio
ls -ld /opt/minio/*
Kết quả mong đợi: Bạn sẽ thấy hai thư mục "data" và "config" nằm trong /opt/minio, với quyền sở hữu là user hiện tại của bạn. Nếu không chown, MinIO sẽ báo lỗi "Permission denied" khi khởi động.
Verify quyền truy cập
Chạy lệnh kiểm tra để đảm bảo user hiện tại có thể đọc/ghi vào thư mục đã tạo.
touch /opt/minio/data/.test_write && rm /opt/minio/data/.test_write && echo "Access OK"
Kết quả mong đợi: Dòng chữ "Access OK" được in ra màn hình, xác nhận user có quyền ghi vào thư mục data.
2. Viết file cấu hình Docker Compose
Cấu trúc file docker-compose.yml
File này sẽ định nghĩa service MinIO, ánh xạ volume từ host vào container, và quan trọng nhất là thiết lập biến môi trường cho tài khoản Root. Chúng ta sẽ sử dụng biến môi trường để quản lý mật khẩu thay vì hardcode trực tiếp vào file yaml để dễ dàng thay đổi sau này hoặc sử dụng file .env riêng.
Tạo file /opt/minio/docker-compose.yml với nội dung hoàn chỉnh như sau. Lưu ý phần environment để thiết lập MINIO_ROOT_USER và MINIO_ROOT_PASSWORD.
cat > /opt/minio/docker-compose.yml
Kết quả mong đợi: File docker-compose.yml được tạo thành công. Biến môi trường đã được thiết lập với user "minioadmin" và password "minioadmin123". Volume /opt/minio/data đã được mount vào /data trong container.
Verify nội dung file
Kiểm tra lại nội dung file vừa tạo để đảm bảo không có lỗi định dạng YAML.
cat /opt/minio/docker-compose.yml
Kết quả mong đợi: Nội dung file hiển thị chính xác như đoạn code trên, không có dấu báo lỗi.
3. Khởi động container và kiểm tra trạng thái
Khởi động MinIO bằng Docker Compose
Sử dụng lệnh docker compose up -d để khởi động service ở chế độ background (detached). Docker sẽ tự động pull image nếu chưa có và tạo container dựa trên cấu hình vừa viết.
Di chuyển vào thư mục chứa file compose và thực thi lệnh. Đảm bảo bạn đang ở đúng đường dẫn /opt/minio.
cd /opt/minio
docker compose up -d
Kết quả mong đợi: Thông báo "Container minio-single-node started" hoặc "Network default created". Nếu có lỗi, Docker sẽ báo rõ nguyên nhân (ví dụ: lỗi port bị chiếm hoặc quyền thư mục).
Kiểm tra trạng thái container
Đảm bảo container đã chạy ổn định và không bị restart liên tục (CrashLoopBackOff). Lệnh này hiển thị trạng thái "Up" với thời gian hoạt động.
docker ps | grep minio
Kết quả mong đợi: Dòng đầu tiên hiển thị tên "minio-single-node", trạng thái "Up" (ví dụ: Up 30 seconds), và cổng mapping "0.0.0.0:9000->9000/tcp, 0.0.0.0:9001->9001/tcp".
Giám sát log khởi động
MinIO cần thời gian để khởi động các dịch vụ nội bộ. Kiểm tra log để xác nhận MinIO đã sẵn sàng nhận kết nối (listening) trên cổng API và Console. Dòng log quan trọng nhất là "API: Listen address..." và "Console: Listen address...".
docker logs minio-single-node --tail 20
Kết quả mong đợi: Bạn sẽ thấy các dòng log màu trắng/xanh ghi nhận việc khởi động thành công, ví dụ: "API: Listen address 'http://0.0.0.0:9000'", "Console: Listen address 'http://0.0.0.0:9001'", và cuối cùng là "Browser Access: http://127.0.0.1:9001" hoặc địa chỉ IP của server.
Verify kết nối cuối cùng
Sử dụng lệnh curl để ping endpoint health của MinIO. Đây là cách chắc chắn nhất để xác nhận dịch vụ đã sẵn sàng xử lý request S3.
curl -s http://localhost:9000/minio/health/live
Kết quả mong đợi: Dòng chữ "OK" được in ra màn hình. Nếu thấy lỗi "Connection refused" hoặc timeout, hãy kiểm tra lại firewall hoặc trạng thái container.
Điều hướng series:
Mục lục: Series: Triển khai Database Object Storage với MinIO và Ubuntu 24.04
« Phần 2: Cài đặt Docker Engine và cấu hình môi trường container
Phần 4: Cấu hình truy cập MinIO qua Console và CLI »