Every passive income app on my server runs in Docker. Every single one.
There’s a reason for that. Docker makes everything easier — installing, updating, removing, and troubleshooting.
If you’ve never used Docker, this guide is for you.
What is Docker?
Imagine you want to run an app on your server. Normally you’d:
- Install dependencies
- Configure settings
- Hope it doesn’t conflict with other apps
- Struggle to update it later
- Leave behind a mess when you remove it
Docker skips all of that.
Containers in Plain English
A container is a self-contained package with everything an app needs to run — the code, libraries, settings, everything.
Think of it like a shipping container:
- Everything inside is self-contained
- It works the same no matter where you put it
- Containers don’t interfere with each other
- Easy to add, easy to remove
Installing Docker
On Linux Mint / Ubuntu:
| |
Add yourself to the Docker group (so you don’t need sudo every time):
| |
Log out and back in for this to take effect.
Verify it works:
| |
The 10 Commands You Need
You only need these to manage a home server:
1. Run a Container
| |
| Flag | Meaning |
|---|---|
-d | Run in background (detached) |
--restart=always | Auto-restart on crash or reboot |
--name myapp | Give it a memorable name |
image:latest | The app image to run |
2. See Running Containers
| |
3. See All Containers (Including Stopped)
| |
4. View Logs
| |
5. Stop a Container
| |
6. Start a Stopped Container
| |
7. Restart a Container
| |
8. Remove a Container
| |
9. Check Resource Usage
| |
10. Clean Up Unused Data
| |
That’s it. These 10 commands cover 99% of home server management.
Environment Variables
Many apps need configuration. Docker uses -e flags for this:
| |
Each -e sets a variable inside the container. The app reads these instead of config files.
Ports
Some apps need network ports exposed:
| |
This maps port 8080 on your server to port 80 inside the container. Access the app at http://your-server-ip:8080.
Volumes (Persistent Data)
Containers are temporary by default — data is lost when they’re removed. Volumes keep data safe:
| |
For example, Storj stores data on an external drive:
| |
The data lives on your drive, not inside the container.
Real Examples from My Server
Here’s how Docker runs my entire passive income stack:
Honeygain
| |
EarnFM
| |
Traffmonetizer
| |
PacketStream
| |
Each one is a single command. No installation wizards, no dependency hell.
Auto-Updating with Watchtower
Watchtower automatically updates your containers when new versions are released:
| |
It checks every 24 hours and updates silently. You never have to manually update.
Troubleshooting
Container keeps restarting
Check the logs:
| |
“Permission denied”
Run with sudo or make sure you’re in the Docker group:
| |
Container using too much memory
Check usage and restart it:
| |
Want to start fresh
Remove and recreate:
| |
Docker vs. Installing Directly
| Aspect | Direct Install | Docker |
|---|---|---|
| Installation | Complex | One command |
| Conflicts | Common | Impossible |
| Updates | Manual | Automatic (Watchtower) |
| Removal | Leaves files behind | Clean removal |
| Portability | System-specific | Works anywhere |
| Learning curve | Varies per app | Same commands for everything |
What’s Next?
Now that you understand Docker, you can run anything:
- Passive income apps — My complete stack
- Media servers — Plex, Jellyfin
- Home automation — Home Assistant
- Network tools — Pi-hole, AdGuard
- Anything on Docker Hub — Thousands of pre-built images
Start with the home server setup guide if you haven’t set up your server yet.
Docker makes home servers accessible to everyone. If you can copy-paste a command, you can run a server.