Đến nội dung chính
Phạm Nam

Tìm kiếm

Nhập từ khoá để tìm trong các bài viết.

Quay lại

Tự host Dockge: quản lý Docker Compose stack bằng web

Dockge giúp tạo, sửa, start, stop và cập nhật Docker Compose stack từ giao diện web, file compose.yaml vẫn trên đĩa và dùng được bằng lệnh docker compose.

10 phút đọc—

Vấn đề: càng nhiều stack, càng khó quản lý bằng SSH

Lúc mới tự host, một hai stack không thành vấn đề: SSH vào máy chủ, sửa compose.yaml, chạy docker compose up -d, xong. Nhưng số stack tăng rất nhanh, và chẳng mấy chốc chúng rải rác khắp /opt/*, mỗi stack một thư mục riêng. Chỉ người từng SSH vào mới nhớ rõ stack nào đang chạy cái gì.

Cách làm thủ công vẫn chạy được, nhưng dễ gõ nhầm tên stack khi đang vội, dễ sửa file mà quên ghi lại mình đã sửa gì, và muốn xem log thì phải nhớ đúng lệnh, đúng thư mục, đúng tên container. Đó là khoảng trống Dockge lấp đầy: gom mọi stack về một chỗ để nhìn trạng thái, sửa file, start, stop và cập nhật image mà không lần mò từng thư mục bằng SSH mỗi lần.

Dockge là gì

Dockge là công cụ tự host, mã nguồn mở theo giấy phép MIT, do Louis Lam phát triển — cũng là tác giả của Uptime Kuma. Nó là trình quản lý stack compose.yaml chạy trên chính máy chủ của bạn, với giao diện phản hồi nhanh theo thời gian thực.

Cụ thể, Dockge cho phép tạo, sửa, start, stop, restart, xóa và cập nhật image cho từng stack từ một giao diện web. Mỗi stack là một thư mục chứa file compose.yaml trên đĩa. Bạn nhập YAML vào trình soạn thảo tương tác trong trình duyệt, bấm deploy, rồi theo dõi tiến trình pull, up, down và output của terminal theo thời gian thực. Dockge còn chuyển được lệnh docker run thành file compose.yaml.

Dockge không phải là gì cũng cần nói rõ. Nó không phải nền tảng PaaS deploy từ git, không tự cấp chứng chỉ HTTPS, không tự backup và rollback như một nền tảng triển khai hoàn chỉnh. Nếu bạn muốn git push là ứng dụng lên production, đó là việc của Coolify — mình đã viết riêng về Coolify trong cùng chủ đề này. Dockge cũng không thay thế hoàn toàn Portainer: Portainer bao quát việc quản trị container nói chung rộng hơn, còn Dockge tập trung sâu vào đúng một việc là quản lý stack compose.yaml.

Theo mình, Dockge hợp với sysadmin, DevOps/SRE, developer và homelabber đã dùng Docker Compose hàng ngày và muốn một bảng điều khiển gọn nhẹ thay vì SSH thủ công cho từng thao tác lặp lại. Nếu bạn chưa dùng Docker Compose, hãy làm quen với Compose trước.

Kiến trúc: một container, file trên đĩa là nguồn sự thật

Toàn bộ Dockge chỉ là một container duy nhất, image louislam/dockge:1, chạy giao diện web trên cổng mặc định 5001. Container này nói chuyện với Docker daemon của máy chủ qua file socket /var/run/docker.sock. Trạng thái tách thành hai phần: các file compose.yaml của từng stack nằm trong thư mục stacks trên đĩa (mặc định /opt/stacks), và dữ liệu riêng của Dockge nằm trong ./data, mount vào /app/data trong container. Không có cơ sở dữ liệu riêng phải migrate, không có định dạng stack độc quyền nào.

Luồng điều khiển rất dễ hình dung: bạn thao tác trên giao diện web, Dockge ghi hoặc cập nhật file compose.yaml tương ứng trên đĩa, rồi gọi Docker daemon qua socket để pull, up hoặc down. Tiến trình và output được đẩy về giao diện theo thời gian thực.

Vì file vẫn là nguồn sự thật duy nhất, bạn có thể tắt Dockge đi và quản lý các stack bằng lệnh docker compose thuần túy bất cứ lúc nào — các file vẫn ở đó, đúng định dạng chuẩn, không cần Dockge để đọc hay chạy chúng.

Từ phiên bản 1.4.0, Dockge có thêm tính năng multi-agent: quản lý stack từ nhiều Docker host trong một giao diện. Phần này mình chưa chạy thử, chỉ đối chiếu tài liệu chính thức của dự án, nên không đi sâu vào chi tiết ở đây.

Về yêu cầu kỹ thuật, Dockge cần Docker 20 trở lên hoặc Podman, chạy trên Ubuntu, Debian và Raspbian từ Bullseye trở lên, CentOS, Fedora và Arch Linux. Debian hoặc Raspbian Buster trở xuống không được hỗ trợ, Windows hiện chưa được hỗ trợ. Kiến trúc phần cứng gồm armv7, arm64 và amd64.

Cài đặt Dockge bằng Docker Compose

Điều kiện tiên quyết và phiên bản tham chiếu

Kiểm tra ba điều trước khi bắt đầu: Docker đã cài và đang chạy, cổng 5001 còn trống, và bạn có quyền tạo thư mục /opt/stacks và /opt/dockge. Bài này tham chiếu image louislam/dockge:1 và bản phát hành 1.5.0 (2025-03-30), đối chiếu ngày 2026-10-27; nhánh chính vẫn có commit mới nhất vào ngày 2026-10-23. Nếu bạn đọc bài này muộn hơn nhiều, hãy kiểm tra lại bản phát hành mới nhất trước khi cài.

Các bước cài đặt

Chạy các lệnh sau trên máy chủ, với quyền đủ để tạo thư mục trong /opt:

mkdir -p /opt/stacks /opt/dockge
cd /opt/dockge
curl https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml
docker compose up -d

Sau đó mở http://localhost:5001 nếu bạn đang ngồi ngay trên máy chủ, hoặc địa chỉ IP của máy chủ với cổng 5001 nếu truy cập từ máy khác trong mạng nội bộ. Lần truy cập đầu tiên, Dockge yêu cầu tạo tài khoản quản trị — hãy tạo ngay (lý do ở phần bảo mật bên dưới).

File compose.yaml chính thức giải thích từng dòng

services:
  dockge:
    image: louislam/dockge:1
    restart: unless-stopped
    ports:
      - 5001:5001
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/app/data
      - /opt/stacks:/opt/stacks
    environment:
      - DOCKGE_STACKS_DIR=/opt/stacks

ports mở giao diện web trên cổng 5001. Mount /var/run/docker.sock là đường dây để Dockge ra lệnh cho Docker daemon của host. ./data:/app/data giữ dữ liệu riêng của Dockge để container khởi động lại không bị mất cấu hình. /opt/stacks:/opt/stacks là nơi các stack sống, và biến DOCKGE_STACKS_DIR=/opt/stacks nói cho Dockge biết thư mục đó nằm ở đâu.

Cạm bẫy bắt buộc phải tránh: đường dẫn stacks phải giống hệt nhau

Đây là lỗi dễ mắc nhất. Dockge chạy trong container nhưng ra lệnh cho Docker daemon của host qua socket, nên mọi đường dẫn nó đưa cho daemon đều được hiểu theo phía host, không phải phía trong container Dockge.

Vì vậy, ba thứ phải giống hệt nhau theo từng ký tự: đường dẫn phía host, đường dẫn phía container, và giá trị của DOCKGE_STACKS_DIR. Ví dụ đúng là /opt/stacks:/opt/stacks cùng với DOCKGE_STACKS_DIR=/opt/stacks, và đường dẫn phải là đường dẫn đầy đủ, không dùng đường dẫn tương đối. Nếu bạn mount kiểu /opt/stacks:/data/stacks nhưng vẫn để DOCKGE_STACKS_DIR=/opt/stacks, Dockge sẽ ghi file ở một nơi trong khi daemon tìm ở nơi khác — stack không xuất hiện, hoặc file rơi vào thư mục không mong muốn, mà không có thông báo lỗi nào rõ ràng chỉ ra nguyên nhân. Sau lần deploy đầu tiên, hãy kiểm tra ngay thư mục /opt/stacks trên host trước khi đưa stack production vào.

Xác minh và cập nhật

Chạy trong thư mục /opt/dockge:

docker compose ps
docker compose logs

Kết quả kỳ vọng: container dockge ở trạng thái running, log không báo lỗi lặp lại về kết nối socket hay quyền thư mục, và giao diện web hiển thị trang quản lý stack. Khi có bản mới, cập nhật bằng quy trình Compose chuẩn:

docker compose pull && docker compose up -d

Lệnh này kéo image mới và khởi động lại container, trong khi các file stack trong /opt/stacks và dữ liệu trong ./data không bị đụng tới. Trước khi cập nhật, sao lưu hai thư mục đó vẫn là thói quen nên giữ khi Dockge đang quản lý stack production.

Dùng Dockge trong thực tế

Sau khi đăng nhập, tạo stack mới từ giao diện: đặt tên stack, nhập nội dung compose.yaml vào trình soạn thảo tương tác, rồi bấm deploy. Dockge ghi file vào thư mục stacks, chạy stack đó và hiển thị tiến trình pull image theo thời gian thực. Nếu file YAML có lỗi cú pháp, bạn sẽ thấy ngay trong output.

Với stack đang chạy, các thao tác hàng ngày đều nằm trong vài cú nhấp: sửa file rồi redeploy, restart một dịch vụ, stop cả stack khi bảo trì, hoặc cập nhật image lên bản mới. Terminal web cho phép theo dõi log và chẩn đoán nhanh mà không cần mở thêm một phiên SSH.

Ưu điểm, nhược điểm và bảo mật

Ưu điểm lớn nhất của Dockge là sự tập trung: làm đúng một việc là quản lý stack compose.yaml qua giao diện web. Kiến trúc chỉ một container, không có tầng trừu tượng độc quyền, nên chi phí vận hành gần như không đáng kể so với chính các stack nó quản lý. File YAML chuẩn trên đĩa có nghĩa bạn không bao giờ bị khóa vào công cụ.

Nhược điểm cũng chính là mặt còn lại của sự tập trung đó. Phạm vi hẹp là lựa chọn thiết kế có chủ ý, nhưng bạn cần chấp nhận nó trước khi dùng. Dockge không phải PaaS, không thay thế Swarm hay Kubernetes, và không bao quát việc quản trị container tổng quát như Portainer. Từ bản 1.5.0, tính năng console bị tắt mặc định; bạn có thể bật lại bằng DOCKGE_ENABLE_CONSOLE=true, nhưng theo mình đừng bật chỉ vì thấy tiện — hãy hiểu rõ rủi ro trước khi làm vậy.

Về bảo mật, đây là phần không được xem nhẹ. Vì Dockge mount Docker socket, bất kỳ ai có quyền quản trị Dockge đều thực chất điều khiển được Docker daemon của host. Hệ quả thực tế: không bao giờ mở cổng 5001 trực tiếp ra Internet; đặt Dockge sau reverse proxy kèm HTTPS, hoặc chỉ dùng trong mạng LAN, hoặc qua VPN; tạo tài khoản quản trị ngay từ lần truy cập đầu tiên; và cân nhắc kỹ trước khi bật lại console. Nếu bạn không thể đảm bảo những điều này, đừng cài Dockge trên máy chủ đó.

Mình không đưa ra con số RAM hay số người dùng tối đa cho Dockge, vì không có nguồn đáng tin nào để trích dẫn cho những con số đó trong phạm vi bài này. Theo kiến trúc — một container duy nhất, trạng thái nằm ở file trên đĩa — Dockge không phải là nút thắt hiệu năng trong hệ thống của bạn; các stack bạn chạy mới là thứ tiêu tốn tài nguyên.

Sao lưu Dockge cũng đơn giản vì trạng thái chỉ nằm ở hai nơi: /opt/stacks và ./data trong /opt/dockge. Để khôi phục, cài lại Dockge, trả lại hai thư mục, chạy docker compose up -d, và các stack sẽ xuất hiện trở lại. Nếu Dockge gặp sự cố nghiêm trọng, bạn luôn có đường lui là chạy trực tiếp docker compose up -d trong từng thư mục stack.

Dockge vs Portainer, Yacht và Coolify

So sánh chỉ có ý nghĩa khi đặt các công cụ trên cùng tiêu chí: mô hình quản lý, mức độ khóa chặt, độ phức tạp vận hành, mô hình bảo mật, và phù hợp với homelab hay doanh nghiệp nhỏ.

Dockge vs Portainer: chúng không hoàn toàn cùng một việc. Dockge tập trung vào stack compose.yaml trên đĩa, với trải nghiệm xoay quanh việc soạn và deploy file YAML. Portainer bao quát việc quản trị container rộng hơn — images, volumes, networks và nhiều đối tượng Docker khác. Nếu nhu cầu chính của bạn là quản lý stack YAML, Dockge gọn và trực tiếp hơn; nếu cần bảng điều khiển tổng quát cho mọi thứ trong Docker, Portainer phù hợp hơn.

Dockge vs Yacht: nguồn so sánh trên selfhosting.sh đánh giá Dockge cao hơn Yacht vì được duy trì tích cực hơn và dùng YAML chuẩn trên đĩa. Mình chỉ dùng đó làm tham chiếu; bạn nên tự kiểm tra tình trạng duy trì của Yacht tại thời điểm đọc.

Dockge vs Coolify: cặp này khác nhau về bản chất. Coolify là PaaS triển khai từ git, kèm HTTPS, backup và rollback tự động — dành cho người muốn git push là xong. Dockge dành cho người muốn giữ quyền kiểm soát trực tiếp file compose.yaml và tự lo phần triển khai.

Khi nào nên chọn giải pháp khác? Cần PaaS git-push thì chọn Coolify. Cần orchestration Swarm hoặc Kubernetes thì Dockge nằm ngoài phạm vi. Cần quản trị container tổng quát thì Portainer phù hợp hơn.

Xử lý lỗi thường gặp

Cổng 5001 đã bị chiếm. Kiểm tra bằng ss -tlnp | grep 5001 hoặc docker ps để xác định dịch vụ nào đang giữ cổng, rồi hoặc dừng dịch vụ đó, hoặc đổi phía host trong file compose thành cổng khác, ví dụ 5002:5001, và truy cập bằng cổng mới. Chỉ đổi phía host; phía container vẫn giữ 5001 vì đó là cổng Dockge lắng nghe bên trong.

Stack không được phát hiện. Đây gần như luôn là lỗi đường dẫn stacks. Kiểm tra lại ba thứ phải giống hệt nhau: đường dẫn host, đường dẫn container và DOCKGE_STACKS_DIR, tất cả đều là đường dẫn đầy đủ. Xác nhận file compose.yaml thực sự nằm trong thư mục stacks trên host. Sửa compose file rồi chạy docker compose up -d lại trong /opt/dockge.

Container thoát bất thường. Chạy docker compose logs trong /opt/dockge và đọc từ đầu: lỗi mount socket thường liên quan tới quyền truy cập /var/run/docker.sock, lỗi thư mục thường liên quan tới quyền ghi /opt/stacks và ./data. Sửa nguyên nhân gốc, rồi khởi động lại — đừng xóa ./data khi chưa sao lưu.

Kết luận

Dockge phù hợp với người đã dùng Docker Compose, đang có nhiều stack và muốn một giao diện web nhẹ để quản lý chúng, với điều kiện là vẫn giữ file YAML chuẩn trên đĩa và không bị khóa vào công cụ. Nếu đó là bạn, Dockge là lựa chọn đúng trọng tâm, ít rủi ro, và dễ gỡ bỏ nếu sau này đổi ý.

Dockge không phù hợp với người cần một PaaS git-push hoàn chỉnh — hãy sang Coolify; người cần orchestration Swarm hoặc Kubernetes — hãy tìm công cụ orchestration; và người cần quản trị container tổng quát kiểu Portainer — hãy dùng Portainer hoặc công cụ tương đương.

Bước tiếp theo rất cụ thể: cài Dockge theo hướng dẫn trên, tạo một stack thử nghiệm không quan trọng trước, kiểm tra thư mục /opt/stacks để xác nhận đường dẫn đúng, sao lưu /opt/stacks và ./data, rồi mới đưa stack production vào. Trước hết, hãy đảm bảo cổng 5001 không mở trực tiếp ra Internet.

Tài liệu tham khảo


Bài viết liên quan

  • 15 phút đọc—

    Tự host NetBird: mesh VPN WireGuard cho homelab

    Hướng dẫn tự host NetBird bằng Docker Compose trên VPS: mesh VPN WireGuard peer-to-peer, quản lý truy cập theo nhóm, không mở port từng dịch vụ ra Internet.

  • 10 phút đọc—

    Tự host Coolify: PaaS mã nguồn mở trên VPS riêng

    Hướng dẫn tự host Coolify trên VPS: cài đặt, deploy app đầu tiên bằng git push, HTTPS tự động, backup, rollback và các giới hạn cần biết trước khi dùng.

Bình luận

Bình luận được duyệt trước khi hiển thị.

Đang tải bình luận…

Để lại bình luận