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:

  1. Install dependencies
  2. Configure settings
  3. Hope it doesn’t conflict with other apps
  4. Struggle to update it later
  5. 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:

1
2
3
4
sudo apt update
sudo apt install docker.io -y
sudo systemctl enable docker
sudo systemctl start docker

Add yourself to the Docker group (so you don’t need sudo every time):

1
sudo usermod -aG docker $USER

Log out and back in for this to take effect.

Verify it works:

1
2
docker --version
docker run hello-world

The 10 Commands You Need

You only need these to manage a home server:

1. Run a Container

1
docker run -d --restart=always --name myapp image:latest
FlagMeaning
-dRun in background (detached)
--restart=alwaysAuto-restart on crash or reboot
--name myappGive it a memorable name
image:latestThe app image to run

2. See Running Containers

1
docker ps

3. See All Containers (Including Stopped)

1
docker ps -a

4. View Logs

1
2
3
docker logs myapp
docker logs myapp --tail 20     # Last 20 lines
docker logs myapp -f            # Follow live

5. Stop a Container

1
docker stop myapp

6. Start a Stopped Container

1
docker start myapp

7. Restart a Container

1
docker restart myapp

8. Remove a Container

1
2
docker stop myapp
docker rm myapp

9. Check Resource Usage

1
docker stats --no-stream

10. Clean Up Unused Data

1
docker system prune -f

That’s it. These 10 commands cover 99% of home server management.


Environment Variables

Many apps need configuration. Docker uses -e flags for this:

1
2
3
4
5
docker run -d --name myapp \
  -e EMAIL=[email protected] \
  -e PASSWORD=secret123 \
  -e API_KEY=abc123 \
  image:latest

Each -e sets a variable inside the container. The app reads these instead of config files.


Ports

Some apps need network ports exposed:

1
2
3
docker run -d --name myapp \
  -p 8080:80 \
  image:latest

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:

1
2
3
docker run -d --name myapp \
  -v /path/on/server:/path/in/container \
  image:latest

For example, Storj stores data on an external drive:

1
-v /mnt/storage/storj:/app/config

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

1
2
3
4
5
6
7
docker run -d --restart=always \
  --name honeygain \
  honeygain/honeygain \
  -tou-accept \
  -email YOUR_EMAIL \
  -pass YOUR_PASSWORD \
  -device mac-mini

EarnFM

1
2
3
4
docker run -d --restart=always \
  --name earnfm-client \
  earnfm/earnfm-client:latest \
  --token YOUR_TOKEN

Traffmonetizer

1
2
3
4
docker run -d --restart=always \
  --name traffmonetizer \
  traffmonetizer/cli_v2 \
  start accept --token YOUR_TOKEN

PacketStream

1
2
3
4
docker run -d --restart=always \
  --name psclient \
  -e CID=YOUR_CID \
  packetstream/psclient:latest

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:

1
2
3
4
5
docker run -d --restart=unless-stopped \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower \
  --cleanup --interval 86400

It checks every 24 hours and updates silently. You never have to manually update.


Troubleshooting

Container keeps restarting

Check the logs:

1
docker logs myapp --tail 50

“Permission denied”

Run with sudo or make sure you’re in the Docker group:

1
groups | grep docker

Container using too much memory

Check usage and restart it:

1
2
docker stats --no-stream
docker restart myapp

Want to start fresh

Remove and recreate:

1
2
docker stop myapp && docker rm myapp
docker run -d ... # Your original command

Docker vs. Installing Directly

AspectDirect InstallDocker
InstallationComplexOne command
ConflictsCommonImpossible
UpdatesManualAutomatic (Watchtower)
RemovalLeaves files behindClean removal
PortabilitySystem-specificWorks anywhere
Learning curveVaries per appSame 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.