Erst der Cache, dann der Shop
Ein Shop braucht einen Webserver und einen Cache. Jeden von Hand zu starten heißt, lange Befehle zu tippen, in der richtigen Reihenfolge, mit den richtigen Namen.
Beim dritten Mal startet jemand sie falsch herum. Eine einzige Datei kann es einmal sagen, für alle.
Am Ende dieser Lektion
Notiz
Ich kann zwei zusammenarbeitende Dienste in einer Compose-Datei beschreiben.
Schlüsselbegriffe
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Dienst | ein Programm einer Compose-Datei, in einem oder mehreren Containern | |
| Compose-Datei | eine Textdatei, die Dienste und ihre Verbindungen beschreibt | |
| Veröffentlichter Port | eine Tür des Containers, auf dem Host geöffnet | 8080:80 |
| Depends on | eine Regel: Ein Dienst wartet auf einen anderen | |
| Health-Check | ein Test, den Docker wiederholt, um zu sehen, ob ein Dienst antwortet |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Was das Lab nicht kann
Notiz
Das Terminal des Labs hat keinen Befehl docker compose. Das Lab hat seine drei Dienste aus einer Compose-Datei gestartet, die Sie mit Datei bearbeiten öffnen können. Die Datei dieser Lektion haben wir auf unserem Rechner ausgeführt. Sie lesen sie, sehen, was die des Labs getan hat, und prüfen die Startreihenfolge in der Aufgabe.
Eine Datei beschreibt alle Dienste
Unter services: hat jeder Dienst einen Namen und das Image, das er ausführt. Weitere Schlüssel sagen, wie er verbunden ist: seine Türen, seine Einstellungen, das Volume, das er behält, und worauf er wartet.
docker compose up liest die Datei und startet alles in der richtigen Reihenfolge. Hier sind ein Webserver und ein Cache.
Zwei Dienste in einer Compose-Datei
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
environment:
CACHE_HOST: cache
depends_on:
cache:
condition: service_healthy
cache:
image: valkey/valkey:8.1-alpine
healthcheck:
test: ["CMD", "valkey-cli", "ping"]
interval: 3s
volumes:
- cache-data:/data
volumes:
cache-data:
Den Cache über seinen Dienstnamen finden
docker exec web getent hosts cacheHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Sehen, welcher Dienst wann startete
docker inspect --format '{{.Name}} {{.State.StartedAt}}' web cache workerHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Beispiel: was jeder Schlüssel tut
| Schlüssel | Was er tut | Was wir sahen |
|---|---|---|
| image | sagt, welches Image läuft | das Lab führt nginx und valkey aus |
| depends_on | lässt einen Dienst auf einen anderen warten | im Lab startete worker einige Sekunden nach web und cache |
| healthcheck | sagt Docker, wie ein Dienst zu testen ist | cache antwortet auf valkey-cli ping, ist also healthy |
| environment | gibt dem Programm eine Einstellung | printenv CACHE_HOST zeigte cache |
| volumes | behält einen Ordner außerhalb des Containers | cache-data bleibt, wenn die Dienste entfernt werden |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein veröffentlichter Port öffnet eine Tür
Im Netz erreichen sich die Dienste über ihren Namen. Ein Besucher auf dem Host braucht eine Tür.
"8080:80" heißt: Port 8080 des Hosts führt zu Port 80 im Container. Die Seite des Hosts steht zuerst. Auf unserem Rechner antwortete curl http://localhost:8080 mit 200. Das web des Labs hat keinen veröffentlichten Port: Nur andere Dienste und die Öffnen-Schaltfläche des Labs erreichen es.
Ein häufiger Irrtum
Warnung
Viele glauben, depends_on warte, bis das andere Programm bereit ist. Allein wartet es nur, bis der andere Container gestartet ist. Geben Sie dem anderen Dienst einen Health-Check und nutzen Sie condition: service_healthy. Dann startet web erst, wenn der Cache antwortet.
Ist der geteilte Ordner in web beschreibbar?
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' webHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Und in worker?
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' workerHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Weiterführend
Fügen Sie der Beispieldatei einen dritten Dienst hinzu: einen worker, der von web und cache abhängt. Schreiben Sie nur seine drei Zeilen: den Namen, ein Image und sein depends_on.
Überlegen Sie dann, in welcher Reihenfolge Compose die drei startet. Die Aufgabe stellt dieselbe Frage für jede Liste.