Skip to content
melonfleet edited this page Oct 20, 2026 · 2 revisions

DNS

The DNS section gives containers names, so you can reach web.test instead of copying an address that changes every time a container is recreated. It covers three things, in rising order of reach:

  • Local domains — container's own DNS, on one Mac.
  • Per-host zones — every Mac naming its containers under its own part of a fleet domain, such as web.mini.fleet.internal.
  • Names across Macs — every Mac able to look up the other Macs' containers by those names.

With hosts paired, the list has a host chip on each row and a Host filter, and the form has Create on.

Why a domain has two halves

A working domain needs two things, and they live in different places with different permissions:

  • macOS knowing the domain, so this Mac sends lookups for it to container. That is a file in /etc/resolver, which only an administrator can write.
  • The runtime naming containers under it, so web is answered as web.test. That is [dns] domain in container's config.toml, and changing it restarts container.

Either can exist without the other, so each row shows both halves and says plainly when only one is there, with the missing half offered beside it:

Status What it means
In use for containers Both halves: containers are named under it and this Mac can reach them by name.
Containers only — not on this Mac Containers can reach each other by name, but this Mac cannot look the names up. Set Up on This Mac… fixes that.
Not used for containers This Mac can look names up under it, but containers are not named there.
Not set up Neither.

Only one domain at a time names containers, because config.toml holds one.

New Domain

+ ▸ New Domain…, or a suggestion from + ▸ Suggestions…:

  • Create on — which Mac's DNS settings, once you have hosts.
  • Kind:
    • Container names — containers are named under the domain: a container called web is reached as web.test, from this Mac and from other containers.
    • Host alias — a single name that, inside a container, reaches a service on this Mac, such as host.container.internal. Give it an Address: an IPv4 address that stands for this Mac inside containers, which the runtime sends to this Mac's own localhost. Pick one nothing on your network uses; the example, 203.0.113.113, is reserved for documentation.
  • Domain — lowercase letters, numbers and hyphens, with dots between parts. Avoid a real domain you also use on the internet: this Mac would send its lookups to container instead. Anything under .local is refused, because macOS keeps it for Bonjour — printers and AirPlay would stop being found.
  • Name containers under this domain — for Container names. Turning it on replaces whichever domain names containers now.

The rail shows the exact administrator command before anything runs, with a Copy button, so a password prompt never asks you to approve something the screen did not say, and you can type it into Terminal yourself if you would rather.

Passwords and the Flotilla Helper

On This Mac, without the Flotilla Helper, creating or deleting a domain shows the standard macOS administrator prompt. The prompt is itself the confirmation. With the Helper, there is no prompt, so Flotilla asks first, and the Helper makes the change.

On a host, the host's own Helper makes the change, and it must be switched on there. A host without it refuses and says why, rather than showing a password prompt nobody is there to answer. A DNS change on a host is confirmed on the admin only: the host's owner approved the Helper once.

Choosing the domain that names containers

Use for Containers… and Stop Using for Containers… always ask, because they restart container on that Mac, which stops every running container there. The dialog gives the count, and the button says Restart and Use or Restart and Stop. If container is not running, nothing stops; the change applies when it next starts.

Only containers created afterwards get the new name. Recreate the others to reach them by it.

Delete removes the domain from that Mac's DNS settings. Containers still named under it keep those names until you stop using it for containers; the Mac just cannot look them up.

Per-host zones

+ ▸ Set Up Zones…, once a host is paired, gives every Mac its own zone under a fleet domain: <its label>.<fleet domain>. The fleet domain defaults to fleet.internal, and can be changed on the admin. A Mac's label is its name in lowercase, with anything other than letters and digits made a hyphen — "Studio Mac" becomes studio-mac.

Zones exist so that two Macs' web never share a name: web.mini.fleet.internal and web.studio-mac.fleet.internal are different containers on different Macs.

Tick the Macs to set up. Each says first what setting it up would do: nothing (already done), add the domain, and name its containers there — which restarts that Mac's container and stops its running containers. The confirmation adds up how many containers stop across all of them. A host whose Helper is off cannot be ticked.

Names across Macs

In Set Up Zones, Look up containers on other Macs by name lets every Mac — the admin and every host — resolve the other Macs' zones. How it works:

  • A Mac's own zone stays the runtime's, answered with the container's own address.
  • Every other Mac's zone is answered by Flotilla itself, on 127.0.0.1:7869 — loopback only, beside the fleet's port 7868.
  • The Helper keeps one file per other zone in /etc/resolver, each pointing at that responder.
  • The admin builds the table of names from what it already checks every 30 seconds and sends each host its copy. A host only applies what it is sent, and keeps the last table after a restart.

The answer is the other Mac's address, and only for a container that publishes a port there — not one published on loopback only. Connect on the published port: if web publishes port 8080 on the mini, web.mini.fleet.internal:8080 reaches it from any Mac. A container with no published port gets no answer, and the list in Set Up Zones says so — not reachable from other Macs — publish a port — rather than handing back an address that leads nowhere.

The fleet domain must end in .internal, .test or .home.arpa, names reserved for private use. The Helper refuses anything else as root, before writing a file, because a fleet domain outside them could redirect a real website on every Mac. The resolver files can only ever point at Flotilla on the same Mac.

Not yet: a tunnel or overlay network between Macs. Names across Macs are DNS over the network you already have; a container must be reachable through a published port.

Clone this wiki locally