Читать книгу Kubernetes - Kelsey Hightower - Страница 27
2.2.1Dockerfiles
ОглавлениеEin Dockerfile kann genutzt werden, um das Erstellen eines Docker-Container-Image zu automatisieren.
Beginnen wir damit, ein Anwendungs-Image für ein einfaches Node.js-Programm zu bauen. Dieses Beipiel würde für viele andere dynamische Sprachen wie Python oder Ruby sehr ähnlich aussehen.
Die einfachsten npm/Node/Express-Anwendungen haben zwei Dateien: package.json (Listing 2–1) und server.js (Listing 2–2). Legen Sie diese in einem Verzeichnis ab und führen Sie dann npm install express --save aus, um eine Abhängigkeit von Express einzurichten und es zu installieren.
{
"name": "simple-node",
"version": "1.0.0",
"description": "Eine einfache Beispielanwendung", "main": "server.js",
"scripts": {
"start": "node server.js" },
"author": ""
}
Listing 2–1 package.json
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!'); });
app.listen(3000, function () {
console.log('Listening on port 3000!');
console.log(' http://localhost:3000');
});
Listing 2–2 server.js
Um das in einem Docker-Image zu verpacken, müssen wir zwei zusätzliche Dateien erstellen: .dockerignore (Listing 2–3) und das Dockerfile (Listing 2–4). Bei Letzterem handelt es sich um ein Rezept zum Bauen des Container-Image, während .dockerignore die Dateien definiert, die beim Kopieren der Dateien in das Image ignoriert werden sollen. Eine vollständige Beschreibung der Syntax des Dockerfiles finden Sie auf der Docker-Website unter https://dockr.ly/2XUanvl.
node_modules
Listing 2–3 .dockerignore
# Beginne mit einem Node.js 10 (LTS) Image
FROM node:10
# Verzeichnis im Image, in dem alle Befehle laufen werden
WORKDIR /usr/src/app
# Package-Dateien kopieren und Abhängigkeiten installieren
COPY package*.json ./
RUN npm install
# Alle App-Dateien in das Image kopieren
COPY . .
# Standardbefehl, der beim Starten des Containers laufen soll
CMD [ "npm", "start" ]
Listing 2–4 Dockerfile
1 Jedes Dockerfile baut auf anderen Container-Images auf. Diese Zeile gibt an, dass wir vom Image node:10 auf dem Docker Hub ausgehen. Dabei handelt es sich um ein vorkonfiguriertes Image mit Node.js 10.
2 Diese Zeile legt das Arbeitsverzeichnis im Container-Image für alle folgenden Befehle fest.
3 Diese zwei Zeilen initialisieren die Abhängigkeiten für Node.js. Zuerst kopieren wir die Package-Dateien in das Image. Dazu gehören package.json und package-lock.json. Dann führt die RUN-Anweisung den passenden Befehl im Container aus, um die notwendigen Abhängigkeiten zu installieren.
4 Jetzt kopieren wir die restlichen Programmdateien in das Image. Das ist alles außer node_modules, da dies durch die Datei .dockerignore ausgeschlossen wurde.
5 Schließlich legen wir noch den Befehl fest, der ausgeführt werden soll, wenn der Container gestartet wird.
Führen Sie den folgenden Befehl aus, um das Docker-Image simple-node zu erstellen:
$ docker build -t simple-node .
Wollen Sie dieses Image ausführen, können Sie das mit folgendem Befehl tun. Sie können dann http://localhost:3000 ansteuern, um auf das Programm zuzugreifen, das im Container läuft:
$ docker run --rm -p 3000:3000 simple-node
Unser Image simple-node lebt jetzt in der lokalen Docker-Registry, in der es gebaut wurde, und es steht auch nur einer einzelnen Maschine zur Verfügung. Seine wirkliche Mächtigkeit kann Docker erst ausspielen, wenn Images auf Tausenden von Maschinen und in der größeren Docker-Community verfügbar gemacht werden.