---
title: "Azurite in Docker: Run It, Connect to It and Browse It with a GUI"
description: "Azurite in Docker and docker compose: ports, volume, flags, the devstoreaccount1 connection string, fixes for common errors, and a GUI to browse it."
url: "https://jamsql.com/blog/2026-09-30-azurite-docker-gui/"
html_url: "https://jamsql.com/blog/2026-09-30-azurite-docker-gui/"
generated: "2026-10-02T21:40:16.261Z"
---

Published: 2026-09-30 • Updated: 2026-10-02

# Azurite in Docker: Run It, Connect to It and Browse It with a GUI

Azurite is Microsoft's open-source Azure Storage emulator for Blob, Queue and Table storage. In Docker it runs as `mcr.microsoft.com/azure-storage/azurite` with port 10000 for Blob, 10001 for Queue and 10002 for Table, and you connect with the built-in account `devstoreaccount1` or the shortcut `UseDevelopmentStorage=true`. Azurite has no user interface of its own, and its README documents Microsoft's tools for looking inside it. This post gives a `docker run` command and a `docker-compose.yml` that keep your data, the flags that matter in a container, the errors people hit most often with their fixes (reproduced with Azurite 3.36.0 and 3.37.0 on September 30, 2026), and how Jam SQL Studio connects to a running Azurite container, including what it does not do.

## Run Azurite with `docker run`

The minimal command from the [Azurite README](https://github.com/Azure/Azurite#dockerhub) and Microsoft Learn's [Install and run Azurite](https://learn.microsoft.com/en-us/azure/storage/common/storage-install-azurite) publishes the three service ports:

```bash
docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 mcr.microsoft.com/azure-storage/azurite
```

For day-to-day work, add a name, a named volume and a host address:

```bash
docker run -d --name azurite \
  -p 127.0.0.1:10000:10000 \
  -p 127.0.0.1:10001:10001 \
  -p 127.0.0.1:10002:10002 \
  -v azurite-data:/data \
  mcr.microsoft.com/azure-storage/azurite
```

Port

Service

Endpoint for the default account

10000

Blob

`http://127.0.0.1:10000/devstoreaccount1`

10001

Queue

`http://127.0.0.1:10001/devstoreaccount1`

10002

Table (in preview, per Microsoft Learn)

`http://127.0.0.1:10002/devstoreaccount1`

What each addition does:

-   **`-v azurite-data:/data`** — the image declares `/data` as a volume and starts Azurite with `-l /data` (see its [Dockerfile](https://github.com/Azure/Azurite/blob/main/Dockerfile)). Without `-v`, Docker gives each new container its own anonymous volume and never reuses it ([Docker volumes docs](https://docs.docker.com/engine/storage/volumes/)), so data survives `docker stop` and `docker start`, but a fresh `docker run` starts empty. A named volume keeps blobs, queues and tables across new containers. The README's own example uses a host folder instead: `-v c:/azurite:/data`.
-   **`127.0.0.1:` in front of each port** — Docker's docs say [publishing ports is insecure by default](https://docs.docker.com/engine/network/port-publishing/): a published port is reachable from other machines, not only from your own. The development account key is printed in Microsoft's documentation, so anyone who can reach the port can read and write the data. With the loopback address, only your machine can.

If you need Blob storage only, the image also has single-service entry points, for example `docker run -p 10000:10000 mcr.microsoft.com/azure-storage/azurite azurite-blob --blobHost 0.0.0.0`.

## A `docker-compose.yml` for Azurite

The same setup as a compose file:

```yaml
services:
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite
    restart: unless-stopped
    ports:
      - "127.0.0.1:10000:10000"
      - "127.0.0.1:10001:10001"
      - "127.0.0.1:10002:10002"
    volumes:
      - azurite-data:/data

volumes:
  azurite-data:
```

Start it with `docker compose up -d`. `docker compose down` removes the container but keeps the named volume, so after the next `up` your blob containers, queues and tables are still there (we checked with a blob container); `docker compose down -v` deletes the volume as well. The README's compose sample starts with `version: "3.9"`; Compose now ignores that key and prints a warning that it is obsolete ([Compose file reference](https://docs.docker.com/reference/compose-file/version-and-name/)), so it is left out here.

## Azurite flags you are likely to need in Docker

The image's default command is `azurite -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0`. Anything you write after the image name in `docker run`, or under `command:` in compose, **replaces that whole command**. So when you add a flag, write the host flags and `-l /data` again; the README says the host flags are required when you customize the image's parameters. The flags below are documented in the [README](https://github.com/Azure/Azurite#supported-command-line-options) and on [Microsoft Learn](https://learn.microsoft.com/en-us/azure/storage/common/storage-install-azurite) (as of September 2026, Azurite 3.37.0):

Flag

What it does

When you need it

`--blobHost 0.0.0.0`  
`--queueHost 0.0.0.0`  
`--tableHost 0.0.0.0`

Listen on every interface. Azurite's own default is `127.0.0.1`.

Always in a container. The default command sets them; add them back whenever you replace it.

`-l /data` (`--location`)

Workspace folder for metadata and blob, queue and table data.

Keep it when you replace the command, so data lands in the volume.

`--skipApiVersionCheck`

Accepts requests whose API version is newer than this Azurite release knows.

When an SDK or tool is newer than your image and gets `400 InvalidHeaderValue` (see [below](#api-version)).

`AZURITE_SKIP_API_VERSION_CHECK=true` (environment variable)

Same as the flag. Only the exact value `true` turns it on.

Added in Azurite 3.37.0 ([changelog](https://github.com/Azure/Azurite/blob/main/ChangeLog.md)). On a 3.36.0 container it changed nothing in our test, so it cannot rescue an old image.

`--loose` (`-L`)

Ignores request headers and parameters Azurite does not support, instead of rejecting the request (strict mode is the default).

When a client sends a header Azurite does not implement.

`--disableProductStyleUrl`

Always reads the account name from the URL path, never from the host name.

When clients reach Azurite through a host name that contains a dot.

`--cert` with `--key` (PEM) or `--pwd` (PFX)

Serves HTTPS instead of HTTP.

For HTTPS endpoints; the certificate files have to be mounted into the container. Clients then need the `https://` connection string.

`--oauth basic`

Accepts bearer tokens and checks issuer, audience and expiry, but not the signature or permissions.

For code that signs in with `DefaultAzureCredential`. Requires HTTPS (`--cert`).

`--inMemoryPersistence`

Keeps all data in memory; nothing is written to disk.

Throwaway test runs. It cannot be combined with `-l`: on 3.37.0, `azurite -l /data --inMemoryPersistence` exits with “The --inMemoryPersistence option is not supported when the --location option is set.”

A compose service with the API version check and strict mode switched off, written as a full command:

```yaml
services:
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite
    restart: unless-stopped
    command: ["azurite", "-l", "/data",
              "--blobHost", "0.0.0.0", "--queueHost", "0.0.0.0", "--tableHost", "0.0.0.0",
              "--skipApiVersionCheck", "--loose"]
    ports:
      - "127.0.0.1:10000:10000"
      - "127.0.0.1:10001:10001"
      - "127.0.0.1:10002:10002"
    volumes:
      - azurite-data:/data

volumes:
  azurite-data:
```

## The development account and connection strings

Azurite accepts the same well-known account as the old Azure Storage Emulator ([Connect to Azurite](https://learn.microsoft.com/en-us/azure/storage/common/storage-connect-azurite), Microsoft Learn):

-   **Account name:** `devstoreaccount1`
-   **Account key:** `Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==`

The key is public on purpose. Microsoft's [connection string guide](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string#configure-a-connection-string-for-azurite) says it is meant only for testing client authentication code and *“does not serve any security purpose”*.

The shortest connection string is `UseDevelopmentStorage=true`. Per the same guide, it is equivalent to the full string below, which you need as soon as anything differs from the defaults (another host port, another host, a custom account):

```
DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;
```

Three details of that string trip people up:

-   **The account is in the path.** In Azure the account is part of the host name (`https://myaccount.blob.core.windows.net`); in Azurite it is the first segment of the path, `http://127.0.0.1:10000/devstoreaccount1/mycontainer/myblob.txt`. Microsoft calls this an IP-style URL ([Use the Azurite emulator](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite#endpoint-and-connection-url)).
-   **A host name with a dot changes the rule.** If the host is not an IP address and contains a dot, Azurite reads the account from the host name (production-style URL), so `http://foo.bar.com:10000/devstoreaccount1` needs `--disableProductStyleUrl`. `host.docker.internal` and names without a dot, such as a compose service name, keep the account in the path.
-   **Custom accounts replace the default one.** Set `AZURITE_ACCOUNTS=account1:key1` (several accounts separated by `;`, keys base64-encoded) and `devstoreaccount1` is disabled unless you list it too. Your connection strings then need the new account name and key.

## Common errors when connecting to Azurite in Docker

We reproduced the first four with Azurite 3.36.0 and 3.37.0 containers and the Azure SDK for JavaScript; the details are in the [methodology](#methodology).

### “The API version … is not supported by Azurite”

Azurite answers with HTTP status 400 and the error code `InvalidHeaderValue`. The message names the API version the client sent:

```
The API version 2026-06-06 is not supported by Azurite. Please upgrade Azurite to latest version and retry. If you are using Azurite in Visual Studio, please check you have installed latest Visual Studio patch. Azurite command line parameter "--skipApiVersionCheck" or Visual Studio Code configuration "Skip Api Version Check" can skip this error.
```

Every request carries an `x-ms-version` header, and Azurite rejects a version newer than its own baseline with `400 InvalidHeaderValue` (README, [API Version Compatible Strategy](https://github.com/Azure/Azurite#api-version-compatible-strategy)). New SDK releases move to new API versions, so a current SDK against an older image produces this error. In our test, Azurite 3.36.0 rejected `@azure/storage-blob` 12.33.0 (API version 2026-06-06) and `@azure/storage-queue` 12.31.0 (2026-04-06), and accepted `@azure/data-tables` 13.3.2 (2019-02-02). Azurite 3.37.0, [released August 26, 2026](https://github.com/Azure/Azurite/releases/tag/v3.37.0), accepted all three.

The image tag does not help you notice this. `docker run` pulls an image only when it is [missing from the local cache](https://docs.docker.com/reference/cli/docker/container/run/), so a `latest` you pulled months ago keeps running until you pull again. Fixes, in order of preference:

1.  Update the image and recreate the container: `docker pull mcr.microsoft.com/azure-storage/azurite`, then `docker rm -f azurite` and your `docker run` again (the named volume keeps the data). With compose: `docker compose pull` and `docker compose up -d`.
2.  Add `--skipApiVersionCheck` to the full command, as in the compose file above. It worked on 3.36.0 for all three services.
3.  On 3.37.0 and later only: set `AZURITE_SKIP_API_VERSION_CHECK=true`.

### Connection reset right after you add a flag

Running `docker run -p 10000:10000 … mcr.microsoft.com/azure-storage/azurite azurite -l /data --skipApiVersionCheck` starts fine, but every request from the host failed with `read ECONNRESET` on all three ports. The container log shows why:

```
Azurite Blob service is successfully listening at http://127.0.0.1:10000
```

The new command replaced the default one, the host flags went with it, and Azurite now listens on the container's own loopback address, which the published port cannot reach. Put `--blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0` back into the command. With them, the log reads `successfully listening at http://0.0.0.0:10000`.

### Connection refused (`ECONNREFUSED`), sometimes for one service only

A refused connection means nothing is listening on that host port. In Docker the usual causes are:

-   **The port is not published.** A container started with only `-p 10000:10000` refuses Queue and Table requests; in our test both failed with `connect ECONNREFUSED` on their host ports. The README's persisted-data example, `docker run -p 10000:10000 -p 10001:10001 -v c:/azurite:/data …`, publishes no Table port, so Table clients fail while Blob works. Add `-p 10002:10002`.
-   **The host port differs from the one in your connection string.** With `-p 20000:10000`, the endpoint is `http://127.0.0.1:20000/devstoreaccount1`, and `UseDevelopmentStorage=true` no longer fits; use the full string with your ports.
-   **The client runs in another container** and uses `127.0.0.1`, which there means its own container. See [Azurite next to a SQL database](#sql-side-by-side).
-   **The container is not running**, for example after `docker compose down` or a reboot without a restart policy. `docker ps` shows it.

### Errors from a URL without the account name

Pointing a client at `http://127.0.0.1:10000` instead of `http://127.0.0.1:10000/devstoreaccount1` does not give a clear message. Against Azurite 3.37.0, listing containers returned `400 InvalidQueryParameterValue` (“Value for one of the query parameters specified in the request URI is invalid.”), listing queues returned `404 ResourceNotFound`, and listing tables returned a bare `400`. Add the account as the first path segment of every endpoint.

### A recent report from Azure Storage Explorer

Storage Explorer issue [#9204](https://github.com/microsoft/AzureStorageExplorer/issues/9204), “Error after installing Azurite as docker container”, opened on September 29, 2026, shows what a failure looks like in a GUI: on Windows, with Azurite installed from Docker, Blob, Queues and Tables are visible, and clicking one (Blob, in the report) ends in “Unable to retrieve child resources” with a `Node Fetch Error` whose code is `UND_ERR_SOCKET`. The report does not include the Docker command that was used, and as of September 30, 2026 it has no reply, so we cannot say which cause, if any of the above, applies.

## Browse Azurite with Jam SQL Studio

Azure Storage connections arrived in Jam SQL Studio 1.5.3. An Azurite connection can be set up in two ways.

### Detect Local Databases

With Azurite running, open **New connection** and click **Detect local databases** (it is also in the command palette and in the Saved Connections dialog). On that click, and never in the background, the app asks the local Docker Engine for its running containers and reads each recognized container's settings:

-   **Which containers:** running containers whose image name ends in `azure-storage/azurite`, with any tag and any registry prefix, so a mirror of the image is recognized too.
-   **Ports:** the host port published for each of 10000, 10001 and 10002. One published port is enough; the saved connection gets exactly the services whose ports are published, each at `http://127.0.0.1:<host port>/<account>`. A container published on `20000–20002` gets those ports.
-   **Account and key:** `devstoreaccount1` and its key, or, when the container sets `AZURITE_ACCOUNTS`, the first account and key listed there. A value the app cannot read as `account:key` skips the container.

**Add** saves the connection; nothing connects until you do. A container you already added shows as *already added*. The full list of recognized images and entry points is in [Detect Local Databases](/docs/connections/#detect-local-docker-databases).

### The Emulator (Azurite) option

On the Azure Storage form, set **Connect using** to **Emulator (Azurite)**. The form fills in `devstoreaccount1`, the account key and the endpoints on `127.0.0.1:10000–10002`, ticks Blob, Table and Queue, and disables File shares with the note “Azurite has no Files service”. If Azurite is not running yet, the form shows `docker run -d -p 10000:10000 -p 10001:10001 -p 10002:10002 mcr.microsoft.com/azure-storage/azurite` with a **Copy** button; testing the connection never starts Docker. Pasting `UseDevelopmentStorage=true` with **Paste connection string** fills the form the same way. If you published other host ports or use another account, paste the full connection string with your ports and account instead: the form still switches to Emulator (Azurite), keeps those endpoints and ticks only the services the string lists. You can also change the Blob, Table and Queue URLs under **More options → Endpoints → Override per-service endpoints**.

![The Jam SQL Studio New Connection dialog on the Azure Storage form with Connect using set to Emulator (Azurite): the Storage account field holds devstoreaccount1 and resolves to http://127.0.0.1:10000/devstoreaccount1, a box shows the docker run command for Azurite with a Copy button, Account key authentication has the key masked, and Blob, Table and Queue are ticked while File shares is disabled with the note that Azurite has no Files service](/images/docs/azure-storage-connection-azurite.png)
*Emulator (Azurite) fills in the development account and its endpoints, and offers the docker run command to copy.*

### What you can do once connected

-   **Blob containers** open in a storage browser with virtual folders and a prefix filter; uploads, downloads and deletes run as background jobs in a Transfers drawer.
-   **Files in a container** show in a preview pane next to the list (JSON as a tree, Markdown rendered, text with syntax highlighting, images, video and audio), and text files can be edited and saved back to Azurite ([Preview and edit files](/docs/azure-storage/#preview)).
-   **Table entities** open in a grid that keeps each property's type, with filter chips or raw OData, and **Edit Mode** for adding, editing and deleting entities.
-   **Queues** show their messages with **Peek**, which reads up to 32 messages without taking them off the queue; receiving, updating and clearing are separate actions.
-   If Azurite is down when you connect, the connection error ends with “Start Azurite and try again.”

![An Orders table open in Jam SQL Studio's entity grid: Filter chips selected, with PartitionKey equals EU and Total greater than 100, Edit Mode in the toolbar, and six rows with PartitionKey, RowKey, Timestamp (in local time), Customer, Total, Paid, TrackingId and Items columns](/images/docs/azure-storage-entities.png)
*Table entities in a grid with typed filter chips; Edit Mode adds and changes entities.*

Jam SQL Studio 1.5.3 uses `@azure/storage-blob` 12.33.0 and `@azure/storage-queue` 12.31.0, the same versions as in the test above. Against an Azurite image older than 3.37.0, Blob and Queue requests therefore fail with the API version error while Table keeps working; update the image or add `--skipApiVersionCheck`.

What it does not do:

-   It does not install, start, stop or update Azurite or its container.
-   Detection covers Docker only. It talks to the local Docker socket or named pipe (or a `DOCKER_HOST` that is a `unix://` or `npipe://` address, not `tcp://`), and it sees running containers only. Azurite started from npm, from the VS Code extension or from a renamed image is not detected; use the Emulator (Azurite) option for those.
-   Of several accounts in `AZURITE_ACCOUNTS`, detection uses the first.
-   The Emulator option and detection build `http://` endpoints on `127.0.0.1`.
-   There are no file shares or Data Lake directories on an Azurite connection, because Azurite has neither service ([Microsoft Learn](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite#differences-between-azurite-and-azure-storage)).
-   Azure Storage connections do not run SQL: there is no Query Editor or notebook on them ([what does not apply](/docs/azure-storage/#no-sql)).

Local Azurite work is covered by the same licence terms as the rest of Jam SQL Studio: the Personal tier is free for personal, non-commercial use, and work use needs Pro ([pricing](/pricing/)). If you are weighing it against Microsoft's tool, the [Azure Storage Explorer comparison](/alternatives/azure-storage-explorer/) covers both.

## Azurite next to a SQL database in one compose file

Applications that keep files in Blob storage usually also have a database. This file runs Azurite and PostgreSQL 18 together:

```yaml
services:
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite
    restart: unless-stopped
    ports:
      - "127.0.0.1:10000:10000"
      - "127.0.0.1:10001:10001"
      - "127.0.0.1:10002:10002"
    volumes:
      - azurite-data:/data

  postgres:
    image: postgres:18
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: devpassword
    ports:
      - "127.0.0.1:5432:5432"
    volumes:
      - pg-data:/var/lib/postgresql

volumes:
  azurite-data:
  pg-data:
```

-   **From another service in the same file**, use the service names as hosts: `http://azurite:10000/devstoreaccount1` and `postgres:5432`. Compose puts every service on one network where each is [reachable by its service name](https://docs.docker.com/compose/how-tos/networking/). In our test, a client container on that network listed containers, queues and tables through `azurite`, and got `ECONNREFUSED` through `127.0.0.1`.
-   **From your machine**, use `127.0.0.1` and the published ports.
-   **PostgreSQL 18 changed its data directory.** From 18 on, the official image's volume is `/var/lib/postgresql`; for 17 and earlier, mount `/var/lib/postgresql/data` ([postgres image docs](https://hub.docker.com/_/postgres)).
-   **In Jam SQL Studio**, Detect Local Databases lists both containers: Azurite with its three ports, and PostgreSQL with user `postgres`, the password from `POSTGRES_PASSWORD` and database `postgres`. The same works for SQL Server (`mcr.microsoft.com/mssql/server`), MySQL, MariaDB and Oracle containers.

## Methodology

-   **Date and setup:** September 30, 2026, Docker Engine 29.7.2 and Docker Compose 5.5.0 on Linux, with the images `mcr.microsoft.com/azure-storage/azurite:3.36.0` and `:3.37.0` and `postgres:18`, each in a scratch container on its own host ports, removed afterwards.
-   **Client:** the Azure SDK for JavaScript packages bundled with Jam SQL Studio 1.5.3 (`@azure/storage-blob` 12.33.0, `@azure/storage-queue` 12.31.0, `@azure/data-tables` 13.3.2), signing with the default account key and listing containers, queues and tables with retries off. The API versions named above are the ones these packages send.
-   **Cases:** each image with its default command; 3.37.0 with a replaced command lacking the host flags; 3.36.0 with the host flags plus `--skipApiVersionCheck`; 3.36.0 with `AZURITE_SKIP_API_VERSION_CHECK=true` and only port 10000 published; endpoints without the account segment; a client container on the compose network using the service name and `127.0.0.1`; `docker compose down` and `up` with a named volume.
-   **Product behaviour** described here was read from the Jam SQL Studio 1.5.3 source, and the detection mapping was run against the `docker inspect` output of the test containers.

## Quick Answers

Short answers to common questions about running Azurite in Docker and connecting to it.

### Q: What is the connection string for Azurite?

A: For the default account it is UseDevelopmentStorage=true, which Microsoft documents as equivalent to DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1; If you publish other host ports, or connect from another container, change the host and port in the three endpoints and keep the account name as the first path segment.

### Q: Which ports does Azurite use in Docker?

A: 10000 for Blob, 10001 for Queue and 10002 for Table. Publish all three with -p 10000:10000 -p 10001:10001 -p 10002:10002, or list them under ports in docker-compose.yml. A service whose port is not published refuses connections from the host. Azurite has no Azure Files or Data Lake Storage Gen2 endpoint.

### Q: How do I fix the Azurite error that an API version is not supported?

A: The client sent an x-ms-version header newer than your Azurite image supports, so Azurite answered 400 InvalidHeaderValue. Pull the current image with docker pull mcr.microsoft.com/azure-storage/azurite (or docker compose pull) and recreate the container, because docker run keeps using an image it already has. Or start Azurite with --skipApiVersionCheck. The AZURITE\_SKIP\_API\_VERSION\_CHECK=true variable only exists from Azurite 3.37.0; on 3.36.0 it had no effect in our test.

### Q: Why does Azurite reset the connection after I add flags to docker run?

A: Arguments after the image name replace the image's default command, which is azurite -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0. Without the host flags Azurite listens on 127.0.0.1 inside the container, so the published port reaches nothing and clients get ECONNRESET. Write the full command again with your extra flags added.

### Q: Why can't my app container reach Azurite at 127.0.0.1?

A: Inside a container, 127.0.0.1 is that container itself. In the same compose project, use the Azurite service name as the host, for example http://azurite:10000/devstoreaccount1. In our test, 127.0.0.1:10000 from the app container returned connection refused and the service name worked.

### Q: Is there a GUI for Azurite?

A: Azurite itself has no user interface. Microsoft documents Azure Storage Explorer, with Attach to a local emulator, for viewing its data. Jam SQL Studio also connects to it: Detect Local Databases finds a running Azurite container and reads its published ports and AZURITE\_ACCOUNTS, or the Emulator (Azurite) option fills in the default account. Blob containers, queues and Table entities then open in the app.

## Summary

Run Azurite with all three ports published, a named volume on `/data` and the ports bound to `127.0.0.1`. When you add a flag, write the whole command, host flags and `-l /data` included. Keep the image current, because new SDKs send API versions an old Azurite rejects; `--skipApiVersionCheck` covers the gap when you cannot update. Connect with `UseDevelopmentStorage=true` on the default ports, or with the full string when the host, ports or account differ, and remember that the account name goes in the path. To see what is inside, Microsoft's Storage Explorer and Jam SQL Studio both connect to the emulator; Jam SQL Studio also picks up the container's ports and account from Docker.

### Related

-   [Azurite in the Azure Storage Guide](/docs/azure-storage/#emulator)
-   [Detect Local Databases](/docs/connections/#detect-local-docker-databases)
-   [Azure Storage Client](/databases/azure-storage/)
-   [Azure Storage Explorer Alternative](/alternatives/azure-storage-explorer/)
-   [Azure Storage Permission Errors](/blog/2026-09-30-azure-storage-permission-errors/)
-   [Azure Storage in Jam SQL Studio 1.5.3](/blog/2026-09-25-azure-storage-blobs-queues-tables/)

## Browse Azurite Blobs, Queues and Tables

Jam SQL Studio finds a running Azurite container with Detect Local Databases, reads its published ports and `AZURITE_ACCOUNTS`, and opens blob containers, queue messages and Table entities next to your SQL connections.

[Download Jam SQL Studio Free](/#download) [Azurite in the Azure Storage guide](/docs/azure-storage/#emulator)

Free for personal use • No account required • Mac, Windows, Linux