🐳 Docker & Portainer - Container Management Made Easy [Part 4 of 10]

:spouting_whale: Docker & Portainer - Container Management Made Easy [Part 4 of 10]

Installing Docker and setting up a beautiful web UI for managing containers

:wrench::package::desktop_computer::high_voltage:


You’ve got your server running and storage configured. Now it’s time to install the magic that makes everything easy: Docker.

Docker lets you run applications in isolated containers. No more dependency hell, no more ā€œit works on my machineā€ problems. Each service runs in its own container with everything it needs.

And Portainer? That’s your web-based control panel for managing all those containers without memorizing commands.


:brain: What is Docker?

Docker is a platform for running applications in containers.

Think of containers like:

  • Lightweight virtual machines (but way more efficient)

  • Self-contained packages with everything an app needs

  • Isolated environments that don’t interfere with each other

Example:

  • Want to run a photo app? Pull a container.

  • Need a forum? Pull a container.

  • Want a wiki? Pull a container.

Each runs independently, uses minimal resources, and can be updated/removed without affecting others.


:light_bulb: Why Docker for HomeLab?

:white_check_mark: Pros

  • Easy deployment - One command to install complex applications

  • Isolation - Apps don’t conflict with each other

  • Portability - Move containers between servers easily

  • Updates - Pull new image, restart container, done

  • Rollback - Something breaks? Revert to old version instantly

  • Resource efficient - Much lighter than VMs

  • Huge ecosystem - Thousands of pre-built images available

:cross_mark: Cons

  • Learning curve - New concepts to understand

  • Networking complexity - Can be confusing at first

  • Storage management - Need to understand volumes

:bullseye: Perfect For

  • Web applications

  • Databases

  • Media servers

  • Monitoring tools

  • Pretty much everything we’re building in this series


:desktop_computer: What is Portainer?

Portainer is a web-based GUI for managing Docker.

Instead of typing commands like:


docker run -d --name myapp -p 8080:80 -v /data:/app/data myapp:latest

You click buttons in a web interface. Much easier for beginners (and faster for experts).

Features:

  • Visual container management

  • Template library for common apps

  • Stack deployment (docker-compose via web UI)

  • Resource monitoring

  • Log viewing

  • Network management

  • Volume management

And it’s completely free (Community Edition).


:clipboard: Installing Docker

Step 1: Update System


# Update package lists and upgrade

sudo apt update && sudo apt upgrade -y


Step 2: Remove Old Docker Packages

If you have any old Docker installations, remove them:


# Remove conflicting packages

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do

sudo apt-get remove $pkg

done

This ensures a clean installation.


Step 3: Install Docker’s Official Repository

Add Docker’s GPG key:


sudo apt-get update

sudo apt-get install ca-certificates curl -y

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc

Add Docker repository:


echo \

"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \

$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \

sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Update package index:


sudo apt-get update


Step 4: Install Docker

Install Docker Engine and tools:


sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

This installs:

  • docker-ce - Docker Engine

  • docker-ce-cli - Docker command-line tools

  • containerd.io - Container runtime

  • docker-buildx-plugin - Build tool

  • docker-compose-plugin - Docker Compose (for multi-container apps)


Step 5: Verify Docker Installation


# Check Docker version

docker --version

# Test Docker with hello-world

sudo docker run hello-world

You should see a ā€œHello from Docker!ā€ message. If so, Docker is working!


Step 6: Add Your User to Docker Group

This lets you run Docker without sudo:


# Add your user to docker group (replace 'admin' with your username)

sudo usermod -aG docker admin

# Log out and back in for changes to take effect

# Or run this to apply immediately:

newgrp docker

# Test without sudo

docker run hello-world

Important: Log out and back in (or reboot) for group changes to fully take effect.


Step 7: Enable Docker to Start on Boot


sudo systemctl enable docker.service

sudo systemctl enable containerd.service

Now Docker will start automatically when your server boots.


Step 8: Verify Docker Compose

Docker Compose is included as a plugin:


docker compose version

You should see something like Docker Compose version v2.x.x.


:spouting_whale: Installing Portainer

Now let’s install Portainer to manage Docker via web UI.

Step 1: Create Portainer Data Directory

Create directory on your RAID array:


# Create directory for Portainer data

sudo mkdir -p /mnt/storage/docker/portainer_data

# Set ownership (replace 'admin' with your username)

sudo chown -R admin:admin /mnt/storage/docker


Step 2: Create Portainer Network


# Create a Docker network for Portainer

docker network create portainer-network

This network will be used by Portainer and other services.


Step 3: Deploy Portainer Container

Run Portainer:


docker run -d \

--name portainer \

--restart unless-stopped \

-p 9443:9443 \

-v /var/run/docker.sock:/var/run/docker.sock \

-v /mnt/storage/docker/portainer_data:/data \

