A lightweight terminal UI for Docker container management, built for speed over remote SSH connections
containerctl removes the friction from managing containers over SSH.
It’s a lightweight CLI that lets you instantly inspect, control, and tail logs from containers — perfect for remote servers where you want speed, not tooling overhead.
It sits as a thin layer between the tview TUI framework and the Moby Docker client. It supports connecting to a remote Docker Engine API directly over SSH, so you can manage containers on a remote host without SSHing in manually.
The default view lists all containers on the connected host. Select a container with the arrow keys, then:
- Press
lto stream its logs in real time. - Press
tto open an interactive shell session inside the container. This is also the preferred way to explore a running container's filesystem. Exit the shell as usual withexit. - Press
fto browse the filesystem without a shell — useful for stopped containers or distroless images that have no shell. The view reads only the tar headers of the container's filesystem, so no data is extracted. Navigate into directories withEnteror use..to go up. - Press
s/xto start or stop a container, orp/uto pause or unpause it.
Press Esc from any sub-view to return to the container list, or q to quit.
When --host is provided, containerctl connects to the remote Docker Engine API over SSH, tunneling all API calls through the connection. No manual SSH session is needed.
The SSH behavior is designed to mirror OpenSSH: ~/.ssh/config is read and its values take precedence over command-line arguments. Host keys are verified against ~/.ssh/known_hosts. Authentication follows the same order as OpenSSH — password prompt, SSH agent (SSH_AUTH_SOCK), or a private key file, with a passphrase prompt if the key is encrypted.
# Connect to local Docker
containerctl
# Connect to remote host using default SSH settings
containerctl --host my-host
# Connect to remote host using with SSH key
containerctl --host my-host:23 --identity-file ~/.ssh/id_rsa
# Connect to remote host with username embedded in host and password prompted
containerctl --host username@my-host --ask-password trueDownload the binary for your platform from the releases page.
VERSION=v0.5.1 # replace with the desired version
curl -LO https://github.com/Br0ce/containerctl/releases/download/${VERSION}/containerctl-${VERSION}-darwin-arm64
# Verify the checksum against the value published on the releases page
shasum -a 256 containerctl-${VERSION}-darwin-arm64
chmod +x containerctl-${VERSION}-darwin-arm64
sudo mv containerctl-${VERSION}-darwin-arm64 /usr/local/bin/containerctl
containerctl --versionVERSION=v0.5.1 # replace with the desired version
curl -LO https://github.com/Br0ce/containerctl/releases/download/${VERSION}/containerctl-${VERSION}-linux-amd64
# Verify the checksum against the value published on the releases page
sha256sum containerctl-${VERSION}-linux-amd64
chmod +x containerctl-${VERSION}-linux-amd64
sudo mv containerctl-${VERSION}-linux-amd64 /usr/local/bin/containerctl
containerctl --versionRequirements
- Go 1.26+
git clone https://github.com/Br0ce/containerctl.git
cd containerctl
make buildThe binary will be placed at ./bin/containerctl.
./bin/containerctl
# or
make runInstall dependencies and tooling:
make setupAvailable make targets:
| Target | Description |
|---|---|
build |
Build the binary to ./bin/ |
run |
Run directly via go run |
test |
Run tests (short, parallel) |
test-v |
Run tests with verbose output |
test-race |
Run tests with race detector |
lint |
Run golangci-lint |
format |
Format code with go fmt |
tidy |
Tidy and vendor dependencies |
clean |
Remove build artifacts |
Apache 2.0 — see LICENSE.