Deploying Without Containers -- Is It Actually Possible?
I tried deploying to production without Docker. Here's where serverless and PaaS worked, and where they didn't.
This Experiment Started Because I Hate Writing Dockerfiles
New side project. One Node.js API server, one Next.js frontend. Normally I'd start with a Docker Compose file, but this time I thought "let's try going containerless." Writing Dockerfiles, building images, pushing to registries, configuring orchestration... too much overhead for a side project. (Honestly, the fact that I can never get Docker multi-stage builds right without Googling was also a factor.)
Frontend on Vercel: Done in 3 Minutes
Deploying Next.js to Vercel is genuinely effortless. Connect GitHub repo, click "Deploy," done. Build settings auto-detected. Deployed in 2 minutes 47 seconds. Custom domain was one DNS record away.
I can't help but be impressed. Three years ago I was manually configuring Nginx and renewing SSL certificates. Feels like a different era.
The Backend Was the Problem
Where to put the API server. I narrowed it to three options:
- AWS Lambda + API Gateway (serverless)
- Railway (PaaS)
- Fly.io (advertises container-free deployment)
Tried Lambda first. Converting an existing Express app to Lambda took a day and a half. Used the serverless-http wrapper and most things worked. But WebSockets didn't. I had a real-time notification feature, and Lambda requires a completely separate API Gateway WebSocket API for that. At this point I wondered, "is this actually simpler?"
Cold Starts, That Notorious Beast
Lambda cold starts ranged from 1.3 to 3.8 seconds. This is with the Node.js runtime. Slow first requests directly impact user experience. Provisioned concurrency fixes it, but monthly costs jump significantly. The free tier's appeal vanishes instantly.
Ended up going with Railway. Git push triggers automatic deployment. Buildpacks detect Node.js and deploy automatically. It uses containers internally, but I don't have to write a Dockerfile. Deployed in 1 minute 12 seconds. (Faster than Vercel, actually.)
The Cost Breakdown
Railway's free tier gives you 500 execution hours per month, 512MB memory. Plenty for a side project. Paid tier starts at $5/month. Lambda's free tier covers 1 million requests/month, but API Gateway costs, CloudWatch log costs, and other extras sneak in. First month: $4.37. (I was expecting $0.)
The Vercel + Railway combo runs a side project for $0-$10/month. Whether you use Docker or not, costs are similar, but management overhead dropped dramatically.
So Can You Actually Go Containerless?
Short answer: yes. With conditions. Simple API server, standard frontend, predictable traffic levels. If all three apply, containers are unnecessary.
But at work, containers are still essential. Environment consistency between local and production, complex dependency management, microservice networking -- there are areas where serverless and PaaS alone fall short.
Containerless for side projects, containers at work. This double life will probably continue for a while.