Overview
Docker is one of the quickest ways to run Joget for development, testing, demos, and repeatable local environments. This guide starts with a simple MySQL setup, then adds a practical advanced example using Joget Enterprise, MariaDB, custom ports, SSL-related mounts, health checks, memory limits, and persistent volumes.
Official references used for this guide:
- Docker Engine install docs: https://docs.docker.com/engine/install/
- Joget Community image: https://hub.docker.com/r/jogetworkflow/joget-community
- Joget Enterprise image: https://hub.docker.com/r/jogetworkflow/joget-enterprise
- Joget download/get-started page: https://www.joget.org/download/
How It Works
- Docker runs MySQL or MariaDB in one container.
- Joget runs in another container.
- Joget connects to MySQL using container networking.
- Docker volumes preserve the database and Joget wflow files.
- Port 8080 exposes Joget in the browser.
Where to Use in Joget
This is an installation and DevOps topic. Use it when preparing a local developer environment, test server, demo machine, or repeatable sandbox.
Full Code
Create a .env file:
MYSQL_ROOT_PASSWORD=change-this-root-password
MYSQL_DATABASE=jwdb
MYSQL_USER=joget
MYSQL_PASSWORD=change-this-joget-password
Create docker-compose.yml:
services:
jogetdb:
image: mysql:8.0
container_name: jogetdb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- jogetdb_data:/var/lib/mysql
joget:
image: jogetworkflow/joget-community
container_name: joget
restart: unless-stopped
depends_on:
- jogetdb
ports:
- "8080:8080"
environment:
MYSQL_HOST: jogetdb
MYSQL_PORT: 3306
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- joget_wflow:/opt/joget/wflow
volumes:
jogetdb_data:
joget_wflow:
Start Joget:
docker compose up -d
Open Joget:
http://localhost:8080/jw
Check logs:
docker compose logs -f joget
Stop the environment:
docker compose down
Advanced Example: Joget Enterprise on Custom Ports
For a more practical server-style setup, you may want Joget Enterprise running on HTTPS port 8443, MariaDB running on a custom internal port like 3309, persistent volumes, custom Tomcat configuration, and a database health check before Joget starts.
Create a .env file:
JOGET_IMAGE_TAG=your-joget-version
MYSQL_ROOT_PASSWORD=change-this-root-password
MYSQL_DATABASE=jwdb
MYSQL_USER=joget
MYSQL_PASSWORD=change-this-joget-password
JOGET_XMS=14G
JOGET_XMX=14G
Create an advanced docker-compose.yml:
version: "2.4"
services:
joget:
container_name: jogetapp
image: jogetworkflow/joget-enterprise:${JOGET_IMAGE_TAG}
restart: unless-stopped
environment:
- MYSQL_HOST=jogetdb
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_PORT=3309
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- CATALINA_OPTS=-Xms${JOGET_XMS} -Xmx${JOGET_XMX}
volumes:
- jogetdata:/opt/joget/wflow
- ./server.xml:/opt/joget/apache-tomcat/conf/server.xml:ro
- ./tomcat.sh:/opt/joget/tomcat.sh:ro
- ./joget-keystore.keystore:/opt/joget/joget-keystore.keystore:ro
- ./host.conf:/etc/host.conf:ro
- ./web.xml:/opt/joget/apache-tomcat/webapps/jw/WEB-INF/web.xml:ro
networks:
- joget-backend
ports:
- "8443:8443"
depends_on:
jogetdb:
condition: service_healthy
mem_limit: 17g
jogetdb:
container_name: jogetdb
image: mariadb:10.11
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
ports:
- "3309:3309"
command: --port=3309
volumes:
- mysqldata:/var/lib/mysql
- ./my.cnf:/etc/mysql/conf.d/my.cnf:ro
networks:
- joget-backend
healthcheck:
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-P", "3309"]
start_period: 30s
timeout: 20s
retries: 10
volumes:
jogetdata:
mysqldata:
networks:
joget-backend:
Run it:
docker compose up -d
Open Joget:
https://localhost:8443/jw
In this example, the MariaDB container listens internally on 3309, so Joget also uses MYSQL_PORT=3309. The host port mapping "3309:3309" is useful when you need to connect from a database client on the host machine. If only Joget needs database access, you can remove that ports block and keep the database private inside the Docker network.
For production-like setups, avoid latest, pin a tested Joget image tag, use strong secrets, keep mounted config files under source control only when they do not contain secrets, and confirm your Enterprise licensing requirements.
Example Use Cases
- Local Joget development environment.
- Demo instance for testing apps before importing to a server.
- Temporary sandbox for plugin testing.
- Repeatable onboarding setup for new developers.
Customization Tips
- Use jogetworkflow/joget-enterprise when you have Enterprise licensing and need Enterprise features.
- Check Docker Hub for available image tags before pinning a production version.
- Keep database passwords in .env or your deployment secret manager.
- Back up both the database volume and the Joget wflow volume.
- Use read-only mounts (
:ro) for config files that the container should not modify. - Expose the database port only when host tools need to connect to it.
- For production, review networking, TLS, database backup, monitoring, and license requirements properly.
Key Benefits
- Fast setup compared to manual installation.
- Easy reset and rebuild for development.
- Persistent volumes protect local data between restarts.
- Simple migration from local testing to managed container platforms.
Security Note
Do not commit real .env files. Do not expose ports like 8080 or 8443 publicly without a reverse proxy, TLS, authentication hardening, and server-level access controls.
Final Thoughts
Docker is a clean way to keep Joget installation steps repeatable. For production, treat this compose file as a starting point, then harden secrets, backups, TLS, and monitoring for your environment.
Top comments (0)