Skip to content

DevEnv: Docker und Elasticsearch

2016 Januar 16
by Haf

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.

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:

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

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:

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:

Unter Berücksichtigung dieser Einstellungen sieht docker run nun wie folgt aus

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/

Share it!
  •  
  •  
  •  
  •  
  •  
  •  
No comments yet

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS