Erstellen Sie einen Container in einer Docker-Compose-Datei neu

David Mbochi Njonge 20 Juni 2023
  1. Erstellen Sie ein neues Projekt
  2. Erstellen Sie ein Dockerfile für das Image
  3. Erstellen Sie eine Compose-Datei für die Container
  4. Container mit compose ausführen
  5. Erstellen Sie einen einzelnen Container mit compose neu
  6. Abschluss
Erstellen Sie einen Container in einer Docker-Compose-Datei neu

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.

  1. Dienste – Dies definiert die Rechenkomponenten einer Anwendung.
  2. restart – Dies definiert die auszuführende Aktion, wenn ein Container beendet wird.
  3. build - Dies definiert die Quelle der Dockerfile, die die Konfiguration zum Erstellen eines Images enthält.
  4. hostname – Dies legt einen benutzerdefinierten Namen fest, der vom Dienst verwendet werden soll.
  5. 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
  1. --build – Dies stellt sicher, dass die Images erstellt werden, bevor die Container ausgeführt werden.
  2. --force-recreate – Dadurch werden die Container neu erstellt, ohne den Status ihrer Konfigurationen und Images zu berücksichtigen.
  3. --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 Mbochi Njonge avatar David Mbochi Njonge avatar

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

Verwandter Artikel - Docker Container