TrueNAS Docker: Custom Apps and Docker Compose via YAML

  • Post author:Frank Joseph
  • Post published:
  • Post last modified:
  • Post category:TrueNAS
  • Reading time:9 mins read

TrueNAS Docker support is built in, so there’s nothing extra to install. Since 24.10 (Electric Eel, October 2024), every app in TrueNAS is a Docker container. You can run your own from Apps > Discover Apps with the Custom App wizard for a single container, or with Install via YAML for a Docker Compose file. Everything below is written against TrueNAS 25.10 Goldeye (25.10.7 is the vendor’s recommended release as of October 2026).

Docker on TrueNAS SCALE is the same thing (the product was renamed TrueNAS Community Edition in 25.04), but most TrueNAS SCALE Docker guides, including the first version of this one, show screens from before 24.10. Launch Docker Image is now Apps > Discover Apps > Custom App. The TrueCharts catalog I used for Docker Compose is gone too (TrueCharts had ended its TrueNAS apps support by October 27, 2024), so a Compose file now goes through Install via YAML.

Does TrueNAS Support Docker?

Yes. TrueNAS 24.10 (released October 29, 2024) moved the Apps back end from Kubernetes to Docker Compose, migrated existing catalog apps and their data along with it, and added full support for custom YAML files.

As I said in March 2026, TrueNAS has gone from Docker to Kubernetes back to Docker, but it’s finally in a state where it makes sense. You should be able to run just about any Docker container you want directly inside of TrueNAS.

TrueNAS CORE (formerly FreeNAS) is different. It’s FreeBSD-based, its plugins and jails are marked obsolete in 13.0, and it’s no longer under active development, so it has no Docker apps at all. Getting them means the one-way migration to Community Edition, which my TrueNAS CORE vs. Community Edition comparison explains.

How to Set Up Docker on TrueNAS

There’s no Docker service to switch on. Docker on TrueNAS needs a pool for apps (nothing installs until you choose one) and a dataset where your containers keep their data. If TrueNAS isn’t configured yet, start with my guide on setting up TrueNAS Community Edition.

Setting a pool for TrueNAS Docker Apps

What I normally do is create a dataset called apps with the Apps preset, then nested datasets under it for some of my applications. The preset gives the built-in apps user (UID/GID 568) modify permission through an NFSv4 ACL, so a container running as 568 can write there.

1. Select Datasets > Add Dataset, name the dataset apps, set the Dataset Preset to Apps, and save it. Then select the apps dataset and add a nested dataset for each app you plan to run, also with the Apps preset.

2. Open Apps and select Configuration > Choose Pool (opening any catalog app and selecting Setup Pool To Install does the same). In Choose a pool for Apps, select your pool in the Pool dropdown, then select Choose. Custom App and Install via YAML stay greyed out until you do.

TrueNAS creates a hidden ix-apps dataset on that pool, mounted at /mnt/.ix-apps, for app images and ixVolume storage. It does not inherit encryption from an encrypted pool, and the vendor recommends SSDs for the apps pool. On 25.10 and later, choosing a new pool offers Migrate existing applications, which only moves the apps dataset, so data on host paths stays put.

3. Optionally, select Configuration > Sign-in to a Docker registry, then Add Registry. In Create Docker Registry, pick Docker Hub or Other Registry (which adds URI and Name fields) in the URI dropdown, enter your username and password, and save.

Signing in isn’t required, but it raises Docker Hub’s rate limit. As of October 2026, Docker Hub allows 100 pulls every six hours per IP address anonymously and 200 for a signed-in Personal account. When you hit the limit, TrueNAS says “It appears you have reached your pull rate limit. Please try again later.”

How to Create a Docker Container on TrueNAS

The Custom App wizard replaces Launch Docker Image and runs any image from Docker Hub or another registry, including your own in a private one. TrueNAS containers you create this way show on the Installed screen beside your catalog apps, not on the Containers screen, which runs LXC containers. Create the datasets first, because the Create Dataset button in the Host Path picker skips the Apps preset.

Discover Apps in TrueNAS

1. Open Apps, select Discover Apps, then select Custom App. The Install Custom App screen opens with the wizard.

2. Enter an Application Name in lowercase letters, numbers and hyphens, starting with a letter and not ending in a hyphen.

3. Under Image Configuration, enter the Repository (maintainer/image, such as storjlabs/storagenode, or just debian for a Docker Official Image) and the Tag, which defaults to latest. Leave Pull Policy at Pull the image if it is not already present on the host unless you want it to always or never pull.

4. Under Container Configuration, leave Entrypoint and Command empty unless the image’s documentation tells you to set them, set the Timezone, then select Add under Environment Variables for each Name and Value the image expects. Change Restart Policy from No to Unless Stopped.

5. Under Security Context Configuration, leave Privileged off. It grants the container nearly unrestricted access to the host, and Capabilities is the narrower way to give it what it needs. With Custom User off, the container runs as its image’s own user. If that isn’t root and the app can’t write to its host path, enable it and keep the User ID and Group ID at 568, the apps user the preset gives access to. Security changes, so nothing here guarantees an app is safe on its own.

6. Under Network Configuration, select Add under Ports, leave Port Bind Mode at Publish, then enter the Host Port (the port that opens on TrueNAS), the Container Port and the Protocol (TCP or UDP). If you enable Host Network instead, the container doesn’t get its own IP address, so port mapping is disabled.

7. Under Storage Configuration, select Add, set the Type to Host Path (Path that already exists on the system), enter the Mount Path inside the container, and browse to the Host Path under /mnt (the dataset you created for this app). Repeat it for each volume the image uses.

8. Under Resources Configuration, tick Enable Resource Limits only if you want to cap the app (it shows CPUs and Memory (in MB)), set up GPU Configuration if it uses one, then select Install.

The storage step matters most. The Type dropdown also offers ixVolume (Dataset created automatically by the system), SMB/CIFS Share, NFS Share and Tmpfs (a temporary directory in RAM), and TrueNAS recommends a host path for production and an ixVolume only for testing. An ixVolume is the default, but in my April 2025 setup guide I used a host path for Dockge instead. On a dataset with the Apps preset, you’ll know exactly where the data is and won’t be editing ACLs by hand.

When a newer image is published under your tag, select Update in the app’s three-dot menu on the Installed screen to pull it and redeploy.

Catalog apps can be turned into custom apps, too: select the three-dot menu next to Edit on the installed app and choose Convert to custom app. For an app-specific example from start to finish, my guide on installing Jellyfin on TrueNAS covers one.

How to Use Docker Compose on TrueNAS

TrueNAS Docker Compose support is native, so there’s no catalog or Compose app to add first. Install via YAML runs a Compose file as an app, which is the easiest way to bring over a container from another Docker host.

Custom app in TrueNAS.

1. Open Apps and select Discover Apps, then select the three-dot menu beside Custom App and choose Install via YAML.

2. Enter a Name for the app. It has to be lowercase letters and numbers, start with a letter, and can include a hyphen anywhere but the first or last character.

3. Paste your Compose file into Custom Config, then select Save. The app shows on the Installed screen once it deploys.

The file has to start with a top-level element such as name:, services: or include: (include: references an external Compose file that defines the services). Point every volume at a host path under /mnt the same way you would in the wizard, so a file shaped like this one is all it takes:

services:
  myapp:
    image: maintainer/image:latest
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - /mnt/pool/apps/myapp:/config

TrueNAS checks that the file is valid Compose, not your paths and ports, so a mistyped path deploys anyway, into an empty folder Compose creates for it. TrueNAS 25.10.0 and 25.10.0.1 rejected a file with no services: key, which 25.10.1 and later no longer do.

I deployed a Twingate client this way in November 2025. I created a Twingate dataset with the Apps preset under my apps dataset, saved its service key in a service_key.json file there, then pasted the Compose file into Install via YAML with its volume pointing back to that file.

If you’d rather manage Compose stacks in their own interface, Dockge, Portainer and Dockhand are in the catalog’s community train. I used Dockge on TrueNAS 24.10 in February 2025, pasting in a Compose file I’d been running on Proxmox, and it worked. Dockge’s last release is 1.5.0 from March 2025, though, so earlier in 2026 I went back to Portainer as my Docker manager, and by October 2026 I’d decided to switch to Dockhand because it’s actively maintained. You can also run Docker commands from the TrueNAS shell, but containers started there don’t show on the Apps screen, so I’d still strongly urge you to stick with the wizard or Install via YAML.

Once your first container is running, setting up Tailscale on TrueNAS is the usual next step for reaching it away from home.

Frank Joseph

I'm Frank, founder of WunderTech. I've been working in enterprise IT for 15+ years and running home labs for nearly a decade — every tutorial on this site is tested on hardware I actually own, including Synology NAS units, a DIY TrueNAS server, a Proxmox cluster, a full UniFi network, and more. I hold a BS in Computer Information Systems and an MBA, but most of what you'll read here comes from my home lab, not a classroom. You can also find video versions of these tutorials on my YouTube channel.