Portainer is the most popular Docker management UI — a web-based interface that lets you manage containers, images, volumes, networks, and stacks on your Hong Kong VPS without needing to SSH in and type Docker commands. For developers who are comfortable with Docker concepts but prefer a visual interface, or for team members who need to manage deployments without deep Docker CLI knowledge, Portainer bridges the gap between command-line power and visual clarity.
Portainer CE vs Business Edition
| Feature | Community Edition (CE) | Business Edition |
|---|---|---|
| Price | Free | Paid (per node) |
| Single VPS management | ✓ | ✓ |
| Docker Swarm management | ✓ | ✓ |
| Kubernetes management | Limited | Full |
| RBAC (role-based access) | Basic | Advanced |
| Audit logging | ✗ | ✓ |
For most VPS users managing a single server or small Docker Swarm, Portainer CE provides everything needed.
Step 1: Install Portainer CE
apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
# Create persistent volume for Portainer data
docker volume create portainer_data
# Deploy Portainer
docker run -d \
--name portainer \
--restart=always \
-p 127.0.0.1:9000:9000 \
-p 127.0.0.1:9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
# Verify it's running
docker ps | grep portainerStep 2: Expose via Nginx with SSL
<code">apt install -y nginx certbot python3-certbot-nginx
cat > /etc/nginx/sites-available/portainer << 'EOF'
server {
listen 80;
server_name docker.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name docker.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/docker.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/docker.yourdomain.com/privkey.pem;
# Restrict to your IP only — Portainer should not be publicly accessible
# allow YOUR_OFFICE_IP;
# deny all;
location / {
proxy_pass https://127.0.0.1:9443;
proxy_ssl_verify off;
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;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
EOF
ln -s /etc/nginx/sites-available/portainer /etc/nginx/sites-enabled/
certbot --nginx -d docker.yourdomain.com
nginx -t && systemctl reload nginxSecurity note: Uncomment the allow and deny directives to restrict Portainer access to your office IP only. Portainer with access to the Docker socket has root-level control over your server — it must never be publicly exposed.
Step 3: Initial Setup
Visit https://docker.yourdomain.com and:
- Create your admin account (username + strong password)
- Select environment: Docker Standalone
- Click Connect
You now see the Portainer dashboard showing all containers, images, volumes, and networks on your VPS.
Step 4: Key Portainer Features
Container Management
Containers → Container List shows all running and stopped containers with status, CPU usage, and memory consumption. From here you can:
- Start, stop, restart, pause containers with one click
- View real-time logs (equivalent to
docker logs -f) - Open a console into the container (equivalent to
docker exec -it) - Inspect container details, environment variables, and mounted volumes
- View container statistics (CPU, memory, network, I/O in real-time graphs)
Stack Deployment (Docker Compose via UI)
Stacks → Add Stack deploys Docker Compose files through the web interface:
- Stack name:
myapp - Paste your
docker-compose.ymlcontent - Set environment variables in the UI
- Click Deploy the stack
Portainer stores the stack definition and allows updating it through the UI — change the image tag, click Update, and Portainer performs a rolling update.
Registry Integration
Registries → Add Registry connects to:
- Docker Hub (public and private repositories)
- GitHub Container Registry (ghcr.io)
- AWS ECR
- Self-hosted registry
Once connected, you can pull images and deploy containers directly from the UI without docker login commands.
Volume and Network Management
View all Docker volumes with their mount paths and sizes. Create new volumes, browse volume contents, and identify unused volumes consuming disk space. Similarly for networks — view all Docker networks, inspect their configurations, and create overlay networks for multi-container communication.
Step 5: Deploy Applications via Portainer
Deploy a Stack (Example: n8n Automation)
Go to Stacks → Add Stack → Name: n8n and paste:
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678"
environment:
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.yourdomain.com/
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:Click Deploy the stack. Portainer starts the containers, and you can see their status, logs, and resource usage immediately in the UI.
Step 6: Portainer Agent for Multiple VPS Nodes
If you manage multiple Hong Kong VPS instances, Portainer supports remote management via the Portainer Agent:
<code"># On each REMOTE VPS (worker nodes): 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
In Portainer CE on your primary VPS: Environments → Add Environment → Docker Standalone → Agent. Enter the remote VPS IP and port 9001. Now you manage all your Hong Kong VPS instances from a single Portainer dashboard.
Step 7: Update Portainer
<code">docker pull portainer/portainer-ce:latest docker stop portainer docker rm portainer docker run -d \ --name portainer \ --restart=always \ -p 127.0.0.1:9000:9000 \ -p 127.0.0.1:9443:9443 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest # Data is preserved in the portainer_data volume
What Portainer Doesn’t Replace
Portainer is excellent for management and monitoring, but some operations are still better via CLI:
- Complex shell scripts and automation pipelines
- CI/CD integration (GitHub Actions pushes images; CLI commands deploy them)
- Debugging low-level container networking issues
- Operations requiring shell pipes and text processing
Use Portainer alongside the CLI rather than as a replacement — it’s most valuable for monitoring running services, viewing logs, and performing routine operations without SSH sessions.
Conclusion
Portainer on a Hong Kong VPS gives your team a clear visual overview of all running Docker services, making container management accessible to non-CLI users and providing at-a-glance health monitoring for everyone. The combination of Portainer for management visibility and GitHub Actions for automated deployments covers the full container operations workflow without requiring constant SSH access.
Manage your containers: Browse Server.HK Hong Kong VPS plans — Portainer runs as a single container alongside your applications, consuming minimal resources.