--network portainer-network \

portainer/portainer-ce:latest

What this does:

  • -d - Run in background (detached)

  • --name portainer - Name the container

  • --restart unless-stopped - Auto-restart on boot

  • -p 9443:9443 - Expose web UI on port 9443

  • -v /var/run/docker.sock:/var/run/docker.sock - Access to Docker

  • -v /mnt/storage/docker/portainer_data:/data - Persistent data on RAID

  • --network portainer-network - Connect to network

  • portainer/portainer-ce:latest - Use latest Community Edition


Step 4: Configure Firewall for Portainer

On your Ubuntu server (via SSH), allow access to Portainer from your local network:


# Allow Portainer web UI from LAN

# NOTE: Replace 192.168.1.0/24 with YOUR network range

sudo ufw allow from 192.168.1.0/24 to any port 9443 proto tcp comment 'Portainer from LAN'

# Check firewall status

sudo ufw status numbered


Step 5: Access Portainer Web UI

Open your web browser and go to:


https://192.168.1.100:9443

Replace 192.168.1.100 with your server’s IP address.

You’ll see a security warning because Portainer uses a self-signed SSL certificate. This is normal. Click ā€œAdvancedā€ and proceed.


Step 6: Initial Portainer Setup

First-time setup:

  1. Create admin account
  • Username: admin (or your choice)

  • Password: Choose a strong password (12+ characters)

  • Click ā€œCreate userā€

  1. Connect to Docker
  • Select ā€œGet Startedā€

  • Portainer will auto-detect your local Docker environment

  • Click on ā€œlocalā€ to manage your Docker host

You’re in! You should see the Portainer dashboard.


:bullseye: Portainer Quick Tour

Dashboard

  • Shows containers, images, volumes, networks

  • Quick stats on resource usage

Containers

  • View all running/stopped containers

  • Start, stop, restart, remove containers

  • View logs

  • Access container console

  • Inspect container details

Images

  • View downloaded images

  • Pull new images from Docker Hub

  • Remove unused images

Stacks

  • Deploy multi-container applications

  • Use docker-compose files via web UI

  • Manage entire application stacks

Volumes

  • Manage persistent data storage

  • Create, remove, inspect volumes

Networks

  • Manage Docker networks

  • Create custom networks for container communication


:rocket: Deploying Your First Container (Example)

Let’s deploy a simple test container using Portainer:

Via Portainer Web UI:

  1. Go to Containers → Add container

  2. Name: nginx-test

  3. Image: nginx:latest

  4. Port mapping:

  • Host: 8080

  • Container: 80

  1. Click Deploy the container

Access it:


http://192.168.1.100:8080

You should see the nginx welcome page!

Remove it when done:

  • Go to Containers

  • Select nginx-test

  • Click Remove


:wrench: Docker Compose with Portainer

Docker Compose lets you define multi-container applications in a YAML file.

Example: Create a stack in Portainer

  1. Go to Stacks → Add stack

  2. Name: test-stack

  3. Web editor: Paste this example:


version: '3.8'

services:

web:

image: nginx:latest

ports:

- "8080:80"

restart: unless-stopped

  1. Click Deploy the stack

That’s it! The container is running. Much easier than command-line.


:bar_chart: Monitoring with Portainer

View container logs:

  • Go to Containers

  • Click on container name

  • Click Logs

  • See real-time output

View resource usage:

  • Go to Containers

  • Click on container name

  • Click Stats

  • See CPU, memory, network usage

Access container console:

  • Go to Containers

  • Click on container name

  • Click Console

  • Select /bin/bash or /bin/sh

  • Click Connect

  • You’re inside the container!


:shield: Best Practices

Container Data Storage

  • Always use volumes for persistent data

  • Store volumes on RAID array (/mnt/storage/docker/)

  • Never store important data inside containers (it’s lost when container is removed)

Updates

  • Regularly update container images

  • Test updates before deploying to production

  • Keep Portainer itself updated

Security

  • Use strong passwords for Portainer

  • Only allow Portainer access from LAN (not internet)

  • Regularly review running containers

  • Remove unused images and containers

Backups

  • Backup /mnt/storage/docker/ directory

  • Export Portainer stacks as YAML files

  • Document your container configurations


:brain: TL;DR

  • Docker runs applications in isolated containers

  • Portainer provides a web UI for managing Docker

  • Installation: Add Docker repo, install Docker, deploy Portainer container

  • Access: https://your-server-ip:9443

  • Benefits: Easy deployment, isolation, portability, updates

  • Next: We’ll set up Nginx Proxy Manager for reverse proxy and SSL in Part 5


:speech_balloon: Your Turn

What’s the first service you’re planning to run in Docker?

Have you used Docker before, or is this your first time?

Any questions about containers or Portainer?

Drop a comment below!


Navigation: ← Part 3 | Part 5 →