A lightweight, elegant web interface for Docker container management
LightDockerWebUI is a clean, fast, and simple web-based Docker management tool designed for home servers, development environments, and small deployments. No complex setup — just run and manage your containers from any browser.
|
|
|
|
|
|
Dashboard — View and manage all containers
🐳 Docker (Recommended)
# Pull and run using Docker Hub
docker pull ftsiadimos/lightdockerwebui:latest
docker run -d --restart unless-stopped \
-p 8008:8008 \
--name=DockerManager \
-v $(pwd)/instance:/app/instance \
ftsiadimos/lightdockerwebui:latest
# or pull from GitHub Container Registry
# (repository is named "simpledockerwebui" there)
docker pull ghcr.io/ftsiadimos/simpledockerwebui:latest
docker run -d --restart unless-stopped \
-p 8008:8008 \
--name=DockerManager \
-v $(pwd)/instance:/app/instance \
ghcr.io/ftsiadimos/simpledockerwebui:latest📄 Docker Compose
# docker-compose.yml
version: '3.8'
services:
DockerManager:
image: ftsiadimos/lightdockerwebui:latest # or ghcr.io/ftsiadimos/simpledockerwebui:latest
container_name: DockerManager
ports:
- "8008:8008"
volumes:
- ./instance:/app/instance
restart: unless-stoppeddocker-compose up -d🦾 ARM64 Support
# Build for both amd64 and arm64 (requires docker buildx + QEMU enabled)
docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/ftsiadimos/simpledockerwebui:latest --push .
# Run the arm64 image on arm64 host (or with qemu emulation on amd64)
docker run --platform linux/arm64 -d --restart unless-stopped -p 8008:8008 -v $(pwd)/instance:/app/instance ghcr.io/ftsiadimos/simpledockerwebui:latest🐍 From Source (Development)
# Clone repository
git clone https://github.com/ftsiadimos/lightdockerwebui.git
cd lightdockerwebui
# Create virtual environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Run application
flask run --host=0.0.0.0 --port=8008LightDockerWebUI supports multiple Docker servers. Configure them through the web UI:
- Click Config in the navigation bar
- Add servers with a display name and connection details:
- Local: Leave host empty to use
/var/run/docker.sock - Remote: Enter IP/hostname and port (default: 2375 or 2376)
- Local: Leave host empty to use
- Select the active server from the dropdown
- A full interactive server terminal is available via the Terminal menu (under Configuration)
- Container terminals are full PTY shells (using
xterm.js) available from the Containers page; the legacy limited command terminal has been removed
| Variable | Default | Description |
|---|---|---|
| `FLASK_DEBUG` | `0` | Enable debug mode (development only) |
| `SECRET_KEY` | (random) | Flask secret key for sessions |
| `SQLALCHEMY_DATABASE_URI` | `sqlite:///serverinfo.db` | Database connection string |
LightDockerWebUI now exposes a lightweight JSON API for dashboard metrics.
GET /api/statsreturns a JSON object with:servers_countcontainers_countrunning_countimages_counttotal_imagestotal_images_size_gbnetworks_countvolumes_countcompose_stacks_countrecent_activity
# get full metric object
curl -s http://localhost:8008/api/stats | jq .
# get total images
curl -s http://localhost:8008/api/stats | jq '.total_images'
# get total image size in GB
curl -s http://localhost:8008/api/stats | jq -r '.total_images_size_gb'
# single summary line
curl -s http://localhost:8008/api/stats | jq -r '"images=\(.total_images) size=\(.total_images_size_gb)"'If the app is not on localhost:8008, change to your host, e.g.:
curl -s http://docker.myserver:5000/api/stats | jq .printf 'GET /api/stats HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n' | socat - UNIX-CONNECT:/var/run/docker.sock | jq .To manage containers on a remote host, enable TCP on the Docker daemon:
# Create systemd override
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf << EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
EOF
# Reload and restart
sudo systemctl daemon-reload
sudo systemctl restart docker
⚠️ Security Warning: Use TLS (port 2376) for production. Unencrypted connections should only be used on trusted networks.
lightdockerwebui/
├── app/
│ ├── __init__.py # Flask application factory
│ ├── main.py # Routes, WebSocket handlers
│ ├── models.py # SQLAlchemy models (DockerServer)
│ ├── forms.py # WTForms (AddServer, SelectServer)
│ ├── static/ # CSS, JavaScript, images
│ └── templates/ # Jinja2 HTML templates
├── config.py # Flask configuration classes
├── start.py # Application entry point
├── requirements.txt # Python dependencies
├── Dockerfile # Container build file
└── docker-compose.yml # Compose configuration
# Clone and setup
git clone https://github.com/ftsiadimos/lightdockerwebui.git
cd lightdockerwebui
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# Run with hot reload
export FLASK_DEBUG=1
flask run --host=0.0.0.0 --port=8008For production use we recommend running Gunicorn with the threaded worker class and a higher timeout to avoid workers being killed during occasional slow operations. Example command:
# Example Gunicorn command (used in Dockerfile / docker-compose)
/usr/local/bin/gunicorn -b :8008 -k gthread --workers 3 --threads 4 --timeout 120 start:appAlso ensure the Docker Python SDK is available in the environment where the app runs (needed to talk to Docker):
pip install docker- Backend: Flask 3.x, Flask-SQLAlchemy, Flask-Sock
- Frontend: Bootstrap 5.3, DataTables, jQuery
- Database: SQLite (persistent server configuration)
- Container: Docker SDK for Python
Contributions are welcome! Here's how:
- Fork the repository
- Create a feature branch: `git checkout -b feature/awesome-feature`
- Commit changes: `git commit -m 'Add awesome feature'`
- Push to branch: `git push origin feature/awesome-feature`
- Open a Pull Request
This project is licensed under the MIT License — see LICENSE for details.
🐛 Report Bug • 💡 Request Feature • 🐳 Docker Hub
⭐ Star this repo if you find it useful! ⭐
Made with ❤️ by Fotis Tsiadimos

