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 < devic e > docker < ARG S > ...
All standard Docker commands and flags are supported.
Prerequisites
Before using Docker commands:
Docker must be installed on the remote device
The device user must be in the docker group or have root permissions
Docker daemon must be running
To add user to docker group: m87 < devic e > exec -it -- sudo usermod -aG docker $USER
Container Management
List and Inspect Containers
List Containers
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 Containers
Control Containers
# 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 and Pull Images
Build Images
Manage Images
# 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 Stack
Manage Stack
Update and Rebuild
Stop and Remove
# 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
# 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
Initial Deployment
Update 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
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