DEV Community

Explorer
Explorer

Posted on

🐳 Advanced Joget Docker Setup with MariaDB, Custom Ports, and Volumes

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
Enter fullscreen mode Exit fullscreen mode

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:
Enter fullscreen mode Exit fullscreen mode

Start Joget:

docker compose up -d
Enter fullscreen mode Exit fullscreen mode

Open Joget:

http://localhost:8080/jw
Enter fullscreen mode Exit fullscreen mode

Check logs:

docker compose logs -f joget
Enter fullscreen mode Exit fullscreen mode

Stop the environment:

docker compose down
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:
Enter fullscreen mode Exit fullscreen mode

Run it:

docker compose up -d
Enter fullscreen mode Exit fullscreen mode

Open Joget:

https://localhost:8443/jw
Enter fullscreen mode Exit fullscreen mode

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)