Eine der häufigsten Workloads von Docker ist die Containerisierung von Webservern wie NGINX und Apache, um eine leistungsstarke Content-Delivery-Flotte auszuführen, die einfach automatisch skaliert und verwaltet werden kann. Wir zeigen Ihnen, wie Sie es mit NGINX einrichten.
Einrichten von NGINX in Docker
Docker ist eine Containerisierungsplattform, die verwendet wird, um Ihre Anwendung und ihren gesamten Code in ein einfach zu verwaltendes Container-Image zu packen. Der Prozess dafür ist ziemlich ähnlich wie beim Einrichten eines neuen Servers – der Container ist ein unbeschriebenes Blatt, also müssen Sie Abhängigkeiten installieren, Ihren Code erstellen, die Build-Artefakte kopieren und wieder kopieren jede Konfiguration. Glücklicherweise müssen Sie nicht so viel automatisieren. NGINX verfügt bereits über einen öffentlich verfügbaren Docker-Container, den Sie als Ausgangspunkt für Ihre Anwendung verwenden können.
Abhängig von der Anwendung, die Sie containerisieren, kann dies natürlich etwas komplizierter sein. Wenn Sie ein CMS wie WordPress bereitstellen, benötigen Sie wahrscheinlich eine externe Datenbank, da Container nicht darauf ausgelegt sind, dauerhaft zu sein. Ein guter Ausgangspunkt für WordPress wäre insbesondere der Docker-Container von WordPress.
Um etwas mehr Aufwand als eine einfache Hello World-Webseite zu haben, erstellen wir ein neues Projektverzeichnis und initialisieren eine einfache Vue.js-Anwendung. Ihre Konfiguration unterscheidet sich je nach Inhalt, den Sie bereitstellen, aber die Grundidee ist dieselbe.
Erstellen Sie im Stammverzeichnis Ihres Projekts eine neue Datei mit dem einfachen Namen Dockerfile
ohne Verlängerung. Dies fungiert als Build-Konfiguration. Standardmäßig ist der Container leer und enthält nur die Anwendungen und Abhängigkeiten, die mit dem Basisimage installiert werden. Sie müssen den Code Ihrer Anwendung kopieren; Wenn Sie nur statische Inhalte bereitstellen, ist dies einfach, aber wenn Sie mit serverseitigen Anwendungen wie WordPress arbeiten, müssen Sie möglicherweise zusätzliche Abhängigkeiten installieren.
Die folgende Konfiguration ist ziemlich einfach. Da dies eine Knotenanwendung ist, müssen wir npm run build
ausführen um einen vertriebsfertigen Build zu erhalten. Wir können das alles im Dockerfile handhaben, indem wir einen zweiteiligen Container-Build einrichten:
FROM node:latest as build-stage WORKDIR /src COPY package*.json ./ RUN npm install COPY ./ . RUN npm run build FROM nginx as production-stage RUN mkdir /src COPY --from=build-stage /src/dist /src COPY nginx.conf /etc/nginx/nginx.conf
Die erste Zeile ist FROM
Befehl zieht den node
Container von Docker Hub und erstellt einen neuen Container namens build-stage
. Die nächste cd
’s in dieses Verzeichnis und kopiert die package.json
. Dann wird npm install
ausgeführt , kopiert dann den Code der App und startet den Build-Prozess. Wenn Ihre Anwendung aus dem Quellcode erstellt werden muss, sollten Sie etwas Ähnliches tun.
Der nächste Zustand zieht den nginx
Container, der als Produktionsbereitstellung dienen soll. Es macht den src
Verzeichnis und kopiert dann aus der build-stage
Container, der /src/dist/
Ordner, der die Build-Artefakte enthält, in den Ordner /src
Ordner des Produktionscontainers. Es kopiert dann eine NGINX-Konfigurationsdatei.
Sie sollten auch eine neue Datei mit dem Namen .dockerignore
erstellen , um es anzuweisen, node_modules
zu ignorieren sowie alle Build-Artefakte von lokalen Builds.
**/node_modules **/dist
Das Dockerfile verweist auf eine nginx.conf
, die Sie ebenfalls erstellen müssen. Wenn Sie eine komplexere Konfiguration mit mehreren Konfigurationen in /sites-available
ausführen , möchten Sie vielleicht einen neuen Ordner für Ihre NGINX-Konfiguration erstellen und diesen hinüber kopieren.
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /src; index index.html; try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
Dies ist nur ein HTTP-Webserver. Der einfachste Weg, HTTPS einzurichten, wäre, den certbot von LetsEncrypt lokal auszuführen und das Zertifikat von /etc/letsencrypt/live/example.com/fullchain.pem
zu kopieren in den Produktionscontainer. Diese Zertifikate sind 90 Tage gültig, Sie müssen sie also regelmäßig erneuern. Sie können dies als Teil des Containererstellungsprozesses automatisieren.
Sobald alles in Ordnung ist, können Sie den Docker-Build ausführen:
docker build . -t my-app
Dadurch wird der Container als my-app
erstellt , danach können Sie es frei taggen und zur späteren Bereitstellung an ECS oder eine Containerregistrierung senden. Sie sollten es natürlich zuerst lokal mit docker run
testen Bindung localhost:8080
an Port 80 der NGINX-Instanz:
docker run -d -p 8080:80 my-app
Sobald Sie ein erstelltes Image haben, ist die Bereitstellung in der Produktion ziemlich einfach. Sie können unseren Leitfaden zum Einrichten einer Containerbereitstellung mit automatischer Skalierung auf AWS ECS lesen, um mehr zu erfahren, oder unseren Leitfaden zum Einrichten einer CI/CD-Pipeline mit Containern lesen, um automatisierte Builds und Bereitstellungen zu handhaben.
VERBINDUNG: Was ist eine PEM-Datei und wie wird sie verwendet?