Set up Podman discovery
How Scanopy discovers Podman containers and pods, via the local socket or a remote Podman API proxy.
Scanopy daemons discover Podman containers by connecting to the Podman API. On the daemon's own host that happens automatically; reaching a restricted API, or one on another machine, needs a proxy.
Before you start
Podman credentials are created under Assets > Credentials and can be pointed at Daemon hostRemote hosts.
Creating a credential, assigning it, and overriding it on an individual host work the same way for every integration — see Creating a credential, Where a credential applies, and Auto-assignment. This guide covers only what is specific to Podman.
What gets discovered
- Running containers, with their names and metadata
- Container networks and published port bindings, including automatically created bridge subnets
- Containerized services, identified from the API rather than from a port scan — so containers that publish nothing to the host are still detected
Containers appear as Podman Container services on their host. Pods are modeled as generic containers with each container in the pod attributed individually. The container-to-host relationship shows up in the Workloads perspective.
Discovery is local to one host: the daemon sees the containers on its own machine, or on the single host a proxy credential points at.
Prerequisites
-
Podman running on the host whose containers you want to discover
-
The API socket enabled — it isn't always running by default:
# Rootless (per-user socket at $XDG_RUNTIME_DIR/podman/podman.sock) systemctl --user start podman.socket # Rootful (system socket at /run/podman/podman.sock) sudo systemctl start podman.socket -
For proxied access, a TCP endpoint in front of that socket, reachable from the daemon
Rootless vs rootful. A rootless socket only sees that user's containers, and rootless networking may not expose a bridge subnet. Run the daemon (or the proxy) as the same user that owns the containers you want to discover, or use the rootful socket for host-wide visibility.
Choosing a credential type
| Credential type | How it connects | Can be targeted at | Requires daemon |
|---|---|---|---|
| Podman Proxy | Connects over TCP, optionally with TLS. | Daemon hostRemote hosts | 0.17.2 or later |
| Podman Socket | Connects via the daemon's local socket. | Daemon host | 0.17.2 or later |
| Situation | Use |
|---|---|
| Daemon runs on the Podman host and the socket is in a standard location | Nothing — the socket is auto-detected |
| Daemon runs on the Podman host, but the socket is elsewhere | Podman Socket |
| You want to restrict which API operations the daemon can call | Podman Proxy, with the proxy on the same host |
| Podman runs on a machine with no daemon | Podman Proxy, with the proxy on that machine |
Podman Proxy
A proxy in front of the socket lets you restrict which API operations are allowed, and lets a daemon reach Podman on a machine it isn't running on.
Any reverse proxy that forwards to the socket works — for example an nginx proxy mapping a TCP port onto /run/podman/podman.sock, optionally terminating TLS. To discover containers on a machine that runs no daemon: expose the endpoint there, create a Podman Proxy credential with its port, and assign it to the remote host. Containers are then reported as services on the remote host rather than on the daemon's host.
| Field | Required | Default | Description |
|---|---|---|---|
| Connection | |||
| Podman API Port | Optional | 2375 | Podman API port. Point at a TCP-exposed Podman service (e.g. `podman system service tcp:`) directly or behind a TLS proxy. |
| URL Path Prefix | Optional | None | Optional URL path prefix appended after the port |
| TLS | |||
| SSL Certificate | Optional | None | PEM-encoded client certificate. All three TLS fields (cert, key, CA chain) must be provided together. |
| SSL Private KeySecret | Optional | None | PEM private key. All three TLS fields must be provided together. |
| SSL CA Chain | Optional | None | PEM-encoded CA certificate chain. All three TLS fields must be provided together. |
The TLS fields apply to HTTPS endpoints only. Each can be entered inline or as a file path readable by the daemon.
Required API operations
Podman exposes a Docker-compatible API, and Scanopy uses that compatibility layer. Restrict the proxy to these endpoints:
| Endpoint | Method | Purpose |
|---|---|---|
/containers/json | GET | List running containers |
/containers/{id}/json | GET | Get container details (ports, networks, config) |
/networks | GET | List networks for subnet discovery |
/exec/{id}/json | GET | Check exec instance status |
/containers/{id}/exec | POST | Create exec instance for endpoint probing |
/exec/{id}/start | POST | Start exec to probe HTTP endpoints inside containers |
Why exec? Scanopy uses exec to probe HTTP endpoints from inside containers that don't publish ports to the host. Without exec access, containers are still discovered but service detection is less accurate.
Podman Socket
The daemon connects directly to the Podman socket on its own host, automatically, whenever it's accessible. It looks in this order:
- The
CONTAINER_HOSTenvironment variable, when it points at aunix://socket path - The rootful socket:
/run/podman/podman.sock - The rootless socket:
$XDG_RUNTIME_DIR/podman/podman.sock
Create a Podman Socket credential only when your socket is somewhere else — its path overrides the auto-detection above.
| Field | Required | Default | Description |
|---|---|---|---|
| Socket Path | Optional | None | Path to the Podman Unix socket. Leave blank to auto-detect (rootful /run/podman/podman.sock or the rootless $XDG_RUNTIME_DIR/podman/podman.sock). |
Because the socket is reachable only over the daemon's own loopback, this credential type can be assigned to a daemon host and nowhere else.
Verifying it works
- Go to Discover > Scan > Scheduled and run a discovery, or wait for the next scheduled run
- Open the host running Podman and go to its Services tab
- Look for Podman Container services, each with its published ports
- Open the Workloads perspective and confirm the containers appear nested under their host
Troubleshooting
No containers discovered
- Confirm the API socket is running:
systemctl --user status podman.socket(rootless) orsudo systemctl status podman.socket(rootful) - Confirm the daemon can see the socket path — check
CONTAINER_HOST,/run/podman/podman.sock, and$XDG_RUNTIME_DIR/podman/podman.sock - If the daemon and the containers run under different users, the rootless socket won't expose them — run both as the same user, or use the rootful socket
"Connection refused" to a proxy
- Verify the proxy is running and listening on the expected port
- Ensure the daemon can reach it — same network, or an exposed port
- Check the proxy forwards to a valid Podman socket path
SSL certificate errors
- Verify certificate paths are correct and mounted
- Check the certificate is valid:
openssl x509 -in /certs/client-cert.pem -text -noout - Include the CA chain if using self-signed certs
- Check that the cert and key aren't swapped
For diagnosing credential loading and file read or PEM errors from daemon logs, see Credential troubleshooting.
Set up Docker discovery
How Scanopy discovers Docker containers — the default local socket, plus using a socket proxy for restricted access or remote hosts.
Scanning Isolated Networks from One Host
How to run multiple Scanopy daemon instances on a single machine, each scanning different isolated networks or interfaces.