Docker Home Lab Setup: 5 Essential Containers with Docker Compose

Docker is the fastest way to self-host applications in a home lab. This guide walks through installing Docker on Ubuntu and deploying a base stack of five essential containers using Docker Compose — no prior Docker experience required.

🎥 Watch the Video Tutorial


💡 Why Docker Compose?

Running containers one at a time with docker run gets messy fast. Docker Compose lets you define your entire stack in a single YAML file. One command brings the whole stack up; one command tears it down. It’s the right way to manage a multi-container home lab from day one.
ℹ️ Note: Environment used in this guide: Proxmox VM running Ubuntu 24.04.3 LTS. The steps work on any Ubuntu or Debian system, bare-metal or VM.

🛠 What You’ll Need

  • Ubuntu 22.04 or 24.04 (VM or bare-metal)
  • SSH access or terminal on the Ubuntu machine
  • Internet connection for pulling images
  • Files from this guide (GitHub)

📋 Step-by-Step Setup

1. Install Docker

The quickest way to install Docker on Ubuntu is the official convenience script:
curl -fsSL https://get.docker.com | sh
Add your user to the docker group so you can run Docker commands without sudo:
sudo usermod -aG docker $USER
newgrp docker

2. Create the Docker Compose file

mkdir ~/homelab-stack && cd ~/homelab-stack
nano docker-compose.yml
Paste in the full compose file from the GitHub repository. Here’s the structure covering all five services:
services:

  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: unless-stopped
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data

  it-tools:
    image: corentinth/it-tools:latest
    container_name: it-tools
    restart: unless-stopped
    ports:
      - "8080:80"

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true

  syncthing:
    image: lscr.io/linuxserver/syncthing:latest
    container_name: syncthing
    restart: unless-stopped
    ports:
      - "8384:8384"
    volumes:
      - syncthing_config:/config
      - ~/sync:/data

  tailscale:
    image: tailscale/tailscale:latest
    container_name: tailscale
    restart: unless-stopped
    network_mode: host
    cap_add:
      - NET_ADMIN
      - NET_RAW
    volumes:
      - tailscale_state:/var/lib/tailscale
    environment:
      - TS_AUTHKEY=your-tailscale-auth-key

volumes:
  portainer_data:
  syncthing_config:
  tailscale_state:

3. Start the stack

docker compose up -d
Check everything is running:
docker compose ps

4. Access your containers

Replace server-ip with your Ubuntu machine’s IP address:
  • Portainer (container management UI) → http://server-ip:9000
  • IT-Tools (browser toolkit) → http://server-ip:8080
  • Syncthing (file sync) → http://server-ip:8384
  • Watchtower runs silently in the background, updating containers on schedule
  • Tailscale — authenticate with: docker exec tailscale tailscale up
⚠️ Warning: Replace your-tailscale-auth-key in the compose file with a real ephemeral auth key from your Tailscale admin console at tailscale.com/admin/settings/keys.
💡 Tip: Store your docker-compose.yml in a private GitHub or Gitea repo. Combined with named volumes, this means you can rebuild your entire stack on a new machine in minutes.

✅ Conclusion

You now have a running Docker stack with five essential home lab containers — all managed by a single Compose file. Add new containers by appending services to the Compose file and running docker compose up -d again. 📺 Watch the full video guide here: https://youtu.be/kE0wreAUPqQ If you found this helpful, like and subscribe to IT HomeLab Online on YouTube for more tutorials. ☕ Support the channel: Patreon · Buy Me a Coffee

Enjoyed this guide?

Subscribe to the channel for more homelab builds, Raspberry Pi projects, and AI automation tutorials.

▶ Watch on YouTube