Container benennen und mit Labels strukturieren

Container benennen und mit Labels strukturieren

Zufällige Container-Namen wie angry_einstein mögen amüsant sein — in produktiven Umgebungen braucht man vorhersehbare Namen und strukturierte Metadaten.

Container benennen

docker run --name myapp nginx
docker run --name postgres-prod postgres:16

Ein expliziter Name hat direkte Vorteile:

docker logs myapp              # Statt ID oder Zufallsname
docker exec -it myapp bash
docker stop myapp && docker start myapp
docker inspect myapp

In Compose wird der Name automatisch aus Projektname + Service-Name gebildet (projekt_app_1). Mit container_name setzt man einen festen Namen:

services:
  app:
    image: myapp
    container_name: myapp-prod    # Fest, vorhersehbar

Vorsicht: Feste Namen verhindern mehrere Instanzen des gleichen Service — für Skalierung (--scale app=3) lieber keinen festen Namen setzen.

Labels: Metadaten für Container

Labels sind Key-Value-Paare, die man Containern, Images, Volumes und Netzwerken anhängen kann.

Beim Start:

docker run -l environment=production -l team=backend myapp
docker run --label version=2.1.0 --label maintainer=ops@example.com myapp

Im Dockerfile:

LABEL maintainer="ops@example.com"
LABEL version="2.1.0"
LABEL environment="production"
LABEL git.commit="a3b2c1d"
LABEL org.opencontainers.image.source="https://github.com/example/myapp"

In Compose:

services:
  app:
    image: myapp
    labels:
      environment: production
      team: backend
      version: "2.1.0"

Nach Labels filtern

docker ps --filter label=environment=production
docker ps --filter label=team=backend
docker ps --filter label=environment              # Alle mit diesem Label (egal welcher Wert)
docker images --filter label=maintainer=ops@example.com

Alle Produktions-Container stoppen:

docker ps -q --filter label=environment=production | xargs docker stop

Compose-Labels

Docker Compose setzt automatisch Labels auf jeden Container:

com.docker.compose.project=myproject
com.docker.compose.service=app
com.docker.compose.version=2.24.0

Das ermöglicht Stack-weites Filtern:

docker ps --filter label=com.docker.compose.project=myproject

Label-Schema-Konventionen

Für Teams und Tooling empfiehlt sich eine konsistente Namensgebung:

# OCI-Standard (empfohlen)
LABEL org.opencontainers.image.title="My App"
LABEL org.opencontainers.image.version="1.2.3"
LABEL org.opencontainers.image.created="2024-01-15T10:00:00Z"
LABEL org.opencontainers.image.source="https://github.com/example/myapp"
LABEL org.opencontainers.image.revision="a3b2c1d4e5f6"

# Eigenes Schema
LABEL com.example.team="backend"
LABEL com.example.environment="production"
LABEL com.example.component="api"

Reverse-DNS-Schema (com.example.key) verhindert Namenskollisionen mit Docker-internen Labels.

Labels in Tools nutzen

Portainer, Dozzle und andere Management-Tools lesen Labels automatisch aus und zeigen sie in ihrer UI an. Traefik nutzt Labels zur Service-Konfiguration.

# Alle Labels eines Containers
docker inspect --format='{{json .Config.Labels}}' myapp | jq

# Einzelnes Label
docker inspect --format='{{index .Config.Labels "environment"}}' myapp

Namen und Labels kosten nichts, sparen aber erheblich Zeit bei der Suche nach dem richtigen Container in einer Umgebung mit dutzenden laufenden Diensten.