TubeSum ← Transcribe a video

Video JmuNz2jT2D8

0h 17m video Transcribed May 27, 2026 Watch on YouTube ↗
Beginner 4 min read For: Developers new to Docker who want to learn how to manage multi-container applications.

AI Summary

This video introduces Docker Compose as a tool to simplify managing multi-container applications. Instead of running multiple long Docker commands, you define all services in a single YAML file and control them with one command. The tutorial demonstrates creating a compose.yaml, starting/stopping services, viewing logs, and executing commands inside containers.

[00:00]
Problem with multiple containers

Running multiple containers (web server, database, backend, cache) requires repeating long docker run commands with environment variables, becoming messy.

[00:57]
Docker Compose solution

Docker Compose lets you define all services, their configuration, and communication in a single YAML file, simplifying workflow.

[01:26]
Creating compose.yaml

Create a folder and a compose.yaml file (preferred name). Use a code editor like VSCode for syntax help.

[02:55]
Structure of compose.yaml

Each compose file has a 'services' block. Under it, list each container/service with properties like image, ports, container_name, restart policy.

[05:16]
Defining multiple services

Example: two Nginx services (web-server and web-server2) with different images, ports, and container names.

[07:03]
Starting services with docker-compose up

Use 'docker-compose up -d' to start all services in detached mode. Without -d, logs appear in terminal.

[08:15]
Stopping and cleaning up

'docker-compose down' stops and removes containers and the network. 'docker-compose stop' only stops containers; 'docker-compose start' restarts them.

[09:36]
Using -f flag for custom file path

Use 'docker-compose -f path/to/compose.yaml up -d' to specify a compose file in a different directory.

[10:48]
Viewing logs

'docker-compose logs' shows logs of all services. Add service name for specific logs. Use '-f' to follow logs live, '--tail' to show last N lines.

[12:36]
Executing commands in containers

'docker-compose exec service_name command' runs a command inside a running container. Use '-it' with bash/sh for interactive shell.

[15:34]
Debugging tip

If a container fails to start, first check logs with 'docker-compose logs service_name'.

Docker Compose streamlines multi-container management by defining everything in a YAML file. Mastering compose.yaml, logs, and exec commands is essential for efficient container orchestration.

Clickbait Check

95% Legit

"Title accurately reflects the tutorial content; it delivers exactly what it promises."

Mentioned in this Video

Tutorial Checklist

1 01:26 Create a folder for your project and navigate into it.
2 01:48 Create a file named compose.yaml (or docker-compose.yaml) in that folder.
3 02:55 Open compose.yaml and start with 'services:' block.
4 03:19 Define a service (e.g., web-server) with indentation (2 spaces) and set properties: image, ports, container_name, restart.
5 05:16 Optionally add more services (e.g., web-server2) with different configurations.
6 07:03 Run 'docker-compose up -d' to start all services in detached mode.
7 08:15 Use 'docker-compose down' to stop and remove containers and network.
8 10:48 View logs with 'docker-compose logs [service_name]' and use '-f' to follow or '--tail N' for last N lines.
9 12:36 Execute commands inside a container with 'docker-compose exec service_name command'.
10 13:46 Open an interactive shell with 'docker-compose exec -it service_name bash' (or sh if bash not available).

Study Flashcards (9)

What is the main purpose of Docker Compose?

easy Click to reveal answer

To define and manage multi-container applications using a single YAML file.

00:57

What are the two accepted filenames for a Docker Compose file?

easy Click to reveal answer

compose.yaml and docker-compose.yaml (compose.yaml is preferred).

01:26

What does the 'ports' property in a compose file correspond to in a docker run command?

medium Click to reveal answer

The -p flag for port mapping.

04:11

What does the 'restart: unless-stopped' policy do?

medium Click to reveal answer

It ensures the container automatically starts when Docker restarts, unless it was manually stopped.

05:01

What is the difference between 'docker-compose down' and 'docker-compose stop'?

hard Click to reveal answer

'docker-compose down' stops and removes containers and the network; 'docker-compose stop' only stops containers (they remain).

08:15

How do you specify a custom path for the compose file?

medium Click to reveal answer

Use the -f flag: 'docker-compose -f path/to/compose.yaml up -d'.

09:53

Which command shows live logs from a specific service?

medium Click to reveal answer

'docker-compose logs -f service_name'

