← Quay lại Blog
otherdevopsdockeriot

Triển khai ứng dụng IoT với Docker và Docker Compose

Hướng dẫn triển khai ứng dụng IoT với Docker và Docker Compose trên edge devices — đóng gói, quản lý nhất quán và dễ bảo trì.

Nguyễn Anh Tuấn15 tháng 7, 20254 phút đọc
Triển khai ứng dụng IoT với Docker và Docker Compose

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ị.

Thiết bị IoT và edge device kết nối trong mạng công nghiệp

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

Màn hình code và terminal triển khai container

Bảo mật container IoT

Để 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ế.

Bài viết liên quan

Bài viết liên quan

Docker + K3s trên edge: GitOps cho robot fleet
devopsfleetkubernetes

Docker + K3s trên edge: GitOps cho robot fleet

Hướng dẫn triển khai Docker và K3s trên edge device — quản lý, cập nhật OTA và giám sát hàng trăm robot với GitOps workflow.

10/3/20268 phút đọc
Kubernetes cho Robot Fleet: Orchestration ở quy mô lớn
devopskubernetesfleet

Kubernetes cho Robot Fleet: Orchestration ở quy mô lớn

Kubernetes cho Robot Fleet — sử dụng K3s và GitOps để quản lý, cập nhật và giám sát hàng trăm robot edge device.

1/11/20255 phút đọc
MQTT Protocol: Giao tiếp giữa robot và cloud
iotmqttcommunication

MQTT Protocol: Giao tiếp giữa robot và cloud

MQTT Protocol cho robot và IoT — thiết lập broker, QoS levels, topic design và truyền telemetry từ robot lên cloud.

1/9/20254 phút đọc