Ich habe viele Leute gesehen, die zwischen einer Dockerfile und einer Compose-Datei verwechselt wurden. Dies liegt hauptsächlich daran, dass beide verwendet werden, um ein Docker-Image auf eine Weise zu modifizieren, obwohl dies technisch nicht korrekt ist.
Es ist leicht, die beiden Begriffe zu verwechseln, aber es ist auch notwendig, den Unterschied zu verstehen, wenn Sie ein Gespräch mit einem Kollegen oder Ihrem (potenziellen) Arbeitgeber führen.
Dockerfile wird verwendet, um ein Container-Image zu erstellen, und eine Compose-Datei wird verwendet, um eine Instanz dieses Images als Container bereitzustellen.
Lassen Sie mich ein wenig ins Detail gehen, damit Sie den Unterschied zwischen Docker Compose und Dockerfile richtig verstehen.
Was ist ein Dockerfile?
Ich nenne Dockerfile gerne den Vorgänger eines Container-Images. Sie erstellen ein Image aus einem Dockerfile. Ein typisches Dockerfile enthält spezielle Build-Anweisungen, Befehle wie RUN
, ADD
, COPY
, ENTRYPOINT
usw.
Nehmen Sie das folgende Beispiel:
FROM alpine:latest
RUN apk add --no-cache fortune
ENTRYPOINT ["fortune"]
Jede Zeile beginnt mit einer Anweisung für die Build-Komponente. Diese Anweisungen müssen nicht unbedingt in Großbuchstaben geschrieben werden. Das Folgende ist genauso gültig wie das vorherige.
from alpine:latest
run apk add --no-cache fortune
entrypoint ["fortune"]
Aus diesem Dockerfile können Sie nun ein Container-Image (bzw. ein Docker-Image) bauen. Ein Image ist einfach eine Vorlage für die laufenden Container, die aus mehreren schreibgeschützten Schichten besteht. Da dies kein Artikel über Container-Images ist, werde ich davon absehen, dieses Thema zu sehr zu erklären.
Führen Sie den folgenden Befehl aus, um mithilfe der Docker-CLI ein Image aus dieser Docker-Datei zu erstellen
docker build -t fortune:alpine .
Dadurch wird ein Image mit dem Tag fortune:alpine
erstellt . Ich werde noch keinen Container aus diesem Image erstellen, das ist für den nächsten Abschnitt.
Was ist eine Compose-Datei?
Compose-Dateien werden in zwei Arten von Bereitstellungen verwendet:in der Nicht-Cluster-Bereitstellung mit docker-compose
und eine Clusterbereitstellung mit docker swarm
.
Um die beiden Typen zu unterscheiden, werde ich die Compose-Datei, die für die Cluster-Bereitstellung verantwortlich ist, als Stack-Dateien ansprechen. Ich werde gleich über Stack-Dateien sprechen.
Compose-Dateien sind Teil eines Tools namens docker-compose
. Es ist eine Client-Anwendung für den Docker-Daemon-Server, ähnlich wie docker
CLI-Client, aber anstatt den ganzen run
einzugeben Befehle jedes Mal mit docker-compose
Sie können dieselbe YAML-Datei immer wieder verwenden und denselben Container mit derselben Konfiguration wie beim ersten Mal bereitstellen.
Es ist besser lesbar, wartbarer und intuitiver. Eine einzelne Compose-Datei kann mehrere Container-Bereitstellungskonfigurationen enthalten.
Die Unterstützung von Compose-Dateien wird Teil des Standard-Docker-Clients sein, der in Go als Befehlszeilenargument „docker compose“ geschrieben ist. Beachten Sie den fehlenden Bindestrich dort. Es ist noch experimentell, daher wird in der Produktion die Verwendung der Python-Version, dh docker-compose, immer noch empfohlen.Nehmen wir das vorherige Image und stellen eine Instanz davon mithilfe einer Compose-Datei bereit.
version: "3.3"
services:
fortune:
image: "fortune:alpine"
Speichern Sie die Datei als docker-compose.yml
. Führen Sie nun im selben Verzeichnis den folgenden Befehl
docker-compose up
Sie müssen nicht müssen Speichern Sie die Datei als docker-compose.yml
, Sie können es speichern, wie Sie möchten, aber wenn es nicht docker-compose.yml
ist oder docker-compose.yaml
, stellen Sie sicher, dass Sie -f [FILENAME]
verwenden Option.
docker-compose -f docker-compose.yml up
Abwarten was passiert.
Zu wissen, welches fortune
Lesen Sie diesen Artikel über lustige Linux-Befehle.
Was ist eine Stack-Datei?
Stack-Dateien sind mit einigen Ausnahmen identisch mit Compose-Dateien mit ähnlicher Syntax und den meisten internen Optionen. Stapeldateien werden verwendet, um Stapel von Diensten in einem Schwarmcluster bereitzustellen.
Sie können die vorherige Compose-Datei direkt als Stack-Datei wiederverwenden.
Initialisieren Sie zuerst den Cluster.
docker swarm init
Führen Sie dann einen Befehl ähnlich dem folgenden aus
docker stack deploy -c docker-compose.yml fortune
Wenn Sie auf diese Weise bereitgestellt werden, müssen Sie die Ausgabe überprüfen, indem Sie die Dienstprotokolle mithilfe von docker service logs ...
anzeigen .
Abschluss
Dockerfiles und Compose-Dateien dienen einem anderen Zweck. Wenn ich eine Zeitleiste erstellen könnte, würde sie in etwa so aussehen
Dockerfile -> Docker Image -> Compose File -> Running Containers
Es gibt noch einen weiteren Grund, warum Anfänger mit diesen beiden Dateien verwirrt werden. Auf eine Dockerfile kann über die Compose-Datei verwiesen werden, und dann können Sie docker-compose
verwenden um das Bild aufzubauen.
Beispielsweise können Sie die vorherige Compose-Datei so umschreiben
version: "3.3"
services:
fortune:
build:
context: '.'
dockerfile: "./Dockerfile"
image: "fortune:alpine"
Jetzt können Sie docker-compose build
ausführen um das Bild aufzubauen. Oder Sie können auch docker-compose up --build
ausführen um den Container gleichzeitig zu erstellen und auszuführen.
Hier wird das Dockerfile durch die Compose-Datei geleitet, und auf den ersten Blick kann es so aussehen, als wäre die Compose-Datei für die Erstellung des Images verantwortlich, aber das ist es nicht.
Docker Run vs. Start vs. Create:Unterschied erklärtFür einen Docker-Anfänger könnten Begriffe wie Docker-Start, Docker-Run und Docker-Erstellung verwirrend sein. Dieser Artikel erklärt den Unterschied anhand von Beispielen. Linux-HandbuchAbhishek PrakashIch hoffe, dieser Artikel hat den Unterschied zwischen einer Docker-Datei und einer Compose-Datei geklärt. Wenn Sie Fragen haben, lassen Sie es mich im Kommentarbereich unten wissen.