11:20

What flags are used to get an interactive shell inside a container with docker-compose exec?

hard Click to reveal answer

-it (interactive and TTY) along with bash or sh.

13:46

What is the first step to debug a container that fails to start?

easy Click to reveal answer

Check the logs with 'docker-compose logs service_name'.

16:32

🔥 Best Moments

💡

The 'aha' moment for Docker Compose

Clearly explains why Docker Compose is needed: replacing multiple complex commands with a single YAML file.

00:57
💡

Key difference between down and stop

Clarifies a common confusion: down removes containers and network, stop only halts them.

08:15
🤯

Debugging tip quiz

Interactive quiz reinforces the most important debugging step: check logs first.

16:32

Full Transcript

Download .txt

[00:00] Willkommen zurück. Zuletzt haben wir Docker InstaDios und unseren ersten Container gestartet. Im folgenden gehen wir einen Schritt weiter und lernen Docker Compose kennen, das den Boardflow vereinfacht.

[00:15] Zuletzt haben wir einen Nginx-Container mit einem längeren Befehl gestartet. Also sudo docker run-d-p 8081 zu 80 name mein Web-Server Nginx 1.29.

[00:31] Das ist noch einigermaßen übersichtlich. Aber was, wenn wir nicht nur einen Web-Server, sondern auch eine Datenbank, ein Backend und vielleicht noch einen Cache-Container für unsere Anwendung benötigen.

[00:43] Das heißt, wir müssten diesen Befehl dreimal ausführen, vielleicht brauchen wir noch Umgebungsvariaten, die wir hinzufügen müssen. Das ist sehr schnell unübersichtlich. Die Lösung dafür ist Docker Compose.

[00:57] Statt lange Befehle immer wieder neu zu schreiben, beschreiben wir unsere gesamte Anwendungsarchitektur in einer einzigen resbaren YAML-Datei. Sie definiert alle Dienste, ihre Konfiguration, wie sie miteinander kommunizieren und welche braucht sie nutzen.

[01:13] Das macht euren Workflow deutlich einfacher. Mit einem einzigen Befehl könnt ihr die gesamte Infrastruktur eurer Anwendung starten, stoppen oder verwalten. Was ich zunächst einmal mache, ist mir einen Ordner zu erstellen.

[01:26] Ich erstelle mir jetzt den Ordner Web Server und ich bewege mich in den Ordner Web Server hinein. Jetzt an dieser Stelle möchte ich eine Compose.jammel erstellen. An dieser Stelle würde auch docker-compose.thermal funktionieren, aber der Name compose.thermal wird bevorzugt behandelt.

[01:48] Beginnen wir damit, unsere erste Compose.thermal zu erstellen. Wenn ihr einen Terminal benutzt, dann habt ihr entweder Nano oder Wim auf eurem Betriebssystem installiert. Hier könnt ihr eine Docker Compose.thermal erstellen.

[02:00] Ich empfehle euch jedoch, falls möglich, einen Code Editor wie VSCode zu nutzen, der euch bei der Synthase unterstützt. Das heißt, ich verlasse jetzt hier meinen Server wieder und öffne VSCode, drücke auf dieses Zeichen Open Remote Window, drücke auf Connect Current Window to Host und gebe wieder ein Deploying as IP-Adresse des Servers.

[02:25] Jetzt öffne ich an dieser Stelle den Ordner Home Deployed. Und hier sehe ich auch den Ordner Web Server, den ich gerade erstellt habe. Das heißt, im Ordner Web Server kann ich jetzt eine Compose.Kermel anlegen.

[02:41] Und was ich machen sollte, ist in den Erweiterungen zu gucken, dass ich Docker installiert habe. Ich installiere hier das Docker Extension Pack for Vision Studio Code. und jetzt gehe ich in die Compose.jml

[02:55] und kann meine Compose.jml erstellen. Jede Compose-Datei enthält einen Services-Block. Das heißt, ich sehe jetzt hier einen Services, er wird hier auch mit IntelliSense geholfen

[03:07] und ich sehe hier Services. Hier listen wir alle Container oder Dienste auf, auf denen unsere Anwendung besteht. Unser erster Dienst soll wieder unser Engine X-Rab-Server sein.

[03:19] Wir geben Ihnen Einnahmen. In diesem Fall nenne ich ihn Web-Server und ich gebe zwei Leerzeichen an den Anfang an. Damit sage ich der YAML-Datei, der Web-Server gehört in die Services.

[03:33] Ich kann Web-Server nicht hier in die erste Ebene hinschreiben, das wäre so nicht erlaubt, sondern ich muss hier entweder zwei oder vier Leerzeichen einfügen.

[03:45] Unter dem Web-Server definieren wir die Eigenschaften des Containers. Die Reihenfolge hier spielt keine Rolle. Ich fange an mit dem Image. Und hier geben wir wieder an, welches Docker-Image verwendet werden soll.

[03:59] Genauso wie beim Docker-Run-Befehl. Das heißt, ich nutze jetzt hier Nginx in der Version 1.29. Als nächstes definiere ich die Port.

[04:11] Das ist unser p-flag aus Docker-Run. und wir k jetzt hier an dieser Stelle den Port 8080 an den Port 80 finden Beachtet dass das hier eine Liste von Ports ist Das hei wir k hier auch mehrere definieren Dann brauchen wir den Containernamen Das entspricht dem Nameflag

[04:34] Das gibt dem Container einen festen lesbaren Namen. Das ist besonders praktisch, um ihn dann später in Docker-Container-LS schnell zu finden. Ich gebe jetzt hier den Namen meinem Web-Server.

[04:49] und was ich auch noch machen kann, ist eine Restart Policy anzugeben. Das mache ich mit Restart. Jetzt gebe ich hier ein Anlass Stop.

[05:01] Das sorgt dafür, dass es bei einem Docker Neustart automatisch startet. Das ist für jeden wertvoll, der Docker nicht nur für die Entwicklung genutzt. Das heißt, wenn der Server startet, wird auch der Web-Server gestartet.

[05:16] Jetzt kann ich hier auch gleich den zweiten Web-Server darunter definieren. Das heißt, ich gebe jetzt hier einen Web-Server 2. Und hier möchte ich das Image NGINX in der Version 1.28 haben.

[05:34] Und ich möchte einen anderen Port mappen. Und zwar möchte ich hier den Port 8081 an den Port 80 im Container binden. und bei ContainerName sage ich meinen zweiter Web-Server

[05:52] und auf hier lege ich fest RestartUnlessStop. Jetzt speichere ich die Datei und wenn ich jetzt hier beispielsweise den Containernamen auf der falschen Ebene hätte,

[06:09] würde mir der Code Editor sagen, dass hier irgendwas nicht stimmt. Und so kann ich das Ganze wieder gerade rücken. Was wir als nächstes machen, ist in das Verzeichnis zu navigieren, in dem sich die Compose.jml befindet.

[06:25] Das heißt, ich wechsle wieder in das Verzeichnis-Set-Server. Was wir als nächstes machen, ist erst einmal zu gucken, was für Container gerade laufen. Also ich gebe ein sudo-docker-container-ls.

[06:39] Und ich sehe hier, es läuft der Container-EngineX. Den stopfe ich mal mit sudo docker stop b07.

[06:51] Jetzt ist der Container gestoppt. Und was ich jetzt machen kann, ist auch die Container zu entfernen. Also ich gebe ein sudo docker container prune. Und damit sind alle gestoppten Container gelöscht worden.

[07:03] Jetzt geben wir einen einzigen Befehl ein, um die Services aus der Compose von Chamele zu starten. Und zwar docker-compose-at-d. Das D steht wieder für Detached, das bedeutet der Container läuft im Hintergrund und euer Terminal bleibt frei für weitere Befehle.

[07:20] Ohne Minus D würdet ihr die Logs direkt im Terminal sehen, was nützlich sein kann, aber für den Dauerbetrieb ist Minus D besser. Ich starte jetzt die Container. Jetzt kann ich überprüfen, ob die Container laufen.

[07:32] Ich gebe ein Docker-Container-LS und ich sehe hier, mein Web-Server und mein zweiter Web-Server sind gestartet. Wir sollten wieder in der Lage sein, unseren Container zu erreichen.

[07:47] Und wir sehen jetzt hier unter der IP-Adresse bzw. unter Localhost, falls ihr Docker auf eurem Computer benutzt, sehen wir wieder die Nginx-Seite. Und zwar sowohl unter dem Port 8081 als auch unter dem Port 8080.

[08:03] Wenn ihr eure Anwendung beenden und alle dazugehörigen Container und das vom Compose erstellte Netzwerk entfernen wollt, nutzt ihr Docker Compose Down.

[08:15] Also ich kann eingeben, sudo Docker Compose Down. Beachtet aber auch den Unterschied zu Docker Stop. Docker Stop hält nur den Container an.

[08:27] Docker Compose Down stoppt nicht nur die Container, sondern entfernt sie auch. Zusammen mit dem Netzwerk, das Compose für diese Anwendung erstellt hat. Das ist ideal, wenn ihr eure Entwicklungsumgebung komplett aufstellen wollt.

[08:41] Das heißt, wenn ich jetzt eingebe, Sudo Docker Container, LS, dann sehe ich keine Container. Aber auch wenn ich eingebe LS dann sehe ich dass auch keine gestoppten Container vorliegen Wir starten die Container jetzt nochmal mit Docker Compose ab minus D Die Container sind gestartet

[09:00] Wir können auch eingeben Docker Compose Stop. Dann werden die Container gestoppt. Das heißt, jetzt sehe ich sie hier immer noch mit dem Status Exited. Und jetzt könnte ich sie wieder mit Fudo Docker Compose Start wieder starten.

[09:18] Wenn ihr sudo-docker-compose ab-d ausführt, wird nach einer Compose.yaml im aktuellen Ordner gesucht. Danach nach einer Compose.yaml ohne a, dann docker-compose.yaml und dann docker-compose.yaml ohne a.

[09:36] Aber ihr könnt auch eine direkt mit dem Befehl "-f". Also zum Beispiel gehe ich jetzt einen Schritt zurück und gebe ein sudocker-compose ab-d und hier wird keine Compose.jammel gefunden.

[09:53] Was ich aber machen kann, ist halt einzugeben "-f", und dann anzugeben, wo sich die Compose.jammel befindet. Also Webserver und dann Compose.jammel.

[10:06] Hier ist es aber auch wichtig zu beachten, wie die Reihenfolge der Befehle ist. Also müsst ihr das hier hinter Compose eingeben. Sudo Docker Compose minus F Web Server Compose Funktion ab minus D.

[10:23] Jetzt wird es wieder gestartet und jetzt kann ich das wieder stoppen. So muss ich mich nicht in die einzelnen Ordner bewegen, um Docker Compose zu starten. Ich starte jetzt nochmal den Container. Ein entscheidender Teil der Arbeit mit Containern ist das Lesen von Logs. Sie verraten uns, was im Container vor sich geht. Der einfachste Weg, den Log zu sehen, ist docker-compose-logs.

[10:48] Also wenn ich jetzt hier statt ab-d logs eingebe, dann sehe ich hier den Log des Containers. Was ich auch eingeben kann, ist sudo docker-compose logs und dann den Container, von dem ich den Log sehen möchte.

[11:04] Also zum Beispiel Web Server 2. Und jetzt sehe ich nur den Log vom Web Server 2. Vielleicht wollt ihr die Logs gleich verfolgen. Dafür gibt es das "-f", oder "--follow flag.

[11:20] Also ich gebe jetzt hier ein, logs Web Server 2, "-f". Jetzt werden neue Log-Einträge sofort eingezeigt, während sie passieren. Das heißt, ich gehe jetzt hier in meinen Browser und gehe jetzt hier zum Web Server 2, der unter Port 8081 erreicht weiß.

[11:38] und sobald ich die Seite aufrufe, hier sehe ich jetzt im Log, dass sich diese IP-Adresse mit dem Web-Förer verbunden hat.

[11:53] Mit Steuung C verlässt ihr diese Ansicht wieder. Manchmal braucht ihr auch nur die letzten paar Zeilen. Dazu nutzt ihr "--tail", also zum Beispiel sudo docker-compose-logs

[12:08] Und dann nicht "-f", sondern "--tail ist gleich 50. Und dann seht ihr die letzten 50 Zeilen. Oder wir können das mit uns mal angucken. Mit tail ist gleich 5.

[12:21] Dann seht ihr nur die letzten 5 Einträge. Diese Logbefehle sind eure erste Anlaufstelle, wenn etwas nicht wie erwartet funktioniert. Was aber, wenn ihr direkt im Container arbeiten oder etwas überprüfen wollt?

[12:36] Dafür gibt es den AdFact-Befehl. Er erlaubt es euch, geliebige Befehle innerhalb eines laufenden Containers auszuführen. Ich bewege mich jetzt mal in den Web-Server-Ordner und gebe ein Docker Compose Exec Web-Server,

[12:53] weil ich etwas im Container Web-Server ausführen möchte, und dann lf-l und zwar im Ordner etc.nginx.comf.d

[13:09] Jetzt habe ich den Befehl lf-l direkt im Container ausgeführt. Das hei ich sehe was im Container f eine Datei sich im Ordner etc befindet und das ist die default Das ist super um schnell zu ob Dateien da sind oder Konfigurationen stimmen

[13:29] Noch mächtiger wird es, wenn wir eine interaktive Shell im Container benötigen, um zum Beispiel Dateien zu bearbeiten oder tiefgreifendere Prüfungen vorzunehmen. Dafür nutzen wir die flags "-i und "-t", zusammen mit bash oder sh.

[13:46] Also ich gebe jetzt ein, sudo.offer.pouse.exe-it-webserver-bash.

[14:00] Wenn Bash hier an dieser Stelle nicht gefunden wird, was vor allem in kleineren Images der Fall ist, dann könnt ihr auch genauso sh benutzen. Das ist meistens vorhanden.

[14:12] Das "-i steht für Interactive. Damit werden Eingaben an den Container weitergeleitet. Und "-c", erstellt dieses Pseudo-TTY, was die Ausgaben beformatierter macht und ein Terminalerlebnis simuliert.

[14:27] Was ich jetzt mache, ist, mich nochmal mit BEST zu verbinden. Hier ist die Ansicht ein bisschen schöner. Ich bewege mich in den Ordner User und jetzt bewege ich mich in den Ordner Share und in den Ordner NGINX.

[14:45] und in den Ordner HTML. Jetzt gebe ich ein ls-l und ich sehe hier eine index.html und eine 50x.html.

[14:57] Ich kann mir auch den Inhalt dieser Datei anzeigen lassen. Dazu gebe ich ein cat index.html und ich sehe jetzt hier die Seite von NGINX, die Standardseite

[15:09] und hier sehe ich Welcome to NGINX. If you see this page, the Nginx Web Server is successfully installed. Und genau das gleiche sehen wir auch hier im Browser.

[15:22] Das ist hier diese Seite, die wir aufrufen, wenn wir Web Server 1 besuchen. Um die Shell zu verlassen und zum Host-Container zurückzukehren, könnt ihr einfach Exit tippen.

[15:34] Und jetzt bin ich wieder auf meinem Host. So ist es am Ende einfacher, mehrere Container zu definieren und gleichzeitig zu verwalten. Was ist der Fehler in diesem Ausschnitt einer Compose.jammel-Datei?

[15:52] Die Zeile ImageNode20 ist falsch eingerückt. Sie muss auf derselben Ebene wie Port sein, also zwei Leerzeichen weiter rechts. Dein Nginx-Container startet nicht und du vermutest, dass ein Konfigurationsfehler vorliegt.

[16:09] Welchen Befehl würdest du als erstes verwenden, um das Problem zu debuggen? Ist es A. Docker-Compose-Top-Bet-Server oder B. Docker-Compose-Log-Thread-Server oder C. Docker-Compose-Exec-Bet-Server-Bash oder D. Docker-Compose-Darn.

[16:32] Die korrekte Antwort ist B, Docker Compose Log Thread Server. Die Logs sind immer der erste Ort, an dem ihr nach Fehlern suchen solltet. Sie geben euch in der Regel einen direkten Hinweis auf das Problem, warum der Container nicht startet oder abstürzt.

[16:48] Wir haben heute gelernt, wie man Dienste in der Compose.jammel definiert, wie man sie mit Docker Compose abstartet und mit Docker Compose Down wieder aufräumt. Leider werden dabei auch alle Daten gelöscht.

[17:02] Im nächsten Video schauen wir uns an, wie wir das verhindern können. Ich hoffe, dieses Video hat euch gefallen. Wenn ja, würde mich ein Like freuen. Schreibt gerne eure Anmerkungen und Fragen in die Kommentare.

[17:15] Vielen Dank fürs Zuschauen und bis zum nächsten Mal. Outro

⚡ Saved you 0h 17m reading this? Transcribe any YouTube video for free — no signup needed.