Skip to main content

Overview

The m87 CLI provides seamless Docker integration, allowing you to run any Docker command on remote devices as if you were working locally. This includes full support for Docker Compose for deploying multi-container applications.

Docker Command

Execute Docker commands on remote devices using Docker passthrough.

Syntax

m87 <device> docker <ARGS>...
All standard Docker commands and flags are supported.

Prerequisites

Before using Docker commands:
  1. Docker must be installed on the remote device
  2. The device user must be in the docker group or have root permissions
  3. Docker daemon must be running
To add user to docker group:
m87 <device> exec -it -- sudo usermod -aG docker $USER

Container Management

List and Inspect Containers

# List running containers
m87 rpi docker ps

# List all containers (including stopped)
m87 rpi docker ps -a

# List with custom format
m87 rpi docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

Container Lifecycle

# Run container in detached mode
m87 rpi docker run -d --name nginx -p 80:80 nginx

# Run with environment variables
m87 rpi docker run -d --name app \
  -e NODE_ENV=production \
  -e PORT=3000 \
  -p 3000:3000 \
  myapp:latest

# Run with volume mount
m87 rpi docker run -d --name db \
  -v postgres-data:/var/lib/postgresql/data \
  postgres:15

Bulk Operations

# Stop all running containers
m87 rpi docker ps -q | xargs -r m87 rpi docker stop

# Remove all stopped containers
m87 rpi docker container prune -f

# Kill all running containers
m87 rpi docker ps -q | xargs -r m87 rpi docker kill
Be careful with bulk operations. Always verify which containers will be affected by running m87 <device> docker ps first.

Image Management

# List images
m87 rpi docker images

# Pull image from Docker Hub
m87 rpi docker pull nginx:alpine

# Pull specific version
m87 rpi docker pull postgres:15.3

# Pull from private registry
m87 rpi docker pull myregistry.com/myapp:latest

Docker Compose

Deploy and manage multi-container applications with Docker Compose.

Basic Compose Commands

# Deploy from local directory with docker-compose.yml
cd my-project
m87 rpi docker compose up -d

# Specify compose file location
m87 rpi docker compose --project-directory ./my-app up -d

# Deploy specific services
m87 rpi docker compose up -d web api

Example: Simple Compose Project

Here’s a working example that demonstrates Docker Compose with m87:

docker-compose.yml

services:
  pause:
    image: registry.k8s.io/pause:3.9
    container_name: test-pause
    restart: unless-stopped

  custom:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: test-custom
    init: true
    restart: unless-stopped
    environment:
      - TEST_VAR=hello-from-compose

Deploy Example

cd examples/features/docker-compose/simple
m87 rpi docker compose up -d

Advanced Docker Commands

Network Management

# List networks
m87 rpi docker network ls

# Create network
m87 rpi docker network create mynetwork

# Connect container to network
m87 rpi docker network connect mynetwork myapp

# Inspect network
m87 rpi docker network inspect mynetwork

Volume Management

# List volumes
m87 rpi docker volume ls

# Create volume
m87 rpi docker volume create mydata

# Inspect volume
m87 rpi docker volume inspect mydata

# Remove unused volumes
m87 rpi docker volume prune -f

System Information

# Check Docker version
m87 rpi docker version

# View system info
m87 rpi docker info

# View disk usage
m87 rpi docker system df

# Clean up everything
m87 rpi docker system prune -a --volumes -f

Real-World Workflows

Deploy Web Application

# 1. Sync application code
m87 sync ./myapp rpi:myapp --exclude node_modules

# 2. Build and run containers
m87 rpi docker compose --project-directory ~/myapp up -d --build

# 3. Check status
m87 rpi docker compose --project-directory ~/myapp ps

Database Backup

# Create database backup
m87 rpi docker exec postgres pg_dump -U postgres mydb > backup.sql

# Download backup
m87 cp rpi:backup.sql ./backups/mydb-$(date +%Y%m%d).sql

Development with Hot Reload

# Terminal 1: Watch and sync code
m87 sync ./src rpi:project/src --watch --exclude node_modules

# Terminal 2: Watch application logs
m87 rpi docker compose --project-directory ~/project logs -f web

Container Debugging

# Execute shell in running container
m87 rpi docker exec -it myapp /bin/bash

# View container processes
m87 rpi docker top myapp

# View container resource usage
m87 rpi docker stats myapp

# View container filesystem changes
m87 rpi docker diff myapp

Docker with Port Forwarding

Access containerized services locally:
# 1. Deploy application
m87 rpi docker run -d --name web -p 8080:80 nginx

# 2. Forward port to local machine
m87 rpi forward 8080

# 3. Access at http://localhost:8080

Troubleshooting

Check Docker Status

# Verify Docker is running
m87 rpi exec -- systemctl status docker

# Check Docker daemon logs
m87 rpi exec -- journalctl -u docker -n 50

Permission Issues

# Add user to docker group
m87 rpi exec -it -- sudo usermod -aG docker $USER

# Verify group membership (requires re-login)
m87 rpi exec -- groups

Container Won’t Start

# Check container logs
m87 rpi docker logs myapp

# Inspect container configuration
m87 rpi docker inspect myapp

# Check resource usage
m87 rpi docker stats --no-stream

Performance Tips

Optimize Docker operations:
  • Use .dockerignore to exclude unnecessary files from build context
  • Use multi-stage builds to reduce image size
  • Clean up unused images and containers regularly with docker system prune
  • Use specific image tags instead of latest for reproducibility
  • Mount volumes for persistent data instead of storing in containers