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.