Skip to main content
The Odigos VM Agent is available as part of Odigos Pro. For access and licensing details, contact us.
The Docker deployment is the same Odigos VM Agent packaged as a privileged container instead of an RPM/deb system package. It is meant for hosts where installing a system package is not an option — immutable hosts, or fleets that are managed entirely with Docker Compose.

How it works

One agent container runs per host. Through the host’s PID namespace and the Docker socket, it discovers and instruments the host’s Docker containers, systemd services, and regular Linux processes with eBPF, and runs the odigos-otelcol collector as a supervised child process (see How the collector runs). Host systemd services are still first-class targets: languages that attach directly (Go, C++, Java, OBI) need no systemctl, while env-injection languages (Python, Node.js, .NET, PHP, Ruby) get a unit drop-in written to the host’s /etc/systemd/system and are restarted with the host’s systemctl, which the agent runs by entering the host’s namespaces with nsenter.

How the collector runs

In the package installation, the agent and collector are separate systemd units (odigos-vmagent.service and odigos-otelcol.service). In the Docker deployment there is no systemd inside the container, so the model is different:
  • The agent process starts odigos-otelcol as a supervised child process when the container starts.
  • The collector’s lifecycle is tied to the container: stopping or restarting odigos-vmagent stops or restarts the collector with it. There is no systemctl start/stop odigos-otelcol equivalent.
  • Agent and collector share the container’s stdout (console format, same as the package install). Use docker logs odigos-vmagent to view both.
  • With --network host, the collector listens on the host’s network namespace, so instrumented workloads on the same host can reach it on localhost.
Collector configuration (receivers, exporters, processors, profiling, and so on) is still managed through Odigos Central or odictl, the same as the package install. systemd memory limits do not apply here — use Docker resource limits (for example Compose deploy.resources or docker run --memory) if you need to cap the container.

Requirements

Odigos eBPF-based data collection requires, at minimum, platforms that have underlying Linux kernel versions of 5.4.0.The required Linux capabilities depend on your kernel version:
  • Kernel 5.4 – 5.7: requires CAP_SYS_ADMIN.
  • Kernel 5.8 and later: requires CAP_BPF and CAP_SYS_PTRACE.
We recommend running on kernel 5.8 or later when possible, as the more granular capabilities (CAP_BPF and CAP_SYS_PTRACE) follow the principle of least privilege compared to CAP_SYS_ADMIN.
  • An Odigos Pro license token for the VM Agent.
  • A Linux host — the agent instruments the host it runs on.
  • Docker installed and running, with permission to start privileged containers.
  • Ability to grant the required permissions (privileged container, host namespaces, and host mounts). Review that section before deploying — these are hard requirements and cannot be relaxed.
  • The Odigos VM Agent container image.
    Obtain the image from your Odigos support team.

Step 1: One-time host setup

Create the agent’s config directory on the host before starting the container. It persists the agent’s identity and configuration across container upgrades:

Step 2: Run the agent

After Step 1, start the agent with the compose.yml bundled with the distribution:
Once the container is running, confirm the agent and collector are healthy:

Configuration

The agent is configured entirely through environment variables at startup: Everything else — sources, destinations, actions, and instrumentation rules — is managed from Odigos Central or with odictl, exactly as in the package deployment:
The config tree is persisted on the host at /etc/odigos-vmagent, so the agent keeps its deployment identity and configuration across container upgrades. Values written to config.yaml take precedence over the environment-derived defaults on later boots.
Pre-provisioning license.jwt in /etc/odigos-vmagent is an alternative to ODIGOS_ONPREM_TOKEN. When the token variable is set, it is the source of truth and overwrites an out-of-date license file.

Connecting to Odigos Central

Unlike the package install (which connects through odictl/config.yaml and a systemctl restart), the container connects to Central via the ODIGOS_CENTRAL_ENDPOINT environment variable set at startup — the endpoint must be reachable from the host. To learn more about Central, see Connecting VM Agent.

Required permissions

The agent runs as a privileged container with host namespaces and several host mounts. Each is required for a specific capability:

Upgrade

Pull the new image and recreate the container. The persisted /etc/odigos-vmagent directory preserves the agent’s identity and configuration across the upgrade.

Uninstall

To fully remove the deployment, also drop the persisted identity and configuration:

Troubleshooting

How to view the logs

The agent and the odigos-otelcol collector share the container’s stdout in console format (same as the package install). Follow the live log stream:

How to inspect or configure a running agent

Use odictl inside the container the same way you would on a package install — list sources, add destinations, inspect instrumentation status, and so on:
Config changes are written under /etc/odigos-vmagent on the host and persist across container restarts.

Why do container processes show up as regular processes?

The agent classifies a process as a Docker container by reading /proc/<pid>/cgroup and mapping it to a container id. That mapping only works when the agent shares the host’s cgroup namespace. If you started the container without --cgroupns host (cgroup: host in Compose), every container process is misclassified as a regular process. Recreate the container with the setting from Step 2 (see also Required permissions).

Why are systemd services in env-injection languages not instrumented?

Direct-attach languages (Go, C++, Java, OBI) do not need systemd drop-ins and still work without the mount. Env-injection languages (Python, Node.js, .NET, PHP, Ruby) need a unit drop-in written to the host’s /etc/systemd/system so the host’s systemd picks up the instrumentation environment and restarts the service. If those services are not instrumented on a systemd host, the container is almost certainly missing the /etc/systemd/system volume mount. Recreate the container with the mount from Step 2. Omit the mount only on hosts that do not use systemd.