![[Completed] Ứng dụng điều khiển Docker container bằng điện thoại](/uploads/1765509584380-image20251212101522964.png)
Overview
Container Control là giải pháp quản lý Docker toàn diện và đa nền tảng, cho phép người dùng giám sát, điều khiển và quản trị máy chủ Docker từ bất kỳ đâu. Hệ thống cung cấp hai phương thức truy cập chính: Giao diện Web (WebUI) và Ứng dụng di động (Mobile App), giúp việc quản lý hạ tầng trở nên linh hoạt và thuận tiện. Được xây dựng trên kiến trúc Microservices hiện đại, Container Control đảm bảo hiệu năng xử lý cao, tính ổn định và khả năng mở rộng dễ dàng trong tương lai. TÍNH NĂNG NỔI BẬT: Giám Sát Thời Gian Thực (Real-time Monitoring): Theo dõi chi tiết mức tiêu thụ tài nguyên như CPU, RAM, Disk, Network của toàn bộ hệ thống và từng container riêng biệt. Cập nhật thông số liên tục mà không cần tải lại trang. Quản Lý Container Chuyên Sâu: Thực hiện các thao tác điều khiển: Khởi động (Start), Dừng (Stop), Khởi động lại (Restart), Buộc dừng (Kill), Xóa (Remove). Xem nhật ký hoạt động (Logs) trực tiếp theo thời gian thực. Truy cập Terminal (Exec): Cho phép gõ lệnh và tương tác trực tiếp với container ngay trên trình duyệt hoặc điện thoại. Quản Lý Docker Images: Tìm kiếm Image trực tiếp từ Docker Hub. Tải về (Pull) các Image mới. Quản lý và xóa các Image không còn sử dụng để giải phóng tài nguyên. Bảo Mật Hệ Thống: Cơ chế xác thực an toàn thông qua Secret Key (Khóa bí mật) được sinh ra ngẫu nhiên mỗi khi khởi động server. Tính năng "Phê duyệt thiết bị" (Device Approval): Cho phép người quản trị kiểm soát danh sách các thiết bị được quyền kết nối, hỗ trợ chặn (Block) hoặc cho phép (Approve) từng thiết bị cụ thể. Hỗ trợ kết nối bảo mật qua HTTPS. CÔNG NGHỆ SỬ DỤNG: Backend (Máy chủ): Sử dụng Node.js với kiến trúc Microservices, bao gồm các dịch vụ thành phần: Gateway (Cổng kết nối), Auth (Xác thực), Containers (Quản lý container), Images, System, Networks. Sử dụng thư viện Dockerode để giao tiếp với Docker Engine và Socket.IO cho các tính năng thời gian thực. Frontend (Web Admin): Xây dựng bằng Next.js (React Framework), sử dụng Tailwind CSS cho giao diện và xterm.js cho tính năng Terminal giả lập. Mobile App: Phát triển bằng Flutter, đảm bảo hiệu năng cao trên nền tảng Android.
Development Process
1. Khởi Nguồn Ý Tưởng (The Origin Story)
Câu chuyện của tôi bắt đầu từ một nhu cầu rất thực tế: Tôi muốn quản lý các container Docker trên server cá nhân (VPS/Home Lab) ngay trên chiếc điện thoại của mình khi đang di chuyển.
Khi tìm kiếm trên thị trường (App Store/Play Store), tôi nhận thấy hầu hết các ứng dụng quản lý Docker từ xa đều hoạt động theo một cơ chế chung: Yêu cầu kết nối trực tiếp thông qua SSH.
Điều này nảy sinh 2 vấn đề lớn khiến tôi không hài lòng:
- Rủi ro bảo mật: Để sử dụng app, tôi buộc phải cung cấp thông tin đăng nhập SSH (Root Password hoặc Private Key) cho một ứng dụng của bên thứ ba. Nếu ứng dụng đó bị hack hoặc code không an toàn, toàn bộ server của tôi sẽ bị lộ.
- Bất tiện khi xác thực: Server của tôi được cấu hình bảo mật cao, chỉ cho phép đăng nhập bằng SSH Key (file .pem / .ppk) và tắt hoàn toàn Password Login. Tuy nhiên, đa số các ứng dụng quản lý Docker trên điện thoại lại hỗ trợ rất kém hoặc không thể import được các file PEM key phức tạp này, khiến tôi không thể kết nối được.
Từ sự bất tiện đó, tôi nảy ra ý tưởng: Tại sao không viết một "Agent" riêng? Một server trung gian chạy ngay trên máy chủ Docker, giao tiếp trực tiếp với Docker Socket nội bộ, và chỉ mở ra một cổng API được bảo vệ bằng một Secret Key đơn giản nhưng mạnh mẽ. Giải pháp này sẽ loại bỏ hoàn toàn việc phải lộ thông tin SSH ra ngoài.
2. Giải Pháp & Kiến Trúc
Thay vì SSH, tôi chọn hướng đi Client-Server Architecture:
- Server (Agent): Chạy bằng Node.js, được đóng gói trong Docker Container. Nó mount trực tiếp
/var/run/docker.sockcủa máy chủ nên có toàn quyền điều khiển Docker mà không cần quyền SSH. - Xác thực: Sử dụng cơ chế Secret Key (Bearer Token).
- Hệ thống tự sinh ra một chuỗi ngẫu nhiên khi khởi động.
- Người dùng chỉ cấp chuỗi này cho Mobile App/WebUI.
- Nếu lộ Key, chỉ cần restart container server là có Key mới.
- Nếu cần chặn ai đó, tôi có thể dùng tính năng "Device Approval" (Phê duyệt thiết bị) để chặn IP.
- Ưu điểm: Không bao giờ lộ Password Root hay SSH Key của hệ điều hành.
3. Hành Trình Phát Triển (Development Journey)
Giai đoạn 1: Prototype (Monolithic)
Ban đầu, tôi viết toàn bộ logic trong một file index.js duy nhất.
- Sử dụng thư viện
dockerodeđể gọi Docker API. - Dựng một HTTP Server đơn giản để nhận lệnh Start/Stop/List Containers.
- Thử nghiệm kết nối thành công từ Postman mà không cần SSH.
Giai đoạn 2: Tách Dịch Vụ (Microservices Lite)
Khi tính năng nhiều lên (Logs, Images, System Info), file code trở nên cồng kềnh. Tôi quyết định chia nhỏ hệ thống thành các module (giả lập Microservices chạy trên các port khác nhau):
- Gateway (Port 3000): Cổng chính, chịu trách nhiệm xác thực và điều hướng.
- Container Service: Chuyên xử lý lệnh start/stop.
- Auth Service: Quản lý device approval và blacklist.
- Kiến trúc này giúp tôi dễ dàng debug từng phần và mở rộng sau này.
Giai đoạn 3: Phát Triển Client (Đa nền tảng)
Sau khi Backend ổn định, tôi xây dựng Frontend:
- Web Dashboard: Tôi chọn Next.js để tận dụng Server-Side Rendering và khả năng tích hợp tốt với Node.js. Tôi thêm tính năng xterm.js để có thể gõ lệnh (Exec) vào container ngay trên trình duyệt - điều mà SSH Client trên điện thoại làm rất khó khăn.
- Mobile App: Sử dụng Flutter để build một lần ra cả iOS và Android. App sử dụng Socket.IO để nhận log realtime, giúp cảm giác điều khiển mượt mà như đang ngồi trước màn hình máy tính.
Giai đoạn 4: Tối Ưu & Docker Hóa
Để cộng đồng có thể sử dụng dễ dàng, tôi tập trung vào việc đóng gói:
- Viết Dockerfile Multi-stage để giảm dung lượng image tải về.
- Hỗ trợ Multi-arch (x86 & ARM64) để ứng dụng có thể chạy trên cả VPS mạnh mẽ lẫn các máy Raspberry Pi nhỏ gọn.
- Tích hợp SSL tự ký để đảm bảo dữ liệu truyền đi (đặc biệt là Secret Key) luôn được mã hóa.
4. Kết Quả
Hiện tại, Container Control đã trở thành một giải pháp khép kín. Tôi có thể cài đặt nó lên bất kỳ server mới nào chỉ bằng 1 lệnh Docker Run. Không cần cấu hình SSH, không cần copy file PEM, chỉ cần copy Secret Key và bắt đầu quản lý ngay lập tức.
How to Use
Hướng Dẫn Sử Dụng Container Control
Chào mừng bạn đến với Container Control! Đây là tài liệu hướng dẫn chi tiết cách cài đặt, khởi chạy và đăng nhập vào hệ thống quản lý Docker của bạn thông qua WebUI và ứng dụng di động.
1. Cài Đặt và Khởi Chạy
Yêu cầu hệ thống
- Docker: Đảm bảo Docker Services đang chạy trên máy tính của bạn.
Chạy bằng Docker (Khuyên dùng)
Đây là cách đơn giản nhất để chạy ứng dụng.
-
Build Image (Chỉ cần làm lần đầu):
# Tại thư mục gốc của dự án docker build -t container-control-server ./server -
Chạy Container:
docker run -p 3000:3000 -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock ryzen30xx/container-control-server:latestLưu ý:
-v /var/run/docker.sock...là bắt buộc để ứng dụng có thể điều khiển Docker của máy chủ.
2. Cách Lấy Secret Key (Khóa Bí Mật)
Hệ thống bảo mật bằng Secret Key. Bạn cần khóa này để đăng nhập.
- Khi server khởi động, hãy nhìn vào màn hình Terminal (cửa sổ dòng lệnh).
- Tìm dòng chữ có biểu tượng chìa khóa 🔑:
(Ví dụ khóa ở trên làGateway: 🔑 SECRET KEY: abcdabcd. Khóa của bạn sẽ khác và thay đổi mỗi khi bạn reset server) - Copy chuỗi ký tự này.
3. Hướng Dẫn Đăng Nhập
A. Đăng nhập trên WebUI (Trình duyệt)
- Mở trình duyệt web (Chrome, Safari, Edge...).
- Truy cập địa chỉ: http://[server_ip]:8080.
- Màn hình đăng nhập sẽ hiện ra. Dán Secret Key bạn vừa copy vào ô trống.
- Nhấn Access Dashboard.
- Nếu thành công, bạn sẽ vào được giao diện quản lý Container.
Lỗi thường gặp: "Invalid Secret Key"
- Kiểm tra lại xem bạn có copy thừa khoảng trắng không.
- Nếu bạn vừa reset server, hãy xóa cache trình duyệt hoặc thử tab ẩn danh để nhập khóa mới.
B. Đăng nhập trên Mobile App (Flutter)
- Mở ứng dụng Container Control trên điện thoại.
- Nhập địa chỉ IP của máy chủ (Server IP):
- Nếu dùng máy ảo (Emulator): Nhập
10.0.2.2. - Nếu dùng điện thoại thật (chung Wifi): Nhập IP LAN của máy tính (ví dụ
192.168.1.5). - Mẹo: Nhìn vào terminal khi server khởi động, nó sẽ liệt kê IP Local của bạn.
- Nếu dùng máy ảo (Emulator): Nhập
- Nhập Port: 3000 (Lưu ý: App kết nối qua cổng API 3000, không phải 8080).
- Nhập Secret Key vào ô tương ứng.
- Nhấn Connect.
4. Các Tính Năng Chính
- Dashboard: Xem tổng quan tài nguyên (CPU, RAM) và số lượng Container/Image.
- Containers:
- Start/Stop/Restart: Nhấn vào menu hành động của từng container.
- Logs: Xem nhật ký hoạt động trực tiếp.
- Terminal (Exec): Truy cập dòng lệnh bên trong container.
- Images: Quản lý, xóa hoặc pull image mới từ Docker Hub.
- Device Management (Quản lý thiết bị):
- Mặc định, tính năng "Phê duyệt thiết bị" (Device Approval) đang TẮT để bạn dễ dàng kết nối lần đầu.
- Bạn có thể bật tính năng này trong phần Settings để kiểm soát ai được phép kết nối vào server.
5. Xử Lý Sự Cố
- Không kết nối được Docker: Đảm bảo Docker Services đang chạy (icon cá voi trên thanh taskbar không bị xám).
- Quên Secret Key: Tắt server và bật lại, key sẽ hiện ra trong terminal. Hoặc xem file
server/.envnếu chưa reset.
Code Snippet
Run with Docker:
docker run -p 3000:3000 -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock ryzen30xx/container-control-server:latestArchitecture

Usecase Diagram

Login & Approval Flow

Usecase Diagram

Login & Approval Flow
