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).
Service isolation: Each panel runs in its own container.
Port management: Avoid conflicts on default panel ports.
Test and development environments: Spin up panels for experiments.
Safe migration: Panels can be moved or updated independently.
Modern Linux server (4GB+ RAM recommended)
Root or sudo access
Basic knowledge of Docker and networking
Verify Docker:
docker --version
docker-compose --version
docker network create webmin_net
docker network create cpanel_net
docker network create plesk_net
Isolates containers from each other
Prevents port collisions
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:
-p 10000:10000 → Exposes Webmin on host port 10000
--network webmin_net → Isolated network
--restart unless-stopped → Auto-restart
Access Webmin: https://<server-ip>:10000
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)
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
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.
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.
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
# 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
Never run official production cPanel in Docker (use only Webmin and Plesk for production)
Separate networks and databases for each panel
Use strong passwords and SSL
Backup volumes regularly using Docker volume backup
Use Nginx or Traefik to route:
webmin.example.com → Webmin
cpanel.example.com → cPanel
plesk.example.com → Plesk
This eliminates the need for separate ports and creates a single entry point.
Running Webmin, cPanel, and Plesk on a single Linux server is now possible using Docker.
This method provides:
Complete isolation
Safe testing and migration environment
Port and database separation
Enterprise-level flexibility
It’s a rarely documented, high-value setup for hosting providers, developers, and sysadmins.