đź“‹ Table of Contents
Docker has fundamentally changed how developers deploy applications. Instead of wrestling with dependency conflicts and environment inconsistencies, you package everything—code, runtime, libraries—into a portable container that runs anywhere. And when it comes to hosting those containers, Vultr stands out as one of the cheapest VPS with SSD storage, making it a top choice for developers who need performance without blowing their budget.
In this guide, we'll walk through setting up Docker on a Vultr VPS from scratch. By the end, you'll have a fully functional Docker environment ready to deploy production-ready containers.
Why Use Docker on Vultr?
Before we dive into the setup, let's address the obvious question: why run Docker on Vultr instead of managed container services?
Managed platforms like ECS or Cloud Run handle the infrastructure headaches, but they come with significant costs and limited customization. With aVultr Docker setup, you get:
- Full control — Root access, custom networking, kernel parameters
- Cost efficiency — Starting at $2.50/month for a 500GB SSD cloud compute instance
- Predictable billing — No surprise charges based on container runtime
- SSD performance — All Vultr instances use high-speed NVMe SSDs
- Global reach — 25 data center locations for low-latency deployments
Prerequisites
You'll need:
- A Vultr account (usethis affiliate link to support us)
- A Vultr cloud compute instance running Ubuntu 22.04 LTS or 24.04 LTS
- SSH access to your instance
- Basic command-line familiarity
Step 1: Vultr Ubuntu Setup
First things first—let's deploy a fresh Ubuntu server on Vultr. Log into your Vultr dashboard, click "Deploy", and select "Cloud Compute". Choose your preferred location, then select Ubuntu 22.04 LTS x64 orUbuntu 24.04 LTS as the operating system.
For a Docker setup, the $5/month plan (1 vCPU, 1GB RAM, 500GB SSD) is sufficient for learning and small projects. If you're running multiple containers or memory-intensive applications, consider the $10/month plan (1 vCPU, 2GB RAM, 1TB SSD).
Once your instance is deployed, SSH in:
ssh root@your_vultr_server_ip
Update your system packages:
apt update && apt upgrade -y
Step 2: Install Docker on Vultr
Now comes the main event—installing Docker. Vultr's SSD storage means Docker images pull and build faster than on slower storage alternatives.
Install prerequisites and add the Docker repository:
apt install -y ca-certificates curl gnupg lsb-release
# Add Docker's official GPG key
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Set up the repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
Install Docker Engine:
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Verify the installation:
docker --version
docker compose version
You should see Docker version 27.x or newer. Enable and start Docker:
systemctl enable docker
systemctl start docker
Step 3: Your First Container
Let's verify everything works by running a simple NGINX container:
docker run -d --name my-nginx -p 80:80 nginx:alpine
This pulls the minimal NGINX image and runs it in detached mode, mapping port 80. Visit your server's IP address in a browser—you should see the NGINX welcome page.
Check container status:
docker ps
docker logs my-nginx
docker stop my-nginx
docker rm my-nginx
Step 4: Docker Compose for Multi-Container Apps
Single containers are fine for learning, but real applications usually need multiple services—a web app, database, cache, and reverse proxy. Docker Compose simplifies this.
Create a practical example with a Node.js app and Redis:
mkdir -p ~/projects/myapp && cd ~/projects/myapp
cat > docker-compose.yml << 'EOF'
services:
web:
image: node:20-alpine
working_dir: /app
volumes:
- ./app:/app
ports:
- "3000:3000"
command: sh -c "npm install && npm start"
environment:
- REDIS_HOST=redis
- NODE_ENV=production
depends_on:
- redis
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
volumes:
redis-data:
EOF
mkdir -p app && cat > app/package.json << 'EOF'
{
"name": "myapp",
"version": "1.0.0",
"scripts": { "start": "node index.js" },
"dependencies": { "express": "^4.18.0", "redis": "^4.6.0" }
}
EOF
cat > app/index.js << 'EOF'
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({ url: `redis://redis:6379` });
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect();
let visitCount = await client.get('visits') || 0;
visitCount++;
await client.set('visits', visitCount);
app.get('/', (req, res) => {
res.send(`Hello from Docker! Visits: ${visitCount}`);
});
app.listen(3000, () => {
console.log('App running on port 3000');
});
EOF
Launch the stack:
docker compose up -d
docker compose logs -f
Test it:
curl http://localhost:3000
Step 5: Production Best Practices
Running containers locally is one thing. Production requires additional considerations:
Use Non-Root Users
Create a non-root user for running containers:
useradd -m -s /bin/bash deployer
usermod -aG docker deployer
su - deployer
Persistent Storage
Vultr's block storage can attach additional SSD volume for persistent data:
# Create a 10GB block storage
vultr-cli block create --size=10 --region=ewr --datacenter=ewr
# Attach to your instance and mount
mkfs.ext4 /dev/vdb
mkdir -p /mnt/data
mount /dev/vdb /mnt/data
Reverse Proxy with SSL
Use Traefik or NGINX as a reverse proxy with automated SSL via Let's Encrypt:
cat > docker-compose.yml << 'EOF'
services:
traefik:
image: traefik:v3.0
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/traefik.yml:ro
- ./certs:/certs
command:
- "--configFile=/traefik.yml"
whoami:
image: traefik/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`yourdomain.com`)"
- "traefik.http.routers.whoami.tls=true"
EOF
Monitoring
Set up monitoring to track container resource usage:
docker stats
docker compose -f monitoring.yml up -d
Consider deploying Prometheus and Grafana for comprehensive monitoring of your containerized applications.
Conclusion
YourVultr Docker setup is now complete. With Docker running on Vultr's high-speed SSD infrastructure, you have a scalable foundation for deploying any application—from simple static sites to complex microservices architectures.
Key takeaways:
- Start with Ubuntu LTS for stability
- Use Docker Compose for multi-container applications
- Implement proper storage and backup strategies
- Use reverse proxies with SSL for production workloads
If you're serious about deploying containerized applications, Vultr's combination of NVMe SSD storage, predictable pricing, and global data center coverage makes it an excellent choice.Sign up via our affiliate link and get started today.
🚀 Ready to Deploy?
Get started with Vultr's high-performance VPS starting at $2.50/month
Deploy on Vultr →Need more help? Check out our guide to setting up Cloudbet for crypto betting or learn about Vultr Ubuntu setup basics.