Erstellen Sie einen Container in einer Docker-Compose-Datei neu
- Erstellen Sie ein neues Projekt
- Erstellen Sie ein Dockerfile für das Image
- Erstellen Sie eine Compose-Datei für die Container
-
Container mit
compose
ausführen -
Erstellen Sie einen einzelnen Container mit
compose
neu - Abschluss
Bevor wir unsere Anwendung implementieren, müssen wir den Unterschied zwischen einer Dockerfile
- und einer compose.yaml
-Datei verstehen.
Wenn wir benutzerdefinierte Images für unsere Anwendungen erstellen, verwenden wir normalerweise eine Datei namens Dockerfile
und führen Container davon auf der Befehlszeile mit dem Befehl docker run
aus. Wenn wir mehrere Images erstellen möchten, wird dieser Befehl zu mühsam und schwierig, die Container zu verwalten, also kommt hier die Datei compose.yaml
ins Spiel.
Die Datei compose.yaml
erstellt die Images, führt die Container aus, erstellt ein Netzwerk für diese Container und fügt sie dem Netzwerk hinzu. Wir können dann über den Namen des Dienstes auf die Netzwerkanwendungen zugreifen.
Diese beiden Befehle müssen in der Anwendung vorhanden sein, damit der Befehl docker compose up
die Images erstellen und ausführen kann.
Wenn Änderungen am Image vorgenommen wurden, ruft dieser Befehl die Änderungen ab, stoppt die Container und erstellt die Images neu. In diesem Tutorial erfahren Sie, wie Sie einen einzelnen Docker-Container aus mehreren in einer Docker-Datei definierten Containern neu erstellen.
Erstellen Sie ein neues Projekt
Öffnen Sie IntelliJ IDEA und wählen Sie Datei > Neu > Projekt
. Wählen Sie im geöffneten Fenster Node.js und ändern Sie den Projektnamen von unbenannt
in docker-rebuild-container
oder verwenden Sie einen beliebigen Namen.
Stellen Sie sicher, dass die Node-Laufzeitumgebung installiert ist, sodass die Abschnitte Node-Interpreter und Paket-Manager automatisch vom Computer hinzugefügt werden. Klicken Sie abschließend auf die Schaltfläche Erstellen, um das Projekt zu generieren.
Erstellen Sie eine Datei namens index.js
im Ordner docker-rebuild-container
und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.json(
[
{
name: "Java in action",
author: "chad darby",
price: 345
},
{
name: 'React cookbook',
author: "mary public",
price: 600
},
])
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
In dieser Datei haben wir eine Node.js-Beispielanwendung erstellt, um ein Image zu erstellen und Container daraus auszuführen. Diese Anwendung stellt eine API bereit, auf die zugegriffen werden kann, indem eine Get-Anforderung an /
im Browser gesendet wird.
Erstellen Sie ein Dockerfile für das Image
Erstellen Sie eine Datei namens Dockerfile
und kopieren Sie die folgenden Anweisungen und fügen Sie sie in die Datei ein.
FROM node:16.17.0-alpine
WORKDIR /com/app
ADD package*.json ./
RUN npm install
ADD . .
CMD node index.js
Diese Datei definiert die Anweisungen zum Erstellen eines Images und zum Ausführen eines Containers daraus. Die Docker-Dokumentation enthält eine detaillierte Erklärung, wie diese Anweisungen funktionieren.
Erstellen Sie eine Compose-Datei für die Container
Erstellen Sie eine compose.yaml
-Datei im Ordner docker-rebuild-container
und kopieren Sie die folgenden Anweisungen und fügen Sie sie in die Datei ein.
services:
service-one:
restart: on-failure
build: .
hostname: service-one
ports:
- '3000:3000'
service-two:
restart: on-failure
build: .
hostname: service-two
ports:
- '5000:3000'
Diese Datei definiert zwei Dienste mit den Namen service-one
und service-two
, wobei die Dienste Port 3000 im Container von Port 3000 bzw. 5000 im Host überwachen.
Dienste
– Dies definiert die Rechenkomponenten einer Anwendung.restart
– Dies definiert die auszuführende Aktion, wenn ein Container beendet wird.build
- Dies definiert die Quelle derDockerfile
, die die Konfiguration zum Erstellen eines Images enthält.hostname
– Dies legt einen benutzerdefinierten Namen fest, der vom Dienst verwendet werden soll.ports
– Dies stellt die Ports auf dem Host-Rechner bereit, um die Anwendung zu bedienen.
Die Docker-Dokumentation enthält eine docker compose file reference, in der diese Anweisungen ausführlich erläutert werden.
Container mit compose
ausführen
In diesem Beispiel sehen wir, wie alle definierten Container auf einmal erstellt und ausgeführt werden. Um unsere Docker-Datei compose.yaml
auszuführen, öffnen Sie ein neues Terminalfenster in Ihrer Entwicklungsumgebung mit der Tastenkombination ALT + F12 und dem folgenden Befehl, um die Datei zu erstellen und auszuführen Behälter.
~/WebstormProjects/docker-rebuild-container$ docker compose up --build --force-recreate --no-deps -d
Mit diesem Befehl wird es sehr einfach, Container auszuführen und zu verwalten. Bevor wir diesen Befehl verwenden, führen wir docker compose up -d
aus, um sicherzustellen, dass wir das Image neu erstellen und die Container mit diesem Befehl neu erstellen.
=> CACHED [docker-rebuild-container_service-two 2/5] WORKDIR /com/app 0.0s
=> CACHED [docker-rebuild-container_service-two 3/5] ADD package*.json ./ 0.0s
=> CACHED [docker-rebuild-container_service-two 4/5] RUN npm install 0.0s
=> [docker-rebuild-container_service-two 5/5] ADD . . 1.2s
=> [docker-rebuild-container_service-one] exporting to image
--build
– Dies stellt sicher, dass die Images erstellt werden, bevor die Container ausgeführt werden.--force-recreate
– Dadurch werden die Container neu erstellt, ohne den Status ihrer Konfigurationen und Images zu berücksichtigen.--no-deps
- Dies stellt sicher, dass die verknüpften Dienste nicht gestartet werden.
Erstellen Sie einen einzelnen Container mit compose
neu
Um einen einzelnen Container aus mehreren in der Datei compose.yaml
definierten Containern neu zu erstellen, verwenden Sie den im vorherigen Beispiel verwendeten Befehl und fügen Sie den Namen des neu zu erstellenden Dienstes hinzu, wie unten gezeigt.
~/WebstormProjects/docker-rebuild-container$ docker compose up --build --force-recreate --no-deps -d service-one
Dieser Befehl erstellt das Image neu und erstellt den Container mit dem Namen service-one
neu, da wir nur einen einzigen Container neu erstellen möchten. Wir können anhand der Ausgabe dieses Befehls überprüfen, dass nur ein Container neu erstellt wird, wie unten gezeigt.
[+] Running 1/1
⠿ Container docker-rebuild-container-service-one-1 Started
Um zu überprüfen, ob die Container wie erwartet funktionieren, senden Sie zwei Anfragen an den Browser, eine an localhost:3000
(http://localhost:3000/) und eine weitere an localhost:5000
(http://localhost:5000 /), und beachten Sie, dass wir von beiden Containern aus auf dieselbe Anwendung zugreifen können. Das Folgende ist die JSON-Antwort, die von den Containern zurückgegeben wird.
[
{
"name": "Java in action",
"author": "chad darby",
"price": 345
},
{
"name": "React cookbook",
"author": "mary public",
"price": 600
}
]
Abschluss
In diesem Tutorial haben wir gelernt, wie man ein Image mit einer Dockerfile
definiert, Container mit der Datei compose.yaml
definiert, Container in einer Compose-Datei ausführt und einen einzelnen Container in einer Compose-Datei neu erstellt.
Beachten Sie, dass die Syntax zum Ausführen von Containern aus einer Compose-Datei docker compose up [OPTIONS] [SERVICE...]
lautet und der optionale Parameter SERVICE
es uns ermöglicht, einen oder mehrere Dienste anzugeben, deren Images neu erstellt oder neu erstellt werden sollen ihre Behälter.
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub