Portainer Installation for Docker Management

Portainer is a lightweight, open-source container management user interface enabling visual management of Docker environments. It simplifies container orchestration, image management, network configuration, and volume management through an intuitive web interface. This guide covers Docker installation, Portainer deployment, agent configuration, SSL setup, and stack management.

Table of Contents

Prerequisites

Ensure you have:

  • Ubuntu 20.04 LTS or later
  • Root or sudo access
  • A registered domain name
  • Minimum 2GB RAM (4GB+ recommended)
  • 15GB available disk space
  • Basic Linux administration knowledge

Update system:

sudo apt update && sudo apt upgrade -y

System Requirements

Verify system specifications:

Check OS version:

cat /etc/os-release
uname -m

Check available resources:

free -h
df -h

Docker Installation

Install Docker:

sudo apt install -y docker.io

Add user to docker group:

sudo usermod -aG docker $USER
newgrp docker

Start Docker:

sudo systemctl start docker
sudo systemctl enable docker

Verify installation:

docker --version
docker ps

Portainer Installation

Create Portainer volume:

docker volume create portainer_data

Install Portainer container:

docker run -d \
  --name portainer \
  --restart always \
  -p 9000:9000 \
  -p 8000:8000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Verify Portainer is running:

docker ps | grep portainer
docker logs portainer

Wait for startup (10-15 seconds).

Nginx Configuration

Install Nginx:

sudo apt install -y nginx

Create Nginx configuration:

sudo nano /etc/nginx/sites-available/portainer

Add configuration:

upstream portainer {
    server localhost:9000;
}

server {
    listen 80;
    listen [::]:80;
    server_name portainer.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name portainer.example.com;

    ssl_certificate /etc/letsencrypt/live/portainer.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/portainer.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    client_max_body_size 100M;

    location / {
        proxy_pass http://portainer;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Enable site:

sudo ln -s /etc/nginx/sites-available/portainer /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl start nginx
sudo systemctl enable nginx

SSL Certificate Setup

Install Certbot:

sudo apt install -y certbot python3-certbot-nginx

Obtain SSL certificate:

sudo certbot certonly --standalone -d portainer.example.com

Verify certificate:

sudo openssl x509 -in /etc/letsencrypt/live/portainer.example.com/fullchain.pem -noout -dates

Set up auto-renewal:

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

Initial Configuration

Access Portainer interface:

Navigate to https://portainer.example.com

Complete initial setup:

  1. Create admin account with secure password
  2. Connect to local Docker environment
  3. Configure settings

Configure admin user:

  1. Settings → Users
  2. Create additional admin users if needed
  3. Set role permissions

Agent Installation

Install Portainer Agent on remote Docker hosts:

docker run -d \
  --name portainer_agent \
  --restart always \
  -p 9001:9001 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/docker/volumes:/var/lib/docker/volumes \
  portainer/agent:latest

Add remote environment to Portainer:

  1. Portainer → Endpoints
  2. Click "Add Endpoint"
  3. Select "Docker"
  4. Enter agent hostname/IP:9001
  5. Name the endpoint

Verify connection:

  1. Check endpoint status
  2. Should show "Connected" and Docker version

Container Management

View containers:

  1. Portainer Dashboard → Containers
  2. Lists all running containers

Start/stop containers:

  1. Select container
  2. Click "Start", "Stop", or "Restart"
  3. View logs in real-time

Create new container:

  1. Click "Create Container"
  2. Set container name and image
  3. Configure ports, volumes, environment
  4. Deploy container

Manage images:

  1. Dashboard → Images
  2. Pull new images
  3. Remove unused images
  4. View image details

Stack Deployment

Create Docker Compose stack:

  1. Dashboard → Stacks
  2. Click "Add Stack"
  3. Enter stack name
  4. Paste Docker Compose YAML

Example stack:

version: '3'
services:
  nginx:
    image: nginx:latest
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro

  wordpress:
    image: wordpress:latest
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: password
    ports:
      - "8080:80"
    depends_on:
      - db

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Deploy stack:

  1. Click "Deploy Stack"
  2. Monitor deployment progress
  3. View services and containers

Backup and Updates

Backup Portainer configuration:

docker exec portainer tar czf /data/portainer-backup-$(date +%Y%m%d).tar.gz /data
docker cp portainer:/data/portainer-backup-*.tar.gz /backups/

Schedule backup script:

sudo nano /usr/local/bin/portainer-backup.sh

Add:

#!/bin/bash

BACKUP_DIR="/backups/portainer"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# Backup Portainer data
docker exec portainer tar czf /data/backup.tar.gz /data
docker cp portainer:/data/backup.tar.gz "$BACKUP_DIR/portainer-$DATE.tar.gz"

# Keep only 30 days
find $BACKUP_DIR -type f -mtime +30 -delete

echo "Backup completed: $DATE"

Make executable:

sudo chmod +x /usr/local/bin/portainer-backup.sh

Schedule daily backups:

sudo crontab -e

Add:

0 2 * * * /usr/local/bin/portainer-backup.sh >> /var/log/portainer-backup.log 2>&1

Update Portainer:

docker stop portainer
docker rm portainer
docker run -d \
  --name portainer \
  --restart always \
  -p 9000:9000 \
  -p 8000:8000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Monitor container:

docker logs -f portainer
docker stats portainer

Conclusion

Portainer is now fully installed as a Docker management platform. With Nginx reverse proxy, SSL encryption, and agent support for multiple hosts, you have a comprehensive container management solution. Deploy stacks, manage containers, and monitor your Docker infrastructure through an intuitive interface. Regular backups ensure configuration preservation. Portainer simplifies Docker operations for teams of any size.