Editor – Die NGINX Plus Dockerfiles für Alpine Linux und Debian wurden im November 2021 aktualisiert, um die neuesten Softwareversionen widerzuspiegeln. Sie verwenden außerdem (zusammen mit den überarbeiteten Anweisungen) Docker-Geheimnisse, um beim Erstellen eines NGINX Plus-Image Lizenzinformationen weiterzugeben.
Docker ist eine offene Plattform zum Erstellen, Versenden und Ausführen verteilter Anwendungen als Container (leichtgewichtige, eigenständige, ausführbare Softwarepakete, die alles enthalten, was zum Ausführen einer Anwendung erforderlich ist). Container können wiederum von Container-Orchestrierungsplattformen wie Kubernetes bereitgestellt und orchestriert werden. (Zusätzlich zu der in diesem Blog besprochenen Docker-Containertechnologie bietet NGINX den F5 NGINX Ingress Controller in NGINX Open Source-basierten und NGINX Plus-basierten Versionen an; für NGINX Plus-Abonnenten ist der Support ohne zusätzliche Kosten enthalten.)
Als Softwareanwendungen sind NGINX Open Source und F5 NGINX Plus großartige Anwendungsfälle für Docker, und wir veröffentlichen ein NGINX Open Source-Image auf Docker Hub , dem Repository für Docker-Images. In diesem Beitrag wird Folgendes erläutert:
Die offene Docker-Plattform umfasst die Docker Engine – die Open-Source-Laufzeitumgebung zum Erstellen, Ausführen und Orchestrieren von Containern – und Docker Hub, einen gehosteten Dienst, bei dem Docker-Anwendungen verteilt, geteilt und gemeinsam von der gesamten Entwickler-Community oder innerhalb einer bestimmten Organisation bearbeitet werden.
Docker-Container ermöglichen es Entwicklern, ihre Bemühungen auf den Anwendungsinhalt zu konzentrieren, indem sie Anwendungen von den Beschränkungen der Infrastruktur trennen. Dockerisierte Anwendungen sind sofort auf jede Infrastruktur portierbar – Laptop, Bare-Metal-Server, VM oder Cloud – und stellen somit modulare Komponenten dar, die problemlos zu voll funktionsfähigen verteilten Anwendungen zusammengesetzt und neu zusammengesetzt und in Echtzeit kontinuierlich weiterentwickelt werden können.
Weitere Informationen zu Docker finden Sie unter Warum Docker? oder in der vollständigen Docker-Dokumentation .
Sie können eine NGINX-Instanz in einem Docker-Container erstellen, indem Sie das NGINX Open Source-Image von Docker Hub verwenden.
Beginnen wir mit einem sehr einfachen Beispiel. Um eine Instanz von NGINX zu starten, die in einem Container ausgeführt wird und die Standard-NGINX-Konfiguration verwendet, führen Sie diesen Befehl aus:
# docker run --name mynginx1 -p 80:80 -d nginx fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d
Dieser Befehl erstellt basierend auf dem NGINX-Image einen Container mit dem Namen mynginx1 . Der Befehl gibt die Langform der Container-ID zurück, die im Namen von Protokolldateien verwendet wird; siehe Verwalten der Protokollierung .
Die Option -p
weist Docker an, den vom NGINX-Image im Container bereitgestellten Port (Port 80) dem angegebenen Port auf dem Docker-Host zuzuordnen. Der erste Parameter gibt den Port im Docker-Host an, während der zweite Parameter dem im Container verfügbaren Port zugeordnet ist.
Die Option -d
gibt an, dass der Container im getrennten Modus ausgeführt wird. Dies bedeutet, dass er weiter ausgeführt wird, bis er gestoppt wird, jedoch nicht auf Befehle reagiert, die in der Befehlszeile ausgeführt werden. Im nächsten Abschnitt erklären wir, wie mit dem Container interagiert wird.
Um zu überprüfen, ob der Container erstellt wurde und ausgeführt wird, und um die Portzuordnungen anzuzeigen, führen wir docker
ps
aus. (Wir haben die Ausgabe hier auf mehrere Zeilen aufgeteilt, um die Lesbarkeit zu verbessern.)
# docker ps CONTAINER-ID IMAGE-BEFEHL ERSTELLT STATUS … fcd1fb01b145 nginx:latest „nginx -g“ Daemon von vor 16 Sekunden. Vor 15 Sekunden aktiv … … HAFENNAMEN ... 0.0.0.0:80->80/tcp mynginx1
Das Feld PORTS
in der Ausgabe meldet, dass Port 80 auf dem Docker-Host Port 80 im Container zugeordnet ist. Eine andere Möglichkeit, zu überprüfen, ob NGINX ausgeführt wird, besteht darin, eine HTTP-Anfrage an diesen Port zu senden. Der Code für die standardmäßige NGINX-Willkommensseite wird angezeigt:
# Locken http://localhost<!DOCTYPE html>
<html>
<head>
<title>Willkommen bei nginx!</title>
<style>
body {
width: 35em; Rand: 0 auto; Schriftfamilie: Tahoma, Verdana, Arial, sans-serif; } Weitere Konfiguration ist erforderlich.
Wir haben jetzt also einen funktionierenden NGINX-Docker-Container, aber wie verwalten wir den Inhalt und die NGINX-Konfiguration? Und wie steht es mit der Protokollierung?
Es ist üblich, den SSH-Zugriff auf NGINX-Instanzen zu aktivieren, aber im NGINX-Image ist OpenSSH nicht installiert, da Docker-Container im Allgemeinen für einen einzigen Zweck vorgesehen sind (in diesem Fall die Ausführung von NGINX). Stattdessen verwenden wir andere von Docker unterstützte Methoden.
Als Alternative zu den folgenden Befehlen können Sie den folgenden Befehl ausführen, um eine interaktive Shell für einen laufenden NGINX-Container zu öffnen (anstatt eine SSH-Sitzung zu starten). Wir empfehlen dies jedoch nur fortgeschrittenen Benutzern.
Auf Alpine Linux-Systemen:
# docker exec -it NGINX_container_ID sh
Auf Debian-Systemen:
# docker exec -it NGINX_container_ID bash
Es gibt mehrere Möglichkeiten, sowohl die von NGINX bereitgestellten Inhalte als auch die NGINX-Konfigurationsdateien zu verwalten. Hier behandeln wir einige der Optionen.
Wenn der Container erstellt ist, können wir Docker anweisen, ein lokales Verzeichnis auf dem Docker-Host in einem Verzeichnis im Container zu mounten. Das NGINX-Image verwendet die Standard-NGINX-Konfiguration, die /usr/share/nginx/html als Stammverzeichnis des Containers verwendet und Konfigurationsdateien in /etc/nginx ablegt. Führen Sie für einen Docker-Host mit Inhalt im lokalen Verzeichnis /var/www und Konfigurationsdateien in /var/nginx/conf diesen Befehl aus (der hier nur der Lesbarkeit halber in mehreren Zeilen erscheint):
# docker run --name mynginx2 --mount Typ=bind Quelle=/var/www,Ziel=/usr/share/nginx/html,schreibgeschützt --mount Typ=bind,Quelle=/var/nginx/conf,Ziel=/etc/nginx/conf,schreibgeschützt -p 80:80 -d nginx
Jetzt werden alle Änderungen, die an den Dateien in den lokalen Verzeichnissen /var/www und /var/nginx/conf auf dem Docker-Host vorgenommen werden, in den Verzeichnissen /usr/share/nginx/html und /etc/nginx im Container widergespiegelt. Die Option „schreibgeschützt“
bedeutet, dass diese Verzeichnisse nur auf dem Docker-Host und nicht innerhalb des Containers geändert werden können.
Eine andere Möglichkeit besteht darin, dass Docker während der Containererstellung die Inhalts- und Konfigurationsdateien aus einem lokalen Verzeichnis auf dem Docker-Host kopiert. Sobald ein Container erstellt wurde, werden die Dateien verwaltet, indem bei Dateiänderungen ein neuer Container erstellt oder die Dateien im Container geändert werden. Eine einfache Möglichkeit zum Kopieren der Dateien besteht darin, eine Docker-Datei mit Befehlen zu erstellen, die während der Generierung eines neuen Docker-Images basierend auf dem NGINX-Image von Docker Hub ausgeführt werden. Bei den Dateikopierbefehlen ( COPY
) im Dockerfile ist der lokale Verzeichnispfad relativ zum Build-Kontext, in dem sich das Dockerfile befindet.
In unserem Beispiel befindet sich der Inhalt im Inhaltsverzeichnis und die Konfigurationsdateien im Verzeichnis „conf“ , beides Unterverzeichnisse des Verzeichnisses, in dem sich das Dockerfile befindet. Das NGINX-Image enthält standardmäßige NGINX-Konfigurationsdateien als /etc/nginx/nginx.conf und /etc/nginx/conf.d/default.conf . Da wir stattdessen die Konfigurationsdateien vom Host verwenden möchten, fügen wir einen RUN
-Befehl ein, der die Standarddateien löscht:
VON nginx
AUSFÜHREN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
KOPIEREN Inhalt /usr/share/nginx/html
KOPIEREN conf /etc/nginx
Wir erstellen unser eigenes NGINX-Image, indem wir den folgenden Befehl aus dem Verzeichnis ausführen, in dem sich die Docker-Datei befindet. Beachten Sie den Punkt („.“) am Ende des Befehls. Es definiert das aktuelle Verzeichnis als Build-Kontext, der das Dockerfile und die zu kopierenden Verzeichnisse enthält.
# Docker-Build -t mynginx_image1.
Jetzt führen wir diesen Befehl aus, um einen Container namens mynginx3 basierend auf dem Image mynginx_image1 zu erstellen:
# docker run --name mynginx3 -p 80:80 -d mynginx_image1
Wenn wir Änderungen an den Dateien im Container vornehmen möchten, verwenden wir einen Hilfscontainer, wie in Option 3 beschrieben.
Wie in „Hinweis zu SSH“ erwähnt, können wir SSH nicht verwenden, um auf den NGINX-Container zuzugreifen. Wenn wir also den Inhalt oder die Konfigurationsdateien direkt bearbeiten möchten, müssen wir einen Hilfscontainer mit Shell-Zugriff erstellen. Damit der Hilfscontainer auf die Dateien zugreifen kann, müssen wir ein neues Image erstellen, für das die richtigen Docker-Datenvolumes definiert sind. Angenommen, wir möchten Dateien wie in Option 2 kopieren und dabei auch Volumes definieren, verwenden wir das folgende Dockerfile :
VON nginxRUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
KOPIEREN Inhalt /usr/share/nginx/html
KOPIEREN conf /etc/nginx
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx
Anschließend erstellen wir das neue NGINX-Image, indem wir den folgenden Befehl ausführen (beachten Sie auch hier den Punkt am Ende):
# Docker-Build -t mynginx_image2.
Jetzt führen wir diesen Befehl aus, um einen NGINX-Container ( mynginx4 ) basierend auf dem Image mynginx_image2 zu erstellen:
# docker run --name mynginx4 -p 80:80 -d mynginx_image2
Anschließend führen wir den folgenden Befehl aus, um einen Hilfscontainer mynginx4_files zu starten, der über eine Shell verfügt, die uns Zugriff auf die Inhalts- und Konfigurationsverzeichnisse des soeben erstellten mynginx4- Containers ermöglicht:
# docker run -i -t --volumes-from mynginx4 --name mynginx4_files debian /bin/bash root@b1cbbad63dd1:/#
Der neue Hilfscontainer mynginx4_files wird im Vordergrund mit einer dauerhaften Standardeingabe ( Option -i
) und einem TTY ( Option -t
) ausgeführt. Alle in mynginx4 definierten Volumes werden als lokale Verzeichnisse im Hilfscontainer gemountet.
Das Debian
-Argument bedeutet, dass der Hilfscontainer das Debian-Image von Docker Hub verwendet. Da das NGINX-Image auch Debian verwendet (und alle unsere bisherigen Beispiele verwenden das NGINX-Image), ist es am effizientesten, Debian für den Hilfscontainer zu verwenden, anstatt Docker ein anderes Betriebssystem laden zu lassen. Das Argument /bin/bash
bedeutet, dass die Bash
-Shell im Hilfscontainer ausgeführt wird und eine Shell-Eingabeaufforderung anzeigt, mit der Sie Dateien nach Bedarf ändern können.
Um den Container zu starten und zu stoppen, führen Sie die folgenden Befehle aus:
# Docker starte mynginx4_files # Docker stoppe mynginx4_files
Um die Shell zu verlassen, den Container aber weiterlaufen zu lassen, drücken Sie Strg+p
und anschließend Strg+q
. Um den Shell-Zugriff auf einen laufenden Container wiederherzustellen, führen Sie diesen Befehl aus:
# Docker hängt mynginx4_files an
Um die Shell zu verlassen und den Container zu beenden, führen Sie den Befehl exit
aus.
Sie können entweder die Standardprotokollierung oder eine benutzerdefinierte Protokollierung konfigurieren.
Das NGINX-Image ist so konfiguriert, dass die wichtigsten NGINX-Zugriffs- und Fehlerprotokolle standardmäßig an den Docker-Protokollsammler gesendet werden. Dies geschieht, indem sie mit stdout
bzw. stderr
verknüpft werden; alle Nachrichten aus beiden Protokollen werden dann in die Datei /var/lib/docker/containers/ container-ID / container-ID -json.log auf dem Docker-Host geschrieben, wobei „container-ID“ die Langform-ID ist, die zurückgegeben wird, wenn Sie einen Container erstellen. Für den ursprünglichen Container, den wir unter „Verwenden des Open-Source-Docker-Image von NGINX“ erstellt haben, ist dies beispielsweise fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d .
Um die Container-ID für einen vorhandenen Container abzurufen, führen Sie diesen Befehl aus, wobei container‑name
der Wert ist, der durch den Parameter --name
beim Erstellen des Containers festgelegt wurde (für die Container‑ID oben ist dies beispielsweise mynginx1 ):
# docker inspect --format '{{ .Id }}' Containername
Obwohl Sie die Protokolle anzeigen können, indem Sie die Datei „container-ID -json.log“ direkt öffnen, ist es normalerweise einfacher, diesen Befehl auszuführen:
# Docker -Protokolle Containername
Sie können auch die Docker Engine API verwenden, um die Protokollnachrichten zu extrahieren, indem Sie eine GET-
Anfrage an den Docker Unix-Socket senden. Dieser Befehl gibt sowohl das Zugriffsprotokoll (dargestellt durch stdout=1
) als auch das Fehlerprotokoll ( stderr=1
) zurück, Sie können sie aber auch einzeln anfordern:
curl --unix-socket /var/run/docker-sock http://localhost/containers/ Containername /logs?stdout=1&stderr=1
Weitere Informationen zu anderen Abfrageparametern finden Sie in der Docker Engine-API-Dokumentation (suchen Sie auf dieser Seite nach „Containerprotokolle abrufen“).
Wenn Sie eine andere Methode zur Protokollerfassung implementieren oder die Protokollierung in bestimmten Konfigurationsblöcken (wie etwa server{}
und location{}
) anders konfigurieren möchten, definieren Sie ein Docker-Volume für das Verzeichnis bzw. die Verzeichnisse, in denen die Protokolldateien im Container gespeichert werden sollen, erstellen Sie einen Hilfscontainer für den Zugriff auf die Protokolldateien und verwenden Sie die gewünschten Protokollierungstools. Um dies umzusetzen, erstellen Sie ein neues Image, das das Volume bzw. die Volumes für die Protokollierungsdateien enthält.
Um beispielsweise NGINX so zu konfigurieren, dass Protokolldateien in /var/log/nginx/log gespeichert werden, können wir mit der Docker-Datei aus Option 3 beginnen und einfach eine VOLUME-
Definition für dieses Verzeichnis hinzufügen:
VON nginxRUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
KOPIEREN Inhalt /usr/share/nginx/html
KOPIEREN conf /etc/nginx
VOLUME /var/log/nginx/log
Anschließend können wir wie oben beschrieben ein Image erstellen und damit einen NGINX-Container und einen Hilfscontainer erstellen, die Zugriff auf das Logging-Verzeichnis haben. Im Hilfscontainer können beliebige Protokollierungstools installiert werden.
Da wir keinen direkten Zugriff auf die Befehlszeile des NGINX-Containers haben, können wir den Befehl nginx
nicht verwenden, um NGINX zu steuern. Glücklicherweise können wir Signale verwenden, um NGINX zu steuern, und Docker bietet den Befehl kill
zum Senden von Signalen an einen Container.
Um die NGINX-Konfiguration neu zu laden, führen Sie diesen Befehl aus:
# docker kill -s HUP Containername
Um NGINX neu zu starten, führen Sie diesen Befehl aus, um den Container neu zu starten:
# Docker startet Containernamen neu
Bisher haben wir Docker für NGINX Open Source besprochen, aber Sie können es auch mit dem kommerziellen Produkt NGINX Plus verwenden. Der Unterschied besteht darin, dass Sie zuerst ein NGINX Plus-Image erstellen müssen, da NGINX Plus als kommerzielles Angebot nicht bei Docker Hub verfügbar ist. Glücklicherweise ist das ganz einfach.
Um ein NGINX Plus-Image zu generieren, erstellen Sie zuerst eine Docker-Datei . Die hier bereitgestellten Beispiele verwenden Alpine Linux 3.14 und Debian 11 (Bullseye) als grundlegende Docker-Images. Bevor Sie das NGINX Plus Docker-Image erstellen können, müssen Sie Ihre Version der Dateien nginx-repo.crt und nginx-repo.key herunterladen. NGINX Plus-Kunden finden sie im Kundenportal ; wenn Sie NGINX Plus kostenlos testen, wurden sie mit Ihrem Testpaket bereitgestellt. Kopieren Sie die Dateien in das Verzeichnis, in dem sich das Docker-File befindet (der Docker-Build-Kontext).
Wie bei NGINX Open Source sind die Zugriffs- und Fehlerprotokolle von NGINX Plus standardmäßig mit dem Docker-Protokollsammler verknüpft. Es sind keine Volumes angegeben, Sie können diese jedoch bei Bedarf hinzufügen. Alternativ kann jedes Dockerfile zum Erstellen von Basisimages verwendet werden, aus denen Sie, wie zuvor beschrieben, neue Images mit angegebenen Volumes erstellen können.
Wir geben in den Beispiel -Dockerfiles absichtlich keine NGINX Plus-Version an, damit Sie die Datei nicht bearbeiten müssen, wenn Sie auf eine neue Version von NGINX Plus aktualisieren. Wir haben jedoch kommentierte Versionen der entsprechenden Anweisungen beigefügt, damit Sie die Kommentierung aufheben können, wenn Sie die Datei versionsspezifisch machen möchten.
Ebenso haben wir Anweisungen (auskommentiert) beigefügt, die offizielle dynamische Module für NGINX Plus installieren.
Standardmäßig werden beim Erstellen eines Containers keine Dateien vom Docker-Host kopiert. Sie können jedem Dockerfile COPY-
Definitionen hinzufügen, oder das von Ihnen erstellte Image kann wie oben beschrieben als Grundlage für ein anderes Image verwendet werden.
Wenn sich die Dateien Dockerfile , nginx-repo.crt und nginx-repo.key im selben Verzeichnis befinden, führen Sie dort den folgenden Befehl aus, um ein Docker-Image mit dem Namen nginxplus zu erstellen (beachten Sie wie zuvor den Punkt am Ende):
# DOCKER_BUILDKIT=1 Docker-Build – no-cache – nginxplus – secret id=nginx-crt,src= Ihre Zertifikatsdatei – secret id=nginx-key,src= Ihre Schlüsseldatei .
Das Flag DOCKER_BUILDKIT=1
gibt an, dass wir Docker BuildKit zum Erstellen des Images verwenden, wie erforderlich, wenn die unten erläuterte Option --secret
eingeschlossen wird.
Die Option --no-cache
weist Docker an, das Image von Grund auf neu zu erstellen und stellt sicher, dass die neueste Version von NGINX Plus installiert wird. Wenn das Docker-File zuvor zum Erstellen eines Images verwendet wurde und Sie die Option --no-cache
nicht einschließen, verwendet das neue Image die Version von NGINX Plus aus dem Docker-Cache. (Wie erwähnt geben wir in der Docker-Datei absichtlich keine NGINX Plus-Version an, damit die Datei nicht bei jeder neuen Version von NGINX Plus geändert werden muss.) Lassen Sie die Option --no-cache
weg, wenn die Verwendung der NGINX Plus-Version aus dem zuvor erstellten Image akzeptabel ist.
Die Option --secret
übergibt das Zertifikat und den Schlüssel für Ihre NGINX Plus-Lizenz an den Docker-Build-Kontext, ohne das Risiko einzugehen, dass die Daten offengelegt werden oder zwischen den Docker-Build-Ebenen bestehen bleiben. Die Werte der ID
-Argumente können nicht geändert werden, ohne die Basis -Docker-Datei zu ändern, aber Sie müssen die src-
Argumente auf den Pfad zu Ihrem NGINX Plus-Zertifikat und Ihren Schlüsseldateien setzen (dasselbe Verzeichnis, in dem Sie das Docker-Image erstellen, wenn Sie die vorherigen Anweisungen befolgt haben).
Eine Ausgabe wie die folgende vom Befehl „docker
images
nginxplus“
zeigt an, dass das Image erfolgreich erstellt wurde:
# Docker-Bilder nginxplus REPOSITORY-TAG BILD-ID ERSTELLT VIRTUELLE GRÖSSE nginxplus aktuellste ef2bf65931cf vor 6 Sekunden 91,2 MB
Um einen Container mit dem Namen mynginxplus basierend auf diesem Image zu erstellen, führen Sie diesen Befehl aus:
# docker run --name mynginxplus -p 80:80 -d nginxplus
Sie können NGINX Plus-Container auf die gleiche Weise steuern und verwalten wie NGINX Open Source-Container .
NGINX, NGINX Plus und Docker arbeiten hervorragend zusammen. Unabhängig davon, ob Sie das NGINX Open Source-Image von Docker Hub verwenden oder Ihr eigenes NGINX Plus-Image erstellen, können Sie problemlos neue Instanzen von NGINX und NGINX Plus in Docker-Containern hochfahren und in Ihrer Kubernetes-Umgebung bereitstellen. Sie können auch problemlos neue Docker-Images aus den Basis-Images erstellen, wodurch sich Ihre Container noch einfacher steuern und verwalten lassen. Stellen Sie sicher, dass alle in Ihren Docker-Containern ausgeführten NGINX Plus-Instanzen durch Ihr Abonnement abgedeckt sind. Für weitere Einzelheiten wenden Sie sich bitte an das NGINX-Verkaufsteam .
Docker bietet noch viel mehr, als wir in diesem Artikel abdecken konnten. Laden Sie für weitere Informationen unser kostenloses O'Reilly eBook – Container Networking herunter: Von Docker zu Kubernetes – oder schauen Sie unter www.docker.com vorbei.
„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."