Tại sao Docker cho IoT?
Trong các dự án IoT truyền thống, việc cài đặt phần mềm trên hàng trăm thiết bị edge là cơn ác mộng — mỗi device có thể có phiên bản OS, thư viện và cấu hình khác nhau. Docker giải quyết vấn đề này bằng cách đóng gói toàn bộ ứng dụng cùng dependencies vào container, đảm bảo chạy giống nhau trên mọi thiết bị.
Kiến trúc IoT với Docker
Một hệ thống IoT điển hình bao gồm nhiều service chạy trên edge device:
┌─────────────────────────────────┐
│ Edge Device (ARM64) │
│ ┌───────────┐ ┌──────────────┐ │
│ │ MQTT │ │ Data │ │
│ │ Broker │ │ Collector │ │
│ └───────────┘ └──────────────┘ │
│ ┌───────────┐ ┌──────────────┐ │
│ │ InfluxDB │ │ Grafana │ │
│ │ (TimeSer) │ │ (Dashboard) │ │
│ └───────────┘ └──────────────┘ │
└─────────────────────────────────┘
Docker Compose cho Multi-Service IoT
File docker-compose.yml quản lý toàn bộ stack:
version: "3.8"
services:
mosquitto:
image: eclipse-mosquitto:2.0
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- mosquitto_data:/mosquitto/data
restart: unless-stopped
collector:
build: ./collector
environment:
- MQTT_HOST=mosquitto
- INFLUX_HOST=influxdb
- INFLUX_TOKEN=${INFLUX_TOKEN}
depends_on:
- mosquitto
- influxdb
restart: unless-stopped
influxdb:
image: influxdb:2.7-alpine
volumes:
- influx_data:/var/lib/influxdb2
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=admin
- DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUX_PASSWORD}
- DOCKER_INFLUXDB_INIT_ORG=iot
- DOCKER_INFLUXDB_INIT_BUCKET=sensors
restart: unless-stopped
grafana:
image: grafana/grafana:10.2-alpine
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
restart: unless-stopped
volumes:
mosquitto_data:
influx_data:
grafana_data:
Tối ưu Docker cho Edge Devices
1. Multi-stage Build giảm kích thước image
# Build stage
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
# Runtime stage
FROM python:3.11-slim
COPY --from=builder /install /usr/local
COPY . /app
WORKDIR /app
CMD ["python", "collector.py"]
Image giảm từ ~900MB xuống còn ~150MB — rất quan trọng khi deploy qua mạng 4G.
2. Multi-arch Build cho ARM64
Nhiều edge device (Raspberry Pi, NVIDIA Jetson) chạy ARM64:
# Tạo builder hỗ trợ multi-arch
docker buildx create --name iotbuilder --use
# Build cho cả AMD64 và ARM64
docker buildx build --platform linux/amd64,linux/arm64 \
-t myregistry/collector:v1.2 --push .
3. Resource Limits
Edge devices có RAM hạn chế, luôn đặt giới hạn:
services:
collector:
deploy:
resources:
limits:
memory: 256M
cpus: "0.5"
CI/CD cho IoT Fleet
Workflow triển khai tự động
# 1. Push code lên GitHub
git push origin main
# 2. GitHub Actions build và push image
# 3. Trên mỗi device, Watchtower tự động cập nhật
Sử dụng Watchtower để tự động pull image mới:
services:
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_POLL_INTERVAL=300
- WATCHTOWER_CLEANUP=true
restart: unless-stopped
Bảo mật container IoT
- Không chạy container với quyền root: dùng
user: "1000:1000"trong compose - Read-only filesystem:
read_only: truecho container không cần ghi - Giới hạn capabilities:
security_opt: [no-new-privileges:true] - Secrets management: dùng Docker secrets hoặc file
.envvớichmod 600
Để quản lý fleet IoT ở quy mô lớn hơn, xem bài viết về Kubernetes cho Robot Fleet với K3s và GitOps workflow.
Monitoring và Logging
Trên edge device, log rotation rất quan trọng để tránh đầy ổ đĩa:
services:
collector:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Docker và Docker Compose giúp bạn quản lý ứng dụng IoT một cách chuyên nghiệp — từ development đến production, từ một device đến hàng trăm device. Kết hợp với CI/CD và auto-update, bạn có thể triển khai và bảo trì fleet IoT hiệu quả mà không cần SSH vào từng thiết bị. Giao tiếp giữa các container IoT thường sử dụng MQTT protocol — giao thức nhẹ và phù hợp cho thiết bị tài nguyên hạn chế.