> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aiaxoniq.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Onboarding: Docker

> Containers on one or a few hosts — a Collector per host, container telemetry for free, and the settings that are painful to change later.

For containerised services on one or a handful of hosts, with Docker or Docker
Compose.

<Info>
  **Roughly twenty minutes to first data**, an afternoon to something useful.
</Info>

## The shape

**One Collector per host**, not one per service. It gathers container and host
telemetry itself, and your application containers export to it rather than
directly to aiAxonIQ.

<Note>
  **Why not export straight from each container?** Three reasons that all
  arrive eventually:

  * Each container would carry the license key. One Collector means one place
    holding the credential.
  * Each would be its own exporter, and dozens of small exporters hit the
    request rate limit that one batching Collector does not.
  * Filtering, redaction and sampling would have to be configured per service
    instead of once.

  A single container on one host is the exception where direct export is
  reasonable.
</Note>

## Day one

<Steps>
  <Step title="Prove the path">
    [Quickstart](/get-started/quickstart) — ten minutes, `curl` only. Do this
    from one of the hosts that will run the Collector, so egress is proven at
    the same time.
  </Step>

  <Step title="Agree service names and environments">
    Before sending anything. `service.name` identical across environments,
    separated by `deployment.environment`. See
    [Resource attributes](/send-data/otel/resource-attributes#naming-services).
  </Step>

  <Step title="Run a Collector">
    [Docker](/send-data/platforms/docker) for a standalone container, or
    [Docker Compose](/send-data/platforms/docker-compose) to add it as a
    service in an existing stack.

    You immediately get host metrics and per-container resource usage, with no
    change to any application.
  </Step>

  <Step title="Point one application at it">
    ```bash theme={null}
    OTEL_SERVICE_NAME=checkout-api
    OTEL_RESOURCE_ATTRIBUTES=deployment.environment=production
    OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
    ```

    Note there is no license key here — the Collector holds it. Application
    containers only need to reach the Collector.
  </Step>

  <Step title="Verify">
    Services, Traces and Infrastructure should all have something in them
    within a minute. See [Verify your data arrived](/get-started/verify-data).
  </Step>
</Steps>

## Container logs

Two routes, and the choice matters:

| Route                                  | Gets you                                                   | Cost                             |
| :------------------------------------- | :--------------------------------------------------------- | :------------------------------- |
| **Application exports logs over OTLP** | Logs carrying trace ids, clickable from a span             | A logging bridge in each service |
| **Collector tails container logs**     | Every container's stdout, including ones you cannot change | No trace correlation             |

<Note>
  **Most estates want both.** Tail everything so nothing is invisible, and add
  the OpenTelemetry logging bridge to the services you actually debug — those
  are the ones where trace correlation pays.
</Note>

## Settings that are painful to change later

<Warning>
  **The Collector's endpoint name.** Application containers reference it by
  service name on the Docker network. Renaming it later means touching every
  service's environment. Pick a name you will not want to change.
</Warning>

<Warning>
  **`deployment.environment`, on everything, from the start.** Retagging after
  the fact means every chart loses continuity at the point you changed it.
</Warning>

## The Collector must not be a single point of failure

<Warning>
  **If the Collector is down, telemetry from that host is lost.** Applications
  export to it, not through it to somewhere durable.

  Two mitigations, both cheap:

  * **Restart policy.** `restart: unless-stopped`, so it comes back with the
    host.
  * **A sending queue**, so a brief aiAxonIQ or network blip is buffered rather
    than dropped. See [Exporters](/send-data/otel/exporters#when-aiaxoniq-is-unreachable).

  Then monitor the Collector itself — scrape its own metrics and send them
  along. A silently failing Collector looks exactly like an application that
  stopped receiving traffic.
</Warning>

## Week one

<AccordionGroup>
  <Accordion title="Filter health checks at the Collector" icon="filter">
    Usually the single largest volume reduction available, and it costs you
    nothing you would have read. See
    [Collector configuration](/send-data/otel/collector-config).
  </Accordion>

  <Accordion title="Add an absence alert" icon="bell">
    The rule that catches a Collector that stopped. No threshold on the data
    itself can detect data that is not arriving. See
    [Alerting](/guides/alerts/overview).
  </Accordion>

  <Accordion title="Add a synthetic check" icon="heart-pulse">
    Reachability from outside your network — the only signal that does not
    depend on your code having run. See
    [Synthetic monitoring](/guides/synthetics/overview).
  </Accordion>

  <Accordion title="Consider the eBPF agent for what you cannot instrument" icon="wand-magic-sparkles">
    Vendor images, legacy containers and services nobody owns become visible
    with no code change. Early access — see
    [zero-code instrumentation](/zero-code/docker).
  </Accordion>
</AccordionGroup>

## When you outgrow this

More than a handful of hosts, and per-host Collector configuration becomes the
thing you maintain. That is the point at which a two-tier setup — an agent per
host forwarding to a shared gateway — earns its complexity. It is also
Kubernetes' default shape; see [Onboarding: Kubernetes](/onboarding/kubernetes).

## Next

<CardGroup cols={3}>
  <Card title="Docker install" icon="docker" href="/send-data/platforms/docker">
    The working configuration.
  </Card>

  <Card title="Collector configuration" icon="server" href="/send-data/otel/collector-config">
    Receivers, processors and exporters.
  </Card>

  <Card title="Full SaaS journey" icon="cloud" href="/onboarding/saas">
    Alerting, dashboards, roles and usage.
  </Card>
</CardGroup>
