Spin up 10 OpenStack APIs locally in seconds. Full API fidelity — no cloud account required. Perfect for CI/CD pipelines, local testing, and Terraform development.
docker run --rm \
-p 5000:5000 # Keystone
-p 8774:8774 # Nova
-p 9696:9696 # Neutron
-p 9292:9292 # Glance
-p 9999:9999 # Admin
localostack/localostack:latest
Every service runs in a single process, sharing one asyncio event loop for minimal resource usage.
Identity & auth service. Token issuance, service catalog, users, projects, roles.
Compute service. Server CRUD, flavors, keypairs, state machine, microversions up to 2.47.
Network service. Networks, subnets, ports, security groups, MAC/IP auto-assignment.
Image service. Image metadata CRUD, file upload/download, cirros pre-loaded.
Block storage. Volume & snapshot CRUD, volume types, RFC3339 timestamps.
Resource placement. Providers, inventories, allocations, allocation candidates.
Orchestration. Stack CRUD, HOT template parsing, resource & event listing.
Object storage. Account/container/object CRUD, in-memory binary storage, ETag.
Secret management. Secret CRUD, payload retrieval, secret_ref URL responses.
Load balancing. LoadBalancer → Listener → Pool → Member hierarchy, LBaaS v2.
No OpenStack installation. No configuration files. Just Docker.
Pull and run the container. All 10 services start automatically.
docker run --rm \ -p 5000:5000 -p 8774:8774 -p 9696:9696 \ -p 9292:9292 -p 8776:8776 -p 8778:8778 \ -p 8004:8004 -p 8080:8080 -p 9311:9311 \ -p 9876:9876 -p 9999:9999 \ -e LOCALOSTACK_HOST=0.0.0.0 \ localostack/localostack:latest
Create a clouds.yaml file to use with OpenStack CLI or SDK.
clouds: localostack: auth: auth_url: http://localhost:5000 username: admin password: password project_name: admin user_domain_name: Default project_domain_name: Default region_name: RegionOne interface: public
import openstack conn = openstack.connect( auth_url="http://localhost:5000/v3", project_name="admin", username="admin", password="password", user_domain_name="Default", project_domain_name="Default", ) # List servers for server in conn.compute.servers(): print(server.name, server.status)
provider "openstack" { auth_url = "http://localhost:5000/v3" tenant_name = "admin" user_name = "admin" password = "password" region = "RegionOne" } resource "openstack_compute_instance_v2" "test" { name = "my-instance" flavor_id = "1" image_id = data.openstack_images_image_v2.cirros.id }
Use the OpenStack CLI or any SDK just like you would with a real cloud.
# List flavors openstack --os-cloud localostack flavor list # Create a server openstack --os-cloud localostack server create \ --flavor m1.tiny \ --image cirros-0.6.2 \ my-test-server # Open the admin dashboard open http://localhost:9999
All configuration is done via environment variables. Every setting has a sensible default.
| Variable | Default | Description |
|---|---|---|
| LOCALOSTACK_HOST | 0.0.0.0 | Bind address |
| LOCALOSTACK_KEYSTONE_PORT | 5000 | Keystone Identity |
| LOCALOSTACK_NOVA_PORT | 8774 | Nova Compute |
| LOCALOSTACK_NEUTRON_PORT | 9696 | Neutron Network |
| LOCALOSTACK_GLANCE_PORT | 9292 | Glance Image |
| LOCALOSTACK_CINDER_PORT | 8776 | Cinder Block Storage |
| LOCALOSTACK_PLACEMENT_PORT | 8778 | Placement |
| LOCALOSTACK_HEAT_PORT | 8004 | Heat Orchestration |
| LOCALOSTACK_SWIFT_PORT | 8080 | Swift Object Storage |
| LOCALOSTACK_BARBICAN_PORT | 9311 | Barbican Secrets |
| LOCALOSTACK_OCTAVIA_PORT | 9876 | Octavia Load Balancer |
| LOCALOSTACK_ADMIN_PORT | 9999 | Admin API & Dashboard |
| Variable | Default | Description |
|---|---|---|
| LOCALOSTACK_ADMIN_USERNAME | admin | Admin username |
| LOCALOSTACK_ADMIN_PASSWORD | password | Admin password |
| LOCALOSTACK_ADMIN_PROJECT | admin | Admin project name |
| LOCALOSTACK_REGION | RegionOne | OpenStack region name |
| LOCALOSTACK_ENDPOINT_HOST | localhost | Service catalog hostname |
| Variable | Default | Description |
|---|---|---|
| LOCALOSTACK_PERSISTENCE | memory | "memory" or "sqlite" |
| LOCALOSTACK_DB_PATH | /var/lib/localostack/state.db | SQLite database file path |
| Variable | Default | Description |
|---|---|---|
| LOCALOSTACK_FAULT_RULES | "" | JSON fault rules — or use Admin API |
No special plugins or adapters needed. LocalOStack speaks the same API language as real OpenStack.
Inject errors, delays, and throttling into any service to test how your application handles failures.
# Inject 500 errors on 50% of Nova server requests curl -X POST http://localhost:9999/admin/fault-rules \ -H 'Content-Type: application/json' \ -d '{ "service": "nova", "method": "POST", "path_pattern": "/v2.1/servers", "action": "error", "status_code": 500, "probability": 0.5 }' # Remove all fault rules curl -X DELETE http://localhost:9999/admin/fault-rules