Host Multiple Web Panels on One Linux Server Using Docker (with Reverse Proxy Setup)

Overview

Web hosting administrators often face the need to test or run multiple control panels—like Webmin, cPanel, and Plesk—on a single physical or virtual server. Traditionally, these panels conflict over services, ports, and databases, making coexistence nearly impossible.

By leveraging Docker containers, you can safely run multiple web panels isolated from each other, without service conflicts, while preserving full functionality.

This guide is applicable to any modern Linux distribution (Ubuntu, Debian, CentOS, AlmaLinux, Rocky Linux, Fedora).


Benefits


Prerequisites

Verify Docker:

docker --version
docker-compose --version

Step 1: Create Docker Networks for Isolation

docker network create webmin_net
docker network create cpanel_net
docker network create plesk_net

Step 2: Webmin Container Setup

Pull the Webmin Docker image:

docker pull webmin/webmin

Run the container:

docker run -d \
--name webmin-container \
--network webmin_net \
-p 10000:10000 \
-e WEBMIN_USER=admin \
-e WEBMIN_PASS=StrongPassword123! \
--restart unless-stopped \
webmin/webmin

Explanation:

Access Webmin: https://<server-ip>:10000


Step 3: cPanel Container Setup (Unofficial / Test Environment)

Note: cPanel official support for Docker is limited; suitable for test/dev environments only.

Pull a community cPanel image:

docker pull mricon/cpanel

Run the container:

docker run -d \
--name cpanel-container \
--network cpanel_net \
-p 2087:2087 \
-p 2083:2083 \
-e CPANEL_USER=admin \
-e CPANEL_PASS=StrongPassword456! \
--restart unless-stopped \
mricon/cpanel

Access: https://<server-ip>:2087 (WHM)
Access: https://<server-ip>:2083 (cPanel)


Step 4: Plesk Container Setup

Pull Plesk Docker image:

docker pull plesk/plesk

Run the container:

docker run -d \
--name plesk-container \
--network plesk_net \
-p 8443:8443 \
-e [email protected] \
-e PLESK_ADMIN_PASSWORD=StrongPassword789! \
--restart unless-stopped \
plesk/plesk

Access: https://<server-ip>:8443


Step 5: Database Isolation

Each panel may require MySQL/MariaDB. Run separate database containers:

docker run -d \
--name webmin-mysql \
--network webmin_net \
-e MYSQL_ROOT_PASSWORD=WebminDBPass \
-v webmin_db:/var/lib/mysql \
mysql:8.0

Repeat for cPanel and Plesk with separate volumes and networks.

Benefit: No database conflicts between panels.


Step 6: Persistent Storage

Mount host directories for persistent data:

docker run -d \
--name webmin-container \
-v /srv/webmin/config:/etc/webmin \
-v /srv/webmin/data:/var/webmin \
...

Repeat for cPanel and Plesk. This ensures data persists across container restarts.


Step 7: Firewall & Port Management

Open only necessary ports per panel:

# Webmin
sudo firewall-cmd --permanent --add-port=10000/tcp
# cPanel
sudo firewall-cmd --permanent --add-port=2083-2087/tcp
# Plesk
sudo firewall-cmd --permanent --add-port=8443/tcp
sudo firewall-cmd --reload

Step 8: Docker Management Commands

# List all panel containers
docker ps

# View logs
docker logs webmin-container

# Enter container shell
docker exec -it plesk-container bash

# Restart container
docker restart cpanel-container

Step 9: Best Practices


Step 10: Optional – Reverse Proxy for Unified Access

Use Nginx or Traefik to route:

This eliminates the need for separate ports and creates a single entry point.


Conclusion

Running Webmin, cPanel, and Plesk on a single Linux server is now possible using Docker.
This method provides:

It’s a rarely documented, high-value setup for hosting providers, developers, and sysadmins.