VOOZH about

URL: https://dev.to/exploringmylifeworks/install-joget-with-docker-and-mysql-5242

⇱ 🐳 Advanced Joget Docker Setup with MariaDB, Custom Ports, and Volumes - DEV Community


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:

How It Works

  1. Docker runs MySQL or MariaDB in one container.
  2. Joget runs in another container.
  3. Joget connects to MySQL using container networking.
  4. Docker volumes preserve the database and Joget wflow files.
  5. 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.