Apple container
Apple's container is an open-source CLI for building, running, and managing OCI/Linux
containers on Apple-silicon Macs. Each container runs inside its own lightweight virtual
machine (backed by the Containerization framework and the Virtualization API), so there is no
shared daemon like Docker — services run per-user via launchd. Images are standard OCI
artifacts, so they interoperate with Docker registries and other OCI tooling. The CLI is
deliberately Docker-like (container run, container build, and image ops under
container image push/pull), but it is a distinct tool: do not assume Docker command paths,
flags, defaults, or daemon behavior carry over (e.g. there is no container images/push/pull
top-level command — image verbs live under container image).
Requirements
- Apple silicon only (M1 or later). Intel Macs are not supported.
- macOS 26 (Tahoe) is the officially supported target. The maintainers do not support
older macOS and typically will not fix issues that can't be reproduced on 26. The binary
still runs on macOS 15 (Sequoia) but with reduced networking: only the single default
subnet is available, and the
container network group and --network flag error out.
macOS-26-gated features are called out throughout the reference files.
- Version: this skill documents the 1.0.0 release (the fullest feature set). The
machine
group, container cp, container export, container prune, container image prune,
container registry list, and container system version were added in 1.0.0 (not in 0.7.1)
— features that postdate 0.7.1 are flagged (1.0.0+) in the reference files. Run container --version and
container <group> --help to see what your installed build supports.
- Install by downloading the signed
.pkg installer from the project's GitHub releases
(apple/container) and running it. See references/concepts.md for the full
requirements/compatibility matrix and how the VM-per-container model works.
Setup
Install the signed package, then start the background services once:
- Download the latest signed installer
.pkg from the
GitHub releases page.
- Double-click the downloaded package and follow the prompts, entering your admin
password so it can place files under
/usr/local. (There is no documented CLI installer
invocation — installation is via the GUI package.)
- Start the services and confirm they are healthy:
# Start the container services (container-apiserver + helpers via launchd). On first run it
# offers to install the default Linux kernel — accept it, or start non-interactively with
# `--disable-kernel-install` and add a kernel later via `container system kernel set`.
container system start
# Verify services are healthy
container system status
container system start must have run before any container/image/build command works — a
connection/XPC error almost always means the services are stopped, so run it again. Stop and
deregister the launchd services with container system stop (which takes only -p/--prefix).
The startup flags for container system start (-a/--app-root, --install-root, --log-root,
--enable-kernel-install/--disable-kernel-install, --timeout) are in
references/configuration.md.
Upgrade / downgrade / uninstall use helper scripts in /usr/local/bin (stop first with
container system stop): update-container.sh (add -v <version> to pin a version), and
uninstall-container.sh -d to remove user data or -k to keep it. Full recipes in
references/workflows.md.
Command groups at a glance
Invoke everything as container <group> <subcommand>. Container-lifecycle verbs (run,
create, start, stop, exec, logs, inspect, list/ls, delete/rm, kill,
stats) and build are top-level; image operations like push, pull, and tag live
under container image. Run container <group> --help for exact flags, or read
references/commands.md for the exhaustive matrix.
| Group |
What it does |
Example |
| container lifecycle |
Create, start, run, stop, exec, inspect, list, remove containers |
container run --rm -it docker.io/library/alpine sh |
| build |
Build an OCI image from a Dockerfile in the builder VM |
container build -t myapp:latest . |
| image |
List, tag, inspect, remove, load/save, prune local images; push/pull to registries |
container image ls |
| registry |
Authenticate (login/logout/list) to OCI registries |
container registry login ghcr.io |
| system |
Start/stop/status services, logs, disk usage (df), DNS, kernel, properties |
container system status |
| network |
Create/list/remove container networks (macOS 26 only) |
container network create mynet |
| volume |
Create/list/inspect/remove persistent volumes |
container volume create data |
| builder |
Manage the builder VM that runs container build (start/stop/status) |
container builder status |
| machine (1.0.0+) |
Persistent Linux "machine" environments (added in 1.0.0) |
container machine --help |
Exact subcommand names, aliases, arguments, and flags for each group live in
references/commands.md — consult it before running an unfamiliar command rather than
guessing Docker-equivalent syntax.
Navigating this skill
Read the reference file that matches the task; do not guess flags or behavior.
references/commands.md — exhaustive CLI reference: every command group, subcommand,
alias, argument, and flag. Read this to construct any concrete container ... invocation,
or to confirm a flag exists before using it.
references/concepts.md — architecture (VM-per-container, Containerization framework),
system requirements and macOS 15 vs 26 differences, networking model, per-container IPs,
security model, and a Docker-vs-container comparison. Read this to explain how or why
something works, or when a Docker mental model gives the wrong answer.
references/configuration.md — the system service, config.toml / property model,
default kernel, DNS domains, default registry, builder resources, and machine settings.
Read this to change defaults, tune CPU/memory, point at a private registry, or manage the
kernel.
references/workflows.md — copy-pasteable task recipes (run an image, build & push,
wire up local DNS, mount a volume, expose ports) and troubleshooting for common failures.
Read this first when the user wants to accomplish a concrete end-to-end task.
Key rules
- This is not Docker. The CLI resembles Docker, but flags, defaults, and daemon behavior
differ. Verify syntax in
references/commands.md instead of assuming Docker equivalence.
- Always ensure services are up first. Run
container system start (and confirm with
container system status) before any container/image/build command; connection errors
usually mean the services are stopped.
- Images are standard OCI artifacts and interoperate with Docker registries and other OCI
tools. Image references that omit a registry default to
docker.io (configurable via the
registry.domain property — see references/configuration.md).
- Each container gets its own IP address on its network (one lightweight VM per
container). There is no shared Docker bridge; reach a container directly by its IP, or set
up a local DNS domain (
container system dns create ..., admin required) for name-based
access.
container network requires macOS 26. On macOS 15 only the single default subnet is
available and the network command group is unavailable — see references/concepts.md.
- Use fully-qualified image references when precision matters (e.g.
docker.io/library/alpine rather than bare alpine) to avoid ambiguity about the source
registry.
1---2name: apple-container3description: Apple's open-source `container` CLI to build, run, and manage OCI/Linux containers as lightweight per-container VMs on Apple-silicon macOS — no Docker daemon required. Use when the user mentions the `container` CLI, "apple container", running or building containers on macOS without Docker/Podman, `container run`, `container build`, `container images`, `container system start`, pushing/pulling images to a registry, or container networking on macOS. This is Apple's `container` tool specifically (repo `apple/container`), NOT Docker, Podman, containerd, nerdctl, or Kubernetes — the CLI is Docker-like but is a different tool.4license: Apache-2.05---6
7# Apple `container`
8
9Apple's `container` is an open-source CLI for building, running, and managing OCI/Linux
10containers on Apple-silicon Macs. Each container runs inside its own lightweight virtual
11machine (backed by the Containerization framework and the Virtualization API), so there is no
12shared daemon like Docker — services run per-user via `launchd`. Images are standard OCI
13artifacts, so they interoperate with Docker registries and other OCI tooling. The CLI is
14deliberately Docker-like (`container run`, `container build`, and image ops under
15`container image push`/`pull`), but it is a distinct tool: do not assume Docker command paths,
16flags, defaults, or daemon behavior carry over (e.g. there is no `container images`/`push`/`pull`
17top-level command — image verbs live under `container image`).
18
19## Requirements
20
21- **Apple silicon only** (M1 or later). Intel Macs are not supported.
22- **macOS 26 (Tahoe) is the officially supported target.** The maintainers do not support
23 older macOS and typically will not fix issues that can't be reproduced on 26. The binary
24 still runs on **macOS 15 (Sequoia)** but with reduced networking: only the single default
25 subnet is available, and the `container network` group and `--network` flag error out.
26 macOS-26-gated features are called out throughout the reference files.
27- **Version:** this skill documents the **1.0.0** release (the fullest feature set). The `machine`
28 group, `container cp`, `container export`, `container prune`, `container image prune`,
29 `container registry list`, and `container system version` were **added in 1.0.0** (not in 0.7.1)
30 — features that postdate 0.7.1 are flagged *(1.0.0+)* in the reference files. Run `container --version` and
31 `container <group> --help` to see what your installed build supports.
32- Install by downloading the signed `.pkg` installer from the project's GitHub releases
33 (`apple/container`) and running it. See `references/concepts.md` for the full
34 requirements/compatibility matrix and how the VM-per-container model works.
35
36## Setup
37
38Install the signed package, then start the background services once:
39
401. **Download** the latest signed installer `.pkg` from the
41 [GitHub releases page](https://github.com/apple/container/releases).
422. **Double-click** the downloaded package and follow the prompts, entering your admin
43 password so it can place files under `/usr/local`. (There is no documented CLI `installer`
44 invocation — installation is via the GUI package.)
453. **Start the services** and confirm they are healthy:
46
47```bash
48# Start the container services (container-apiserver + helpers via launchd). On first run it
49# offers to install the default Linux kernel — accept it, or start non-interactively with
50# `--disable-kernel-install` and add a kernel later via `container system kernel set`.
51container system start
52
53# Verify services are healthy
54container system status
55```
56
57`container system start` must have run before any container/image/build command works — a
58connection/XPC error almost always means the services are stopped, so run it again. Stop and
59deregister the `launchd` services with `container system stop` (which takes only `-p/--prefix`).
60The startup flags for `container system start` (`-a/--app-root`, `--install-root`, `--log-root`,
61`--enable-kernel-install`/`--disable-kernel-install`, `--timeout`) are in
62`references/configuration.md`.
63
64**Upgrade / downgrade / uninstall** use helper scripts in `/usr/local/bin` (stop first with
65`container system stop`): `update-container.sh` (add `-v <version>` to pin a version), and
66`uninstall-container.sh -d` to remove user data or `-k` to keep it. Full recipes in
67`references/workflows.md`.
68
69## Command groups at a glance
70
71Invoke everything as `container <group> <subcommand>`. Container-lifecycle verbs (`run`,
72`create`, `start`, `stop`, `exec`, `logs`, `inspect`, `list`/`ls`, `delete`/`rm`, `kill`,
73`stats`) and `build` are top-level; image operations like `push`, `pull`, and `tag` live
74under `container image`. Run `container <group> --help` for exact flags, or read
75`references/commands.md` for the exhaustive matrix.
76
77| Group | What it does | Example |
78|-------|--------------|---------|
79| container lifecycle | Create, start, run, stop, exec, inspect, list, remove containers | `container run --rm -it docker.io/library/alpine sh` |
80| build | Build an OCI image from a Dockerfile in the builder VM | `container build -t myapp:latest .` |
81| image | List, tag, inspect, remove, load/save, prune local images; push/pull to registries | `container image ls` |
82| registry | Authenticate (login/logout/list) to OCI registries | `container registry login ghcr.io` |
83| system | Start/stop/status services, logs, disk usage (`df`), DNS, kernel, properties | `container system status` |
84| network | Create/list/remove container networks (**macOS 26 only**) | `container network create mynet` |
85| volume | Create/list/inspect/remove persistent volumes | `container volume create data` |
86| builder | Manage the builder VM that runs `container build` (start/stop/status) | `container builder status` |
87| machine *(1.0.0+)* | Persistent Linux "machine" environments (added in 1.0.0) | `container machine --help` |
88
89Exact subcommand names, aliases, arguments, and flags for each group live in
90`references/commands.md` — consult it before running an unfamiliar command rather than
91guessing Docker-equivalent syntax.
92
93## Navigating this skill
94
95Read the reference file that matches the task; do not guess flags or behavior.
96
97- **`references/commands.md`** — exhaustive CLI reference: every command group, subcommand,
98 alias, argument, and flag. Read this to construct any concrete `container ...` invocation,
99 or to confirm a flag exists before using it.
100- **`references/concepts.md`** — architecture (VM-per-container, Containerization framework),
101 system requirements and macOS 15 vs 26 differences, networking model, per-container IPs,
102 security model, and a Docker-vs-`container` comparison. Read this to explain how or why
103 something works, or when a Docker mental model gives the wrong answer.
104- **`references/configuration.md`** — the system service, `config.toml` / property model,
105 default kernel, DNS domains, default registry, builder resources, and machine settings.
106 Read this to change defaults, tune CPU/memory, point at a private registry, or manage the
107 kernel.
108- **`references/workflows.md`** — copy-pasteable task recipes (run an image, build & push,
109 wire up local DNS, mount a volume, expose ports) and troubleshooting for common failures.
110 Read this first when the user wants to accomplish a concrete end-to-end task.
111
112## Key rules
113
114- **This is not Docker.** The CLI resembles Docker, but flags, defaults, and daemon behavior
115 differ. Verify syntax in `references/commands.md` instead of assuming Docker equivalence.
116- **Always ensure services are up first.** Run `container system start` (and confirm with
117 `container system status`) before any container/image/build command; connection errors
118 usually mean the services are stopped.
119- **Images are standard OCI artifacts** and interoperate with Docker registries and other OCI
120 tools. Image references that omit a registry default to `docker.io` (configurable via the
121 `registry.domain` property — see `references/configuration.md`).
122- **Each container gets its own IP address** on its network (one lightweight VM per
123 container). There is no shared Docker bridge; reach a container directly by its IP, or set
124 up a local DNS domain (`container system dns create ...`, admin required) for name-based
125 access.
126- **`container network` requires macOS 26.** On macOS 15 only the single default subnet is
127 available and the network command group is unavailable — see `references/concepts.md`.
128- **Use fully-qualified image references** when precision matters (e.g.
129 `docker.io/library/alpine` rather than bare `alpine`) to avoid ambiguity about the source
130 registry.