Skip to main content
Version: v3.8.0

Container engines

Edgelet routes all container operations through a single ContainerEngine interface. The process manager, reconciliation loop, and healthcheck runner behave the same regardless of engine. Selection is via containerEngine in config.

Supported values: edgelet, docker, podman.

Platform capability matrix​

PlatformcontainerEngine allowedDefaultEmbedded bundle
linuxedgelet, docker, podmanedgeletYes - extract when engine is edgelet
darwindocker, podmandockerNo
windowsdocker, podmandockerNo

Invalid pairings fail at config validation (for example edgelet on darwin/windows).

profiles:
production:
containerEngine: edgelet
containerEngineUrl: unix:///run/edgelet/containerd.sock
arch: auto
pruningFrequency: 24
watchdogEnabled: true

Use arch: auto, amd64, arm64, arm, or riscv64. Controller catalog images use archId for the same architecture set.

Engine selection​

ValuePlatformSocket / backend
edgeletlinux onlyEmbedded containerd at /run/edgelet/containerd.sock
dockerlinux, darwin, windowsHost Docker (containerEngineUrl, e.g. unix:///var/run/docker.sock)
podmanlinux, darwin, windowsHost Podman socket

No engine fallback: If docker or podman is configured, Edgelet does not switch to the embedded engine on failure.

On linux, if host Docker or Podman sockets are visible while containerEngine=edgelet, Edgelet logs an informational warning. It does not interfere with the host engine.

Path layout (edgelet engine)​

Isolated from host Docker/Podman installations:

PathPurpose
/usr/local/bin/edgeletThin download binary (linux): CLI + embed; systemd entry
/var/lib/edgelet/data/current/bin/edgeletFat runtime ELF (linux): daemon + in-process containerd
/var/lib/edgelet/data/current/bin/Shim (containerd-shim-runc-v2), crun, CNI multicall + symlinks
/var/lib/edgelet/User data (diskDirectory); workload volume data under volumes/data/
/var/lib/edgelet-containerd/Containerd images, snapshots, CNI state
/run/edgelet/containerd.sockContainerd API socket
/run/edgelet/edgelet.sockEdgeletAPI Unix socket

Private bridge network: edgelet0 (CIDR 172.18.0.0/16). Container name prefix: edgelet_.

Embedded containerd (linux, containerEngine: edgelet)​

Production starts via /usr/local/bin/edgelet daemon (thin). The thin process extracts the zstd bundle when needed, then execs /var/lib/edgelet/data/current/bin/edgelet daemon (fat). The fat binary runs the supervisor and in-process containerd.

Bundled runtimes (inside the extracted bin/ directory):

  • containerd-shim-runc-v2 - OCI shim
  • crun - default low-level runtime
  • CNI plugins: bridge, host-local, portmap, loopback

Containerd config roots (typical):

root = "/var/lib/edgelet-containerd/root"
state = "/var/lib/edgelet-containerd/state"
address = "/run/edgelet/containerd.sock"

On data-plane bootstrap, Edgelet runs stale runtime task cleanup under the state directory. Orphaned task directories missing a valid address file are removed. Image cache is preserved.

Docker and Podman (linux + desktop)​

Connect to an external engine. Docker and Podman support native OCI HEALTHCHECK; the in-agent healthcheck runner is edgelet engine only.

On linux, use systemd After=docker.service (or podman) when relying on an external engine at boot. The daemon retries socket connection before reporting engine-ready status.

If the socket is unavailable at start, the daemon continues in WARNING state and retries in the background until the engine connects.

RuntimeClass (edgelet engine only)​

Runtime extensions use EdgeletAPI deploy manifests:

  • apiVersion: edgelet.iofog.org/v1
  • kind: RuntimeClass
  • fields: metadata.name, handler

Built-in catalog handlers include spin, edgelet-wasmtime (WASM shim), and upstream wasmtime / wasmedge when the matching shim binary is on PATH.

Example WASM RuntimeClass:

apiVersion: edgelet.iofog.org/v1
kind: RuntimeClass
metadata:
name: edgelet-wasmtime
handler: edgelet-wasmtime

Pin a microservice: spec.container.runtime: edgelet-wasmtime (references metadata.name, not containerEngine).

Apply via CLI:

edgelet deploy -f runtimeclass.yaml
edgelet deploy -f runtimeclass.yaml --dry-run

Unsupported when containerEngine is docker or podman:

Error[INVALID_ARGUMENT]: runtimeclass is supported only when containerEngine=edgelet

Engine change behavior​

Changing containerEngine always recreates microservices. This is expected and unrelated to control-plane OTA workload continuity. See Troubleshooting for restart and cgroup notes.

See also​

Group 3See anything wrong with the document? Help us improve it!