DevEnv: Docker und Elasticsearch
Published on 16/01/2016
4 min read
In category
devenv
Docker, eine simple Art seine Umgebung modular und wiederverwendbar aufzubauen. Da ich schrittweise exemplarisch eine ganze Entwicklungsumgebung auf Docker darstellen möchte, stelle ich heute vor, wie man Elasticsearch innerhalb eines eigenen Docker Container zum Einsatz bringt.
Überblick
In einem früheren Artikel habe ich den Einsatz eines AppServers mit Docker beschrieben. Heute behandelt der Artikel Elasticsearch. Mit Elasticsearch [1] gibt es eine tolle Such-Engine, mit der sich unterschiedliche Daten indizieren und mittels einer mächtigen Suchfunktionalität diese durchsuchbar machen lassen. In diesem Artikel wird beschrieben, wie Elasticsearch in einem eigenen Container bereitgestellt werden kann. Dabei wird die Konfiguration ausgelagert, so dass Änderungen an der Konfiguration keine Auswirkung auf das Docker Image haben. Genauso werden die indizierten Daten nicht innerhalb des Containers gehalten, sondern in einem externen Volume.
Docker Volumes
Docker Volumes sind Verzeichnisse die innerhalb bzw. zwischen Container verwendet werden können, siehe [2]. Zu beachten ist, dass Docker für die Verwaltung von Volumes nicht zuständig ist. D.h. das Aufräumen oder Löschen eines Volume muss explizit durchgeführt werden und wird z.B. nicht automatisch mit der Löschung eines Containers ausgeführt.
Um ein Volume einzubinden kann bei docker run der -v Parameter verwendet werden, oder innerhalb eines Dockerfile die VOLUME-Anweisung.
docker run --name TestApp -v /src/data:/dst/data para1
Hier wurde nun ein Host-Verzeichnis (/src/data) als Volume in dem Docker Container unter dem Mount-Punkt /dst/data eingebunden.
Dies ist in unserem Beispiel sinnvoll, da wir somit die Elasticsearch-Konfiguration nicht im Container halten wollen sondern extern einbinden wollen.
Einrichtung
Um Elasticsearch in einem eigenen Docker Container laufen zu lassen, kann u.a. das folgende Dockerfile zur Erstellung eines Images verwendet werden:
# elasticsearch/Dockerfile
#
# intent: Docker image containing elasticsearch
# base : dev.center-of.info/jdk8
#
# hint: we do not expose any ports here. This should be done with the docker run command
#
# 30.05.2015
# Use own jdk8 image as base
FROM dev.center-of.info/jdk8:v1
# change into the tmp directory
RUN mkdir -p /tmp/a1
WORKDIR /tmp/a1
# create directory for elasticsearch
RUN mkdir -p /opt/elastic/elasticsearch
# #############################################
# Elasticsearch
# Elasticsearch variables
ENV ES_VERSION 1.5.2
ENV ES_DIR /opt/elastic/elasticsearch
RUN curl -k https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-${ES_VERSION}.tar.gz | gunzip | tar -x \
&& cp -R elasticsearch-${ES_VERSION}/* ${ES_DIR}
# set the work directory to the main ES directory
WORKDIR ${ES_DIR}
# Overwrite the default entrypoint and command/parameters
ENTRYPOINT ["./bin/elasticsearch"]
CMD []
# ##############################################
# Clean up
RUN rm -R /tmp/a1
Hier wird Elasticsearch (hier eine alte Version 1.5.2) heruntergeladen und entpackt. Als Entrypoint wird das Startskript verwendet. Jegliche Commands – speziell vom Basis-Dockerfile – werden gelöscht. Diese können mittels docker run mitgegeben werden.
Zum Bauen reicht ein
docker build -t dev.center-of.info/elasticsearch:v1 .
Ausführung
Bevor wir diesen Docker Container starten, müssen wir ein paar Vorkehrungen durchführen. Die Konfiguration und die indizierten Dateien sollen in einem externen Volume gehalten werden. Dafür müssen wir die Elasticsearch Konfiguration auch entsprechend anpassen:
# Path to directory where to store the data (separate multiple locations by comma):
#
path.data: /data/data
#
# Path to log files:
#
path.logs: /data/logs
D.h. die Log- und Index-Dateien werden in einem /data/*-Verzeichnis abgelegt. Dieses /data-Verzeichnis wird der Mount-Point unseres Volumes sein. Die Elasticsearch Konfiguration elasticsearch.yml wird unter /data/config zu finden sein.
Da wir die Standard-Ports nicht nutzen wollen, werden diese zusätzlich in elasticsearch.yml angepasst:
http.port: 10200
transport.tcp.port: 10300
Unter Berücksichtigung dieser Einstellungen sieht docker run nun wie folgt aus
docker run --rm -it --name dockerESv1 -v /home/vmuser/
elasticsearch/data:/data --expose=10200-10400 -p 10200-10400:10200-10400 dev.center-of.info/elasticsearch:v1 -Des.config=/data/config/elasticsearch.yml
Hier wurde nun ein Docker Container gestartet, der einen neuen Volume bekommt (/data), bestimmte Ports bereitstellt. Zusätzlich wird dem Entrypoint (hier das Startskript von Elasticsearch) ein Command-Argument hinzugefügt: Der Pfad zur Elasticsearch Konfiguration.
Nach dem Start werden die Log- und Index-Ordner angelegt (/home/vmuser/elasticsearch/data/logs und /home/vmuser/elasticsearch/data/data). Eine Log-Datei wird auch schon beschrieben.
Der Zugriff auf Elasticsearch ist im Host-System mittels http://localhost:10200/ möglich.
Fazit
Mit wenigen Zeilen kann ein neuer Docker Container für den Einsatz von Elasticsearch verwendet werden. Alle relevanten Dateien (Logs, Config und Index-Dateien), werden in einem externen Volume gehalten.
Ein weiterer Schritt in eine modulare (Entwicklungs-)Umgebung ist somit erfolgt :-)
Die Dockerfiles sind bei Bitbucket zu finden:
https://bitbucket.org/playsphere/docker-files.git
Referenzen
- [1] Elasticsearch: https://www.elastic.co/
- [2] Docker Volumes: https://docs.docker.com/engine/userguide/dockervolumes/