Ausführen von Nginx in einem Docker-Container unter Ubuntu 14.04

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.

Related