Docker
Start, stop, log and shell into containers from the panel
palupdated 2026-10-27DeveloperIn pal's registry
In pal's registry: the button shows it in pal, which asks before installing; the command does the same from a terminal. This page can't see what your pal has installed.





What it does
Your Docker containers, images and Compose projects in one list: start and stop containers, read their logs in the panel, or open a shell in a terminal.
- Every container, running ones first, with its image, ports and state;
cmd+ishows it as a page enterstarts or stops a container (stopping asks first)cmd+lshows its recent logs in the panel;cmd+topens a shell in a terminal- Run an image with an optional name and ports
- Compose projects: up, down, restart, logs, open the folder
- Works with Podman too (a setting)
Palettes 3
-
Docker Containers
dockerliveEvery container, running first: start, stop, restart, logs, a shell, remove.
- ↵Stop a running container, start a stopped one
- ⌘LLogs (the line count typed in the bar; 200 when blank)
- ⌘TShell in a terminal, or the command typed in the bar
- ⌘⇧RRestart
- ⌘DRemove
- ⌘CCopy id
-
Docker Images
imagesliveLocal images: run one (name and ports typed in the bar), remove, copy the id.
- ↵Run, with the name and ports typed in the bar (both optional)
- ⌘CCopy id
- ⌘DRemove
-
Compose Projects
composeliveCompose projects docker knows of: up, down, restart, logs.
- ↵Up
- ⌘LLogs
- ⌘⇧RRestart
- ⌘DDown
- ⌘OOpen project folder
Actions
- StopA running container; asks first.↵
- StartA stopped container.↵
- LogsThe last 200 lines (or the count typed in the bar), stdout and stderr, in the panel.⌘L
- ShellA terminal running docker exec (bash when the image has it, sh otherwise), or the command typed in the bar, kept open until Enter.⌘T
- Restart⌘⇧R
- Removedocker rm -f, docker rmi or compose down; asks first.⌘D
- Copy id⌘C
- RunAn image: the bar takes a name and host:container ports (both optional, comma separated ports), then docker run -d.↵
- UpA Compose project: compose up -d.↵
- DownStops and removes the project's containers and networks; asks first.⌘D
- Open project folder⌘O
Settings
Extension, [extensions.docker]
binaryThe CLI to run: docker, or podman (its docker-compatible commands are what is used).
ttlSeconds a listing stays good for: the palettes list again on show only once the rows are older than this. Read when the extension loads.
terminalWhich terminal Shell opens. Auto picks the first installed of kitty, Ghostty, Alacritty, iTerm2, Terminal. On Linux $TERMINAL, else kitty, foot, alacritty, xterm. One of auto, kitty, Terminal, iTerm2, Ghostty, Alacritty.
Defaults shown. Change them in pal's settings window or in the config file.
The README
Everything Docker does, key by key, from the extension's own README.md
Docker
Three live palettes over the docker CLI (docker ps -a, docker images,
docker compose ls -a, each with --format '{{json .}}'), listed again
when the panel shows once their rows are older than ttl. Podman works
through the same commands: set binary to podman, or install its
docker alias. Without the binary, or with the daemon not answering, each
palette is one inert hint row that says which.
Palettes
Docker Containers (docker): every container, the running ones first
in a Running section, the rest under Stopped. The row is the container's
name, its image the subtitle; on the right the published ports, compact
(80, 443; 8080:80 when host and container differ; a stopped one's
status, Exited (0) 3 days ago, instead) and a state tag (running green,
exited grey, paused and restarting amber, created blue, dead red). The id,
the image and the Compose project are keywords, so nginx or the project
name finds the container from the root. The detail pane leads with the
Compose project and image, the name, the state and docker's status as
chips, then lists id, command, created, ports, mounts and networks.
Docker Images (images): repository:tag (the id for an untagged
image), the id as subtitle, size and age on the right. While the cursor
is on an image the search bar shows two fields after the query, the name
and the ports (host:container pairs, comma separated; Tab into them),
both optional: Enter runs docker run -d [--name] [-p …] <image>; a
malformed port is refused under the field. A pick that arrives without
the fields (a hotkey, a bare pal run) asks for them in a form instead.
Compose Projects (compose): every project docker knows of, its
folder as subtitle, its containers' states as one tag (4 running, 1 exited; running green, a mix amber, exited grey). Every config file of the project is passed with -f.
A command keeps the panel open and lists again, with a toast naming what
happened. A command still running after 8 s (a stop whose process
ignores SIGTERM, a compose up that pulls) is left to finish on its own
and the toast says so; cmd+r later shows the outcome. A failed command
keeps the panel open with docker's last stderr line.
Keyboard
Containers:
| keys | action |
|---|---|
enter |
Stop a running container (asks first), Start a stopped one |
cmd+l |
Logs: docker logs --tail <lines>, stdout and stderr, in the panel; argument lines from the bar (200 when blank) |
cmd+t |
Shell: a terminal running docker exec -it <id> (bash when the image has it, sh otherwise); argument command from the bar runs that instead, the window kept until Enter; running containers only |
cmd+shift+r |
Restart |
cmd+d |
Remove: docker rm -f, after a confirm |
cmd+c |
Copy the short id |
Images:
| keys | action |
|---|---|
enter |
Run: arguments name (docker picks one when blank) and ports (8080:80, 443:443), then docker run -d |
cmd+c |
Copy id |
cmd+d |
Remove: docker rmi, after a confirm |
Compose projects:
| keys | action |
|---|---|
enter |
Up: compose up -d |
cmd+l |
Logs: compose logs --tail 200 |
cmd+shift+r |
Restart |
cmd+d |
Down, after a confirm |
cmd+o |
Open the project folder |
Marked rows (cmd-click, shift-click, shift+↓): containers start,
stop, restart and remove together and copy their ids one per line (a
running row carries Start at its end and a stopped one Stop, so a mix can
go either way); images remove and copy together; Compose projects go up,
down or restart one after another and their folders open together. Logs,
Shell and Run stay one row's.
Setup
Docker (or Podman) installed and its daemon running; the CLI is looked up on PATH. Nothing else.
Which terminal Shell opens: on macOS the terminal setting (auto takes
the first installed of kitty, Ghostty, Alacritty, iTerm2, Terminal);
Terminal and iTerm2 are driven through AppleScript, so the first Shell
into one of them asks for the Automation permission once. On Linux
$TERMINAL, else the first of kitty, foot, alacritty, xterm on PATH.
Settings, [extensions.docker]:
| key | type | default | what |
|---|---|---|---|
binary |
text | docker |
The CLI to run; podman works. |
ttl |
number (s) | 10 |
How long a listing stays good for before a show lists again. Read when the extension loads. |
terminal |
auto, kitty, Terminal, iTerm2, Ghostty, Alacritty |
auto |
macOS only: which terminal Shell opens. |
What it does not do
- Pull, build or push: only what is already on the machine is listed.
- Remote hosts and contexts beyond what the CLI's own default context points at.
- Stream logs: Logs is a snapshot of the last 200 lines (or the count in
the bar), read again on the next
cmd+l. - Wait for a slow command: after 8 s it goes on alone and the toast says so.
Platforms
macOS and Linux. The terminal for Shell is chosen per platform as above; everything else is the same CLI on both.