English version below
Ein Dockerfile ist der Grundbaustein eines Dockercontainers. In ihm wird festgehalten, was getan werden soll, wenn der Dockercontainer gestartet wird. Auf Basis eines Dockerfiles kann ein Docker-Image erstellt werden, mit dem dann ein Docker-Container aufgesetzt werden kann.
Aufbau eines Dockerfiles
Ein Dockerfile ist ein Textdokument, das mit dem Dateinamen „Dockerfile“ benannt ist. In diesem Dokument werden Befehle aufgelistet, die bei Start des Containers ausgeführt werden sollen. Dabei steht immer ein Befehl in einer Zeile und die Befehle werden von oben nach unten in der angegebenen Reihenfolge ausgeführt.
Basis
In den allermeisten Anwendungsfällen wird ein bestehendes Image als Basis verwendet und um weitere Befehle erweitert. Ein bestehendes Image aus dem DockerHub kann mit diesem Befehl eingebunden werden:
FROM image-Name
Zum Beispiel das Image für Neo4J:
FROM neo4j
Dieser Befehl sorgt dafür, dass Neo4J im Docker-Container „installiert“ wird.
Dateimanagement
Im Dockerfile lässt sich auch spezifizieren, welche Dateien im Container gespeichert werden sollen, und wo diese abzulegen sind. Mit dem Befehl WORKDIR
wird das Arbeitsverzeichnis innerhalb des Dockercontainers festgelegt. Das heißt, das hier angegebene Verzeichnis ist der Ausgangspunkt für alle weiteren Dateien und Verzeichnisse. In diesem Beispiel wird als Arbeitsverzeichnis der Pfad „/app“ angegeben.
WORKDIR /app
Um Dateien in den Dockercontainer zu übertragen kann der Befehl COPY
verwendet werden. Dieser kopiert eine Datei aus dem angegebenen lokalen Pfad in den angegebenen Pfad im Dockercontainer. Wenn man die Datei direkt in das Arbeitsverzeichnis legen möchte, kann man einen „.“ verwenden wie in diesem Beispiel:
COPY path-on-local path-in-container
COPY package.json .
Befehle ausführen
Mit dem Befehl RUN
können Befehle innerhalb des Dockercontainers wie auf einer Kommandozeile ausgeführt werden:
RUN command
RUN npm install
RUN mkdir neuer-ordner
Festplatten
Festplatten („Volumes“) im Dockercontainer ermöglichen es, Daten innerhalb des Dockercontainers zu speichern, die auch dann bestehen bleiben, wenn der Dockercontainer heruntergefahren wird. Sie werden von Docker gesondert verarbeitet und abgelegt und daher beim Herunterfahren nicht gelöscht. Um eine Festplatte auf einem angegebenen Pfad zu erschaffen, wird der Befehl VOLUME
genutzt.
VOLUME path-in-container
Dieser Befehl ist sehr praktisch, denn er kann genutzt werden, um eine Docker-Festplatte fortlaufend mit einem Ordner auf dem Host-System zu synchronisieren:
VOLUME host-path:container-path
Wenn man nun während der Container läuft eine Änderung im Ordner host-path vornimmt, wird diese Änderung in den Ordner container-path im Container übernommen.
Ports
Wenn eine Anwendung Informationen an einen Port sendet, der auch außerhalb des Containers erreichbar sein soll, so muss dies im Dockerfile angegeben werden:
PORT container-port:host-port
Die Ausgabe des Container-Ports wird dann an den entsprechenden Port des Hosts weitergeleitet. Die Portnummern müssen dabei nicht identisch sein.
PORT 3000:4000
In diesem Beispiel werden Informationen auf den Port 3000 an localhost:4000 weitergeleitet.
English version
A Dockerfile is the basic building block of a Docker container. It records what is to be done when the Docker container is started. Based on a Dockerfile, a Docker image can be created, which can then be used to set up a Docker container.
Structure of a Dockerfile
A Dockerfile is a text document named with the filename „Dockerfile“. This document lists commands that should be executed when the container is started. Each line contains one command and they are executed from top to bottom in the specified order.
Base image
In the vast majority of use cases, an existing image is used as a base and extended with additional commands. An existing image from DockerHub can be included with this command:
FROM image-name
For example, the image for Neo4J:
FROM neo4j
This command ensures that Neo4J is „installed“ in the Docker container.
File management
The Dockerfile also lets you specify which files to store in the container, and where to store them. The WORKDIR
command is used to specify the working directory within the Docker container. That means, the directory specified here is the starting point for all other files and directories. In this example, the path „/app“ is specified as the working directory.
WORKDIR /app
To transfer files to the Docker container, the COPY
command can be used. This copies a file from the specified local path to the specified path in the Docker container. If you want to put the file directly into the working directory, you can use a „.“ as in this example:
COPY path-on-local path-in-container.
COPY package.json .
Run commands
The RUN
command can be used to execute commands inside the Docker container as if on a command line:
RUN command
RUN npm install
RUN mkdir new-folder
Volumes
Volumes in the Docker container allow you to store data inside the Docker container that persists even when the Docker container is shut down. They are processed and stored separately by Docker and are therefore not deleted during shutdown. To create a disk on a specified path, the VOLUME
command is used.
VOLUME path-in-container
This command is very handy because it can be used to continuously synchronize a Docker volume with a folder on the host system:
VOLUME host-path:container-path
Now, if you make a change in the host-path folder while the container is running, that change will be reflected in the container-path folder in the container.
Ports
If an application sends information to a port that should also be accessible outside the container, this must be specified in the Dockerfile:
PORT container-port:host-port
The output of the container port is then forwarded to the corresponding port of the host. The port numbers do not have to be identical.
PORT 3000:4000
In this example, information on port 3000 is forwarded to localhost:4000.