Getting Started
Go from zero to running containers in under five minutes. This guide covers installation, your first container, multi-service constellations, and migrating from Docker.
Installation #
Quick Install (recommended)
The fastest way to install Volt on any supported Linux distribution:
$ curl -fsSL https://get.armoredgate.com/volt | sudo bash
This script detects your distribution, installs dependencies, and sets up the Volt daemon with sane defaults. It supports:
- Ubuntu 22.04+
- Debian 12+
- Rocky Linux / AlmaLinux 9+
- Fedora 39+
- Arch Linux (btw)
CONFIG_NAMESPACES, CONFIG_CGROUPS, and systemd-nspawn available. Most modern distributions meet these requirements out of the box.Manual Installation
If you prefer to install manually or are on a distribution not listed above:
# Ubuntu / Debian
$ sudo apt install -y systemd-container debootstrap skopeo jq
# Rocky / Fedora
$ sudo dnf install -y systemd-container skopeo jq
$ VOLT_VERSION="0.9.4-beta"
$ curl -Lo /usr/local/bin/volt \
"https://releases.armoredgate.com/volt/v${VOLT_VERSION}/volt-linux-amd64"
$ chmod +x /usr/local/bin/volt
$ sudo volt system init
$ sudo systemctl enable --now voltd
Verify Installation
$ volt version
Volt v0.9.4-beta (build a3f8c21)
Engine: systemd-nspawn 255.4
Runtime: voltainer 2.1.0
$ volt system status
● voltd.service — Volt Container Daemon
Active: active (running) since Mon 2025-01-20 14:23:01 CST
Containers: 0 running, 0 stopped
Networks: 1 (volt0 — bridge)
Storage: /var/lib/volt (42.1 GB available)
volt completion bash > /etc/bash_completion.d/volt. Supports bash, zsh, and fish.Your First Container #
Let's run an nginx web server. Volt pulls OCI images and runs them inside hardened systemd-nspawn machines:
$ volt container run --name my-web -p 8080:80 nginx
Pulling nginx:latest... done (42.3 MB)
Converting to nspawn filesystem... done
Applying security profile: default-hardened
Starting container my-web...
✔ Container my-web is running
Address: 10.42.0.2
Ports: 8080 → 80/tcp
Machine: volt-my-web.nspawn
That's it. Your container is running. Let's verify:
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title>...
$ volt container ls
NAME IMAGE STATUS PORTS UPTIME
my-web nginx:latest running 8080→80/tcp 32s
Essential Container Commands
| Command | Description |
|---|---|
volt container ls |
List all containers |
volt container stop <name> |
Gracefully stop a container |
volt container exec <name> -- bash |
Open a shell inside a container |
volt container logs <name> |
Stream container logs (via journald) |
volt container inspect <name> |
Show detailed container info as JSON |
volt container rm <name> |
Remove a stopped container |
volt group). Run sudo usermod -aG volt $USER to allow non-root usage, then log out and back in.Your First Constellation #
Constellations are Volt's multi-container applications — similar to Docker Compose but with native networking, health-aware scheduling, and declarative state management.
Create a constellation.volt file:
name: my-app
containers:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
depends_on:
- api
api:
image: node:20-slim
command: node server.js
environment:
DATABASE_URL: postgres://db:5432/app
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_DB: app
POSTGRES_PASSWORD: changeme
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Deploy the constellation:
$ volt constellation up
Reading constellation.volt...
Creating network my-app_default (10.42.1.0/24)
Pulling 3 images... done
Starting db.......... ✔ healthy
Starting api......... ✔ healthy
Starting web......... ✔ ready
✔ Constellation my-app is running (3 containers)
web: http://localhost:8080
api: 10.42.1.3:3000 (internal)
db: 10.42.1.2:5432 (internal)
Containers in a constellation automatically get a shared private network with DNS-based service discovery — api can reach db just by hostname.
constellation.volt and run volt constellation up again — Volt will diff the config and only recreate changed containers. Zero-downtime updates by default.Migrating from Docker #
Already have Docker containers or Compose files? Volt's compatibility layer makes migration painless.
Compatibility Mode
Enable the Docker-compatible CLI interface:
$ volt compat docker --enable
Docker compatibility mode enabled.
Symlink created: /usr/local/bin/docker → volt
You can now use 'docker' commands — they'll run through Volt.
With compat mode, your existing scripts and muscle memory work as-is. docker run, docker ps, docker-compose up — all routed through Volt's hardened engine.
Convert Docker Compose Files
Automatically convert a docker-compose.yml to a Volt constellation:
$ volt compat convert docker-compose.yml
Analyzing docker-compose.yml...
✔ 4 services detected
✔ 2 volumes mapped
✔ 1 network converted
⚠ 1 warning: 'privileged: true' on service 'builder' — mapped to capability set
Written: constellation.volt
Review the generated file, then run:
volt constellation up
constellation.volt before deploying. The converter maps Docker concepts to Volt equivalents, but some Docker features (like --privileged) are intentionally restricted. The converter will warn you about these.
Conversion Reference
| Docker Concept | Volt Equivalent | Notes |
|---|---|---|
docker run |
volt container run |
Near-identical flags |
docker-compose.yml |
constellation.volt |
Auto-converted |
Dockerfile |
Voltfile |
Superset of Dockerfile syntax |
docker network |
volt network |
Native systemd-networkd |
docker volume |
volt volume |
Backed by btrfs subvolumes |
--privileged |
Capability sets | Granular — no blanket root |
Next Steps #
You've installed Volt, run a container, deployed a constellation, and learned about Docker migration. Here's where to go next: