Engineering in Program Management Part II — Dockerizing Jira 10: The SQL You’ve Been Waiting For

With the recent announcement and release of Jira 10, it’s time to dive into another adventure in the world of Atlassian and Docker. Today, we’ll guide you through setting up your very own Jira Data Center v10 playground. Ready to get started? Let’s go!

# What’s The Plan?

In this tutorial, we'll Dockerize Jira Software Data Center version 10, complete with PostgreSQL 15. We’ll set up everything for a fully functional, trial-licensed Docker installation.

For more details on Jira 10 and the announcement, check out these resources:

# How Do We Get There?

We’ll use Docker, Docker Compose, and the official Jira Docker Image. As Jira updates frequently, be sure to check Docker Hub for the latest versions—this guide is based on version 10.

# When Can We Start?

Right now! Let’s begin by creating a new directory for the project.

# Creating the Dockerfile

In your text editor, create a new file called Dockerfile and add the following content:

Dockerfile
FROM atlassian/jira-software:10.0.0

This basic setup is just the beginning. You can expand on this configuration as needed or even create a Gist for future reference.

# Setting Up docker-compose.yml

Next, create another file —docker-compose.yml— and include the following configuration:

docker-compose.yml
services:
  jira-10:
    image: atlassian/jira-software:10.0.0
    container_name: jira-10
    networks:
      - jira10net
    volumes:
      - jira10data:/var/atlassian/jira
    ports:
      - "8080:8080"
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

volumes:
  jira10data:
    driver: local

This configuration is based on the instructions found on the Docker Hub overview page for Jira. The recommendation to mount a host directory as a data volume is implemented here, ensuring that your data persists across container restarts.

Notice the intentional use of 10 in the volume, container, and mount-point names—this helps distinguish this setup from any Jira 9 instances you might also be running.

# Bringing It All Together with docker-compose up

With your Docker configuration ready, start the setup by running:

docker compose up

# It’s Alive!

After a short wait, you should see the Jira 10 command-line welcome message:

jira-10  |
jira-10  |                   `sMMMMMMMMMMMMMM+
jira-10  |                      MMMMMMMMMMMMMM
jira-10  |                      :sdMMMMMMMMMMM
jira-10  |                              MMMMMM
jira-10  |           `sMMMMMMMMMMMMMM+  MMMMMM
jira-10  |              MMMMMMMMMMMMMM  +MMMMM
jira-10  |               :sMMMMMMMMMMM   MMMMM
jira-10  |                      MMMMMM    `UOJ
jira-10  |    `sMMMMMMMMMMMMM+  MMMMMM
jira-10  |      MMMMMMMMMMMMMM  +MMMMM
jira-10  |       :sdMMMMMMMMMM   MMMMM
jira-10  |              MMMMMM    `UOJ
jira-10  |              MMMMMM
jira-10  |              +MMMMM
jira-10  |               MMMMM
jira-10  |                `UOJ
jira-10  |
jira-10  |       Atlassian Jira
jira-10  |       Version : 10.0.0
jira-10  |
jira-10  |

Navigate to http://localhost:8080 in your browser, and you should see the Jira welcome page. But wait—there's more to do!

The Database setup screen, showing fields for the database type, hostname, database name, server port, username, and password.

# Setting Up the Database for Jira 10

To complete the setup, we need to configure a PostgreSQL database. Let’s jump back into our docker-compose.yml file.

# Configuring PostgreSQL

We'll set up PostgreSQL 15 using the Alpine distribution. Update your docker-compose.yml with the following:

docker-compose.yml
services:
  jira-10:
    depends_on:
      - postgresql-15
    image: atlassian/jira-software:10.0.0
    container_name: jira-10
    networks:
      - jira10net
    volumes:
      - jira10data:/var/atlassian/jira
    ports:
      - "8080:8080"
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

  postgresql-15:
    image: postgres:15.0-alpine
    networks:
      - jira10net
    volumes:
      - postgresql15data:/var/lib/postgresql/data
    ports:
      - 5432:5432
    environment:
      # Database hostname is `postgresql` inside Jira
      - "POSTGRES_USER=jira"
      # CHANGE THE PASSWORD!
      - "POSTGRES_PASSWORD=Postgres_password"
      - "POSTGRES_DB=jiradb"
      - "POSTGRES_ENCODING=UNICODE"
      - "POSTGRES_COLLATE=C"
      - "POSTGRES_COLLATE_TYPE=C"
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

volumes:
  jira10data:
    external: false
  postgresql15data:
    external: false

networks:
  jira10net:
    driver: bridge

We’ve added the PostgreSQL service, ensuring Jira is properly linked to it through the depends_on directive. Note that the hostname of a docker compose service is its name in the docker-compose.yml file. In the next step, this is postgresql-15.

# Installing Jira

With everything configured, revisit http://localhost:8080 to continue the setup. Use the database credentials from your docker-compose.yml file, and set the database port to 5432.

The database setup screen with populated values from our docker-compose.yml file.

Test the connection to ensure everything is set up correctly, and proceed with the installation.

The Database setup screen, with all values for database type, hostname, database name, server port, username, and password now populated, the test shows a 'Database connection successful' message..

Click "Next" to proceed. Make yourself a delicious treat, or go for a walk.

The 'Next' button now displays 'Please wait while the database is set up. This may take a minute...'

# Application Properties and License

You’ll be prompted to set up application properties or import data from another Jira server. Stick with the default settings for now.

The Jira 'Set up application properties' installation step, where we are asked to enter 'Application Title', 'Mode: Private/Public', and 'Base URL'.

Next, we'll generate a trial license. Remember to take note of the Server ID displayed during this process—you’ll need it to generate the license.

The 'Specify your license key' overlay, which displays our Server ID, and an empty license key field. The 'generate a license key' link is displayed at the bottom.

Note the highlighted "Server ID" value here — we will need it in just a moment. Click the "generate a Jira trial license" link.

The My Atlassian license generation screen, which provides fields for Organization, email address, and Server ID.

At this screen, the server ID will be prefilled if you clicked the link we just covered. If not, paste in the value you copied, which looks like "ABCD-E12F-34GH-IJ5K". Once that, and your Atlassian Organization is filled in, click "Generate License".

If all goes as planned, you'll receive a popover confirmation to install the license in localhost:

The 'Confirmation' overlay, which asks us to 'Please confirm that you wish to install the license key on the following server: localhost' and 'Yes' and 'No' buttons.

Upon clicking "Yes", you'll whisked away back to localhost with the license filled in:

The 'Specify your license key' overlay, with our license now pasted into the textarea for 'license key'.

If for some reason this flow doesn't happen automatically, head over to your Atlassian licenses page, and copy the key manually:

The MyAtlassian license page, which displays the license for Jira 10 we will copy and paste back into the setup screen.

After the license key is in place within localhost's setup, click "Next" to proceed:

The Next button now shows "Configuring your license..."

Next, set up your administrator account:

The Jira Administrator Account setup screen, showing Full Name, Email Address, Username, and Password fields.

A mail server is out of scope for this post, so we'll leave "Later" selected here:

The Email Notifications setup screen, which shows options 'Configure Email Notifications — Now / Later' with 'Later' selected by default.

Click "Finish" and hold your breath! Don't do this.

The final loading message reads 'Please wait while the final step of the Jira installation is performed...'

Just two more steps! Pick a language:

The language selection page, which shows many languages to choose from. English is selected by default.

And pick an avatar.

The avatar selection screen, which displays an animated character, and an upload button.

# Setting Up Your First Jira Project

Jira 10 introduces new project configuration options. Start by exploring a sample project to get a feel for the new features.

The installation complete 'Welcome' screen, which provides options for next steps: See a project in action, Create a new project, Import from another tool.

Click “Create sample project” and enter the project details.

The 'Kanban software development' new project overlay, which displays 'Name' and 'Key' fields for the project, along with 'Back', 'Submit', and 'Cancel' buttons.

# Jira 10: Up and Running

Congratulations! You now have Jira 10 running on PostgreSQL 15 within Docker. This setup is portable and ready for further exploration.

The new Kanban Board running in Jira 10! It displays all of the example issues Jira created.

For double confirmation, head over to the Applications admin page, which should reflect your 10.0.0 installation.

The Jira Applications administration area, where the version '10.0.0' is displayed.

And with that, our setup is complete. You can find all the project files in this Gist.

I hope this guide leaves you with a solid understanding of Jira 10’s capabilities and gets you excited to dive deeper into all the new features this major release has to offer: dark mode.

The Jira user interface running in dark mode, which provides a color scheme with dark background and light text.

Back to Top