Einführung
Dieses Tutorial zeigt, wie Sie Nginx in einem Docker-Container bereitstellen.
Durch die Containerisierung von Nginx reduzieren wir den Systemadministratoraufwand. Wir müssen Nginx nicht länger über einen Paketmanager verwalten oder aus dem Quellcode erstellen. Mit dem Docker-Container können wir einfach den gesamten Container ersetzen, wenn eine neue Version von Nginx veröffentlicht wird. Wir müssen nur die Nginx-Konfigurationsdatei und unseren Inhalt pflegen.
Nginx beschreibt sich selbst als:
_ nginx [engine x] ist ein HTTP- und Reverse-Proxy-Server, ein Mail-Proxy-Server und ein generischer TCP-Proxy-Server, ursprünglich geschrieben von Igor Sysoev. _
In der Praxis verwenden viele Systemadministratoren Nginx, um Webinhalte bereitzustellen, von Flatfile-Websites bis hin zu Upstream-APIs in NodeJS. In diesem Tutorial werden wir eine grundlegende Webseite bereitstellen, damit wir uns auf die Konfiguration von Nginx mit einem Docker-Container konzentrieren können.
Docker-Container sind eine beliebte Form einer relativ alten Betriebspraxis: Containerisierung. Containerisierung unterscheidet sich von Virtualisierung darin, dass Virtualisierung die Hardware abstrahiert, während Containerisierung auch das Basisbetriebssystem abstrahiert. In der Praxis bedeutet dies, dass wir eine Anwendung (oder eine Gruppe von Anwendungen) in einen Container (oder Container) einwickeln können, um sie modular, tragbar, zusammensetzbar und leichtgewichtig zu machen.
Diese Portabilität bedeutet, dass Sie die Docker Engine (auch als Docker Core und nur als Docker bezeichnet) auf einer Vielzahl von Betriebssystemen installieren können und jeder funktionierende Container, der von irgendjemandem geschrieben wurde, darauf ausgeführt werden kann.
Wenn Sie mehr über Docker erfahren möchten, lesen Sie das introductory Docker tutorial.
In diesem Artikel installieren wir die Docker Engine unter Ubuntu 14.04.
Wir werden die aktuelle stabile Version von Docker für Ubuntu installieren, nämlich 1.8.1.
Dieses Tutorial richtet sich an Nginx-Benutzer, die mit Docker noch nicht vertraut sind. Wenn Sie nur die nackten Befehle zum Einrichten Ihres Nginx-Containers benötigen, können Sie Schritt 1 ausführen und dann mit Schritt 5 fortfahren.
Wenn Sie Schritt für Schritt auf Ihren Container aufbauen und mehr über die Portzuordnung und den getrennten Modus erfahren möchten, befolgen Sie das gesamte Lernprogramm.
Voraussetzungen
Um Nginx in Containern zu verpacken, führen Sie bitte die folgenden Schritte aus:
-
Richten Sie einen Ubuntu 14.04 server ein, vorzugsweise mit https://www.digitalocean. de / community / tutorials / wie-man-ssh-schlüssel-mit-digitalocean-droplets [SSH-schlüssel] aus sicherheitsgründen benutzt
-
Richten Sie einen sudo user ein
-
Überprüfen Sie Ihre Kernel-Version
Docker 1.8.1 stützt sich auf einige relativ neue Kernelfunktionen. Stellen Sie daher sicher, dass der Kernel den Stand * 3.10 * oder höher hat. Auf einem neuen Image wird ein ziemlich neuer Kernel ausgeführt, aber wenn Sie dies überprüfen müssen, führen Sie einfach "+ uname -r +" aus.
uname -r
Wir haben die Ausgabe eines neuen Ubuntu 14.04-Droplets unten aufgeführt, das älter als 3.10 ist. Sie sollten sich also keine Sorgen machen, es sei denn, Sie führen dies unter https://www.digitalocean.com/community/tutorials aus / How-to-Update-ein-Digitalocean-Server-s-Kernel [älteres Bild].
Output3.13.0-57-generic
Schritt 1 - Docker installieren
Docker hostet ein Startskript, um Docker auf Ihrem Computer zum Laufen zu bringen. Wir können einfach den Befehl ausführen:
sudo curl -sSL https://get.docker.com/ | sh
Sobald dies abgeschlossen ist, sehen Sie die installierte Version wie unten gezeigt (Ihre Anzeige ist möglicherweise neuer; dies ist in Ordnung) und einige Anweisungen zum Ausführen als Nicht-Root / ohne Sudo. Wir durchlaufen dieses Lernprogramm jedoch wie einen Sudo-Benutzer. In diesem Lernprogramm müssen Sie sich also keine Gedanken darüber machen.
Output Client:
Version: 1.8.3
API version: 1.20
Go version: go1.4.2
Git commit: f4bf5c7
Built: Mon Oct 12 05:37:18 UTC 2015
OS/Arch: linux/amd64
Server:
Version: 1.8.3
API version: 1.20
Go version: go1.4.2
Git commit: f4bf5c7
Built: Mon Oct 12 05:37:18 UTC 2015
OS/Arch: linux/amd64
Optional: Führen Sie den Container + hello-world +
aus, um sicherzustellen, dass alles wie erwartet funktioniert.
sudo docker run hello-world
Sie sollten eine Ausgabe ähnlich der unten gezeigten sehen.
Output $ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Already exists
library/hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:d5fbd996e6562438f7ea5389d7da867fe58e04d581810e230df4cc073271ea52
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/userguide/
Damit sind wir in der Lage, in die Grundlagen von Docker einzutauchen.
(Optional) Schritt 2 - Überprüfen der Container-Grundlagen: Ausführen, Auflisten, Entfernen
In diesem Abschnitt wird gezeigt, wie ein Basiscontainer ausgeführt und anschließend entfernt wird. Wenn Sie bereits wissen, wie man Docker im Allgemeinen verwendet, und zum Nginx-Teil springen möchten, fahren Sie mit Schritt 5 fort.
Wir haben den Docker-Client als Teil unserer Docker-Installation installiert, sodass wir Zugriff auf das Befehlszeilentool haben, mit dem wir mit unseren Containern interagieren können.
Wenn wir den folgenden Befehl ausführen;
sudo docker ps -a
Sie sollten eine Ausgabe ähnlich der folgenden erhalten;
Output CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3b149c3ddea hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago
Wir können einige grundlegende Informationen über unseren Container sehen.
Sie werden feststellen, dass es einen unsinnigen Namen wie "++" hat. Diese Namen werden automatisch generiert, wenn Sie beim Erstellen des Containers keinen angeben.
Wir können auch sehen, dass der Beispielcontainer "+ hello-world" vor 3 Minuten ausgeführt und vor 3 Minuten beendet wurde.
Wenn wir diesen Container mit diesem Befehl erneut ausführen (indem wir "++" durch Ihren eigenen Containernamen ersetzen):
sudo docker start
Führen Sie dann den Befehl aus, um die Container aufzulisten:
sudo docker ps -a
Wir sollten jetzt sehen, dass der Container vor kurzem gelaufen ist;
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3b149c3ddea hello-world "/hello" 4 minutes ago Exited (0) 9 seconds ago
Standardmäßig führen Docker-Container die zugewiesenen Befehle aus und beenden sie dann.
Einige Container werden so eingerichtet, dass sie eine Liste von Aufgaben durchlaufen und beendet werden, während andere auf unbestimmte Zeit ausgeführt werden.
Nachdem wir einige Docker-Grundlagen durchgearbeitet haben, entfernen wir das "+ Hallo-Welt +" - Bild, da es nicht mehr benötigt wird. .
sudo docker rm
Als nächstes werden wir Nginx verwenden.
(Optional) Schritt 3 - Lernen, wie der Port verfügbar gemacht wird
In diesem Abschnitt laden wir das Nginx Docker-Image herunter und zeigen Ihnen, wie Sie den Container so ausführen, dass er als Webserver öffentlich zugänglich ist.
Standardmäßig kann nicht über das Internet auf Container zugegriffen werden. Daher müssen wir den internen Port des Containers dem Port des Droplets zuordnen. Das wird Ihnen dieser Abschnitt beibringen!
Zunächst erhalten wir jedoch das Nginx-Image.
Führen Sie den folgenden Befehl aus, um das Nginx Docker-Image abzurufen:
sudo docker pull nginx
Dadurch werden alle erforderlichen Komponenten für den Container heruntergeladen. Docker speichert diese im Cache. Wenn wir also den Container ausführen, müssen wir die Container-Images nicht jedes Mal herunterladen.
Docker unterhält eine Site mit dem Namen Dockerhub, ein öffentliches Repository für Docker-Dateien (einschließlich offizieller und von Benutzern übermittelter Bilder). Das Bild, das wir heruntergeladen haben, ist das offizielle Nginx-Bild, das uns erspart, ein eigenes Bild erstellen zu müssen.
Beginnen wir unseren Nginx Docker-Container mit dem folgenden Befehl:
sudo docker run --name docker-nginx -p 80:80 nginx
-
+ run +
ist der Befehl zum Erstellen eines neuen Containers -
Das
+ - name +
Flag gibt den Namen des Containers an. -
+ -p +
gibt den Port an, den wir im Format+ -p local-machine-port: internal-container-port +
verfügbar machen. In diesem Fall ordnen wir Port 80 im Container Port 80 auf dem Server zu -
+ nginx
ist der Name des Bildes auf dockerhub (wir haben dies zuvor mit dem Befehl pull heruntergeladen, Docker tut dies jedoch automatisch, wenn das Bild fehlt)
Das ist alles, was wir brauchen, um Nginx auf die Beine zu stellen! Fügen Sie die IP-Adresse Ihres Droplets in einen Webbrowser ein und Sie sollten die Seite "Willkommen bei Nginx!" Von Nginx sehen.
Sie werden auch in Ihrer Shell-Sitzung feststellen, dass das Protokoll für Nginx aktualisiert wird, wenn Sie Anforderungen an Ihren Server senden, da wir unseren Container interaktiv ausführen.
Drücken Sie die Tastenkombination "+ STRG + C +", um zu unserer Shell-Sitzung zurückzukehren.
Wenn Sie versuchen, die Seite jetzt zu laden, wird die Seite "Verbindung abgelehnt" angezeigt. Das liegt daran, dass wir unseren Container schließen. Wir können dies mit diesem Befehl überprüfen:
sudo docker ps -a
Sie sollten etwas sehen, das der unten gezeigten Ausgabe ähnelt.
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05012ab02ca1 nginx "nginx -g 'daemon off" 57 seconds ago Exited (0) 47 seconds ago docker-nginx
Wir können sehen, dass unser Docker-Container verlassen wurde.
Nginx ist nicht sehr nützlich, wenn das Container-Image angehängt werden muss, damit es funktioniert. Im nächsten Schritt zeigen wir Ihnen, wie Sie den Container trennen, damit er unabhängig ausgeführt werden kann.
Entfernen Sie den vorhandenen Container + docker-nginx +
mit diesem Befehl:
sudo docker rm docker-nginx
Im nächsten Schritt zeigen wir Ihnen, wie Sie es im getrennten Modus ausführen.
(Optional) Schritt 4 - Erlernen der Ausführung im getrennten Modus
Erstellen Sie mit diesem Befehl einen neuen, getrennten Nginx-Container:
sudo docker run --name docker-nginx -p 80:80 -d nginx
Wir haben das + -d +
Flag hinzugefügt, um diesen Container im Hintergrund auszuführen.
Die Ausgabe sollte einfach die ID des neuen Containers sein.
Wenn wir den Befehl list ausführen:
sudo docker ps
Wir werden einige Dinge in der Ausgabe sehen, die wir zuvor noch nicht gesehen haben.
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b91f3ce26553 nginx "nginx -g 'daemon off" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 443/tcp docker-nginx
Wir können sehen, dass anstelle von + Exited (0) X minutes ago +
wir jetzt + Up About a minute +
haben, und wir können auch das Port-Mapping sehen.
Wenn wir in unserem Browser die IP-Adresse unseres Servers erneut aufrufen, wird die Seite "Willkommen bei nginx!" Erneut angezeigt. Dieses Mal wird es im Hintergrund ausgeführt, da wir das "+ -d +" - Flag angegeben haben, das Docker anweist, diesen Container im getrennten Modus auszuführen.
Jetzt haben wir eine laufende Instanz von Nginx in einem getrennten Container!
Es ist jedoch noch nicht nützlich genug, da wir die Konfigurationsdatei nicht bearbeiten können und der Container keinen Zugriff auf eine unserer Website-Dateien hat.
Stoppen Sie den Container, indem Sie den folgenden Befehl ausführen:
sudo docker stop docker-nginx
Nachdem der Container jetzt gestoppt ist (Sie können mit + sudo docker ps -a +
überprüfen, ob Sie sicher sein möchten), können wir ihn entfernen, indem Sie den folgenden Befehl ausführen;
sudo docker rm docker-nginx
Jetzt gelangen wir zur endgültigen Version unseres Containers, mit einem kurzen Stopp, um eine benutzerdefinierte Website-Datei zu generieren.
Schritt 5 - Erstellen einer Webseite für Nginx
In diesem Schritt wird eine benutzerdefinierte Indexseite für Ihre Website erstellt. Dieses Setup ermöglicht es uns, dauerhaften Website-Inhalt zu haben, der außerhalb des (vorübergehenden) Containers gehostet wird.
Erstellen Sie ein neues Verzeichnis für den Inhalt unserer Website in unserem Ausgangsverzeichnis und wechseln Sie in dieses Verzeichnis, indem Sie die folgenden Befehle ausführen.
mkdir -p ~/docker-nginx/html
cd ~/docker-nginx/html
Jetzt erstellen wir eine HTML-Datei (wir zeigen die Befehle für Vim, aber Sie können einen beliebigen Texteditor verwenden).
vim index.html
Rufen Sie den Einfügemodus mit + i +
auf. Fügen Sie den unten gezeigten Inhalt ein (oder fügen Sie Ihr eigenes HTML-Markup hinzu).
<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous">
<title>Docker nginx Tutorial</title>
</head>
<body>
<div class="container">
<h1>Hello Digital Ocean</h1>
<p>This nginx page is brought to you by Docker and Digital Ocean</p>
</div>
</body>
</html>
Wenn Sie mit HTML vertraut sind, werden Sie feststellen, dass dies eine sehr einfache Webseite ist. Wir haben ein "+ <link> +" - Tag eingefügt, das auf ein CDN für Bootstrap verweist (ein CSS-Framework, das Ihrer Webseite eine Sammlung ansprechender Stile verleiht). Sie können mehr über Bootstrap lesen.
Wir können diese Datei jetzt speichern, indem wir "+ ESC " und dann ": wq " und " ENTER +" drücken:
-
write (
+ w +
) weist Vim an, die Änderungen in die Datei zu schreiben -
quit (
+ q +
) weist Vim an, das Programm zu verlassen
Wir haben jetzt eine einfache Indexseite, die die Standard-Nginx-Zielseite ersetzt.
Schritt 6 - Verknüpfen des Containers mit dem lokalen Dateisystem
In diesem Abschnitt fassen wir alles zusammen. Wir starten unseren Nginx-Container so, dass er über Port 80 im Internet verfügbar ist, und verbinden ihn mit dem Inhalt unserer Website auf dem Server.
-
Hintergrundinformationen zu Bänden; Das heißt, eine Verknüpfung zu permanentem Serverinhalt aus Ihrem Container: *
Mit Docker können wir Verzeichnisse aus dem lokalen Dateisystem unserer virtuellen Maschine mit unseren Containern verknüpfen.
In unserem Fall müssen wir unserem Container die Dateien zum Rendern geben, da wir Webseiten servern möchten.
Wir könnten die Dateien als Teil einer Docker-Datei in den Container kopieren oder sie nachträglich in den Container kopieren, aber beide Methoden belassen unsere Website in einem statischen Zustand innerhalb des Containers. Durch die Verwendung der Datenvolumen-Funktion von Docker können wir eine symbolische Verbindung zwischen dem Dateisystem des Droplets und dem Dateisystem des Containers herstellen. Auf diese Weise können wir unsere vorhandenen Webseiten-Dateien bearbeiten und neue in das Verzeichnis aufnehmen, worauf unser Container automatisch zugreift. Wenn Sie mehr über Docker und Volumes erfahren möchten, lesen Sie die data volume documentation.
Der Nginx-Container ist standardmäßig so eingerichtet, dass unter "+ / usr / share / nginx / html +" nach einer Indexseite gesucht wird. In unserem neuen Docker-Container müssen wir ihm daher Zugriff auf unsere Dateien an diesem Speicherort gewähren.
-
Herstellen des Links: *
Dazu verwenden wir das Flag "+ -v ", um einen Ordner von unserem lokalen Computer (" ~ / docker-nginx / html ") einem relativen Pfad im Container (" / usr / share / nginx /") zuzuordnen. HTML + `).
Wir können dies erreichen, indem wir den folgenden Befehl ausführen:
sudo docker run --name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx
Wir können sehen, dass der neue Zusatz zum Befehl "+ -v ~ / docker-nginx / html: / usr / share / nginx / html +" unser Volume-Link ist.
-
+ -v +
gibt an, dass ein Volume verknüpft wird -
Der Teil links vom ": +" ist der Speicherort Ihrer Datei / Ihres Verzeichnisses auf Ihrer virtuellen Maschine (" ~ / docker-nginx / html").
-
Der Teil rechts vom ": +" ist der Ort, zu dem wir in unserem Container verlinken (" / usr / share / nginx / html +").
Wenn Sie nach Ausführung dieses Befehls mit Ihrem Browser auf die IP-Adresse Ihres DigitalOcean Droplets zeigen, sollte die erste Überschrift von * Hello Digital Ocean * (oder einer beliebigen in Schritt 5 erstellten Webseite) angezeigt werden.
Wenn Sie mit den anderen Nginx-Standardeinstellungen zufrieden sind, sind Sie bereit.
Sie können weitere Inhalte in das Verzeichnis "+ ~ / docker-nginx / html / +" hochladen. Diese werden dann Ihrer Live-Website hinzugefügt.
Wenn wir beispielsweise unsere Indexdatei ändern und Ihr Browserfenster neu laden, können wir sehen, dass es in Echtzeit aktualisiert wird. Auf diese Weise könnten wir eine ganze Site aus flachen HTML-Dateien erstellen, wenn wir wollten. Wenn wir beispielsweise eine Seite "+ about.html " hinzugefügt haben, können wir unter " http: /// about.html +" darauf zugreifen, ohne mit dem Container interagieren zu müssen.
(Optional) Schritt 7 - Verwenden Sie Ihre eigene Nginx-Konfigurationsdatei
Dieser Abschnitt richtet sich an fortgeschrittene Benutzer, die ihre eigene Nginx-Konfigurationsdatei mit ihrem Nginx-Container verwenden möchten. Überspringen Sie diesen Schritt, wenn Sie keine benutzerdefinierte Konfigurationsdatei haben, die Sie verwenden möchten.
Gehen wir ein Verzeichnis zurück, damit wir nicht in unser öffentliches HTML-Verzeichnis schreiben:
cd ~/docker-nginx
Wenn Sie sich die Standardkonfigurationsdatei ansehen möchten, kopieren Sie sie einfach mit dem Docker-Befehl copy:
sudo docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf
Da wir eine benutzerdefinierte "+ .conf +" - Datei für Nginx verwenden, müssen wir den Container neu erstellen.
Stoppen Sie zuerst den Container:
sudo docker stop docker-nginx
Entfernen Sie es mit:
sudo docker rm docker-nginx
Jetzt können Sie die Standarddatei lokal bearbeiten (um ein neues Verzeichnis bereitzustellen oder um den Datenverkehr mit einem "+ proxy_pass +" an eine andere App / einen anderen Container weiterzuleiten, wie Sie es bei einer regulären Nginx-Installation tun würden). Informationen zur Konfigurationsdatei von Nginx finden Sie in unserem Nginx config file guide.
Nachdem Sie Ihre benutzerdefinierte Konfigurationsdatei gespeichert haben, können Sie den Nginx-Container erstellen. Fügen Sie einfach ein zweites "+ -v +" - Flag mit den entsprechenden Pfaden hinzu, um einem neuen Nginx-Container die entsprechenden Links zu geben, die von Ihrer eigenen Konfigurationsdatei ausgeführt werden können.
sudo docker run --name docker-nginx -p 80:80 -v ~/docker-nginx/html:/usr/share/nginx/html -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx
Dieser Befehl verknüpft die benutzerdefinierten Webseiten auch weiterhin mit dem Container.
Bitte beachten Sie, dass Sie den Container mit dem Befehl + docker restart +
neu starten müssen, wenn Sie nach dem Starten des Containers Änderungen an Ihrer Konfigurationsdatei vornehmen, da Nginx bei Änderungen der Konfigurationsdatei kein Hot-Reload durchführt:
sudo docker restart docker-nginx
Fazit
Sie haben jetzt einen laufenden Nginx-Container, der eine benutzerdefinierte Webseite bedient.
Wir empfehlen, von hier aus auf Dockers container linked nachzulesen, wenn Sie mehr über das Verknüpfen von Containern erfahren möchten, um Nginx als Reverse-Proxy für die Bedienung anderer Container zu verwenden Web-Apps.
Wenn Sie eine Gruppe von Containern verwalten möchten, z. B. einen App-Container, einen Datenbankcontainer und diesen Nginx-Container, lesen Sie Docker Compose.