Os contêineres do Docker fornecem uma maneira de enviar e executar aplicações com seu ambiente de maneira isolada e repetitiva. Embora haja uma infinidade de imagens do Docker por aí, criar seu próprio Dockerfile permite personalizá-lo, por exemplo, instalando plugins, alterando a imagem de base, removendo o que você não precisa etc. Os Dockerfiles também funcionam como uma maneira para documentar como uma aplicação é instalada e implementada.

Confira como criar um Dockerfile a partir do zero para executar o Elasticsearch e algumas considerações que você precisa saber ao criar o seu próprio.

Leia também: Como encontrar e remover documentos duplicados no Elasticsearch

Construindo a imagem

Um Dockerfile é um método com etapas que descrevem como construir sua imagem do Docker. Você começa a partir de uma imagem de base, que fornece os fundamentos necessários para a execução de aplicações e, em seguida, executa as etapas em cima disso, o que resulta em uma nova imagem. Caso queira, também é possível usar a imagem resultante como uma imagem de base para outra imagem.

O Dockerfile mais simples que você pode criar é algo assim:

A partir do Ubuntu: 14.04


Insira isso em um arquivo chamado Dockerfile.

Agora você pode construí-lo executando:

docker build -t my-es-image.


A imagem foi criada e pode ser executada com:

docker run --rm -it my-es-image /bin/bash


Enquanto esse comando criou uma imagem que não é muito útil, agora vamos criar uma mais útil, já que aprendemos como construí-la e testá-la.

O primeiro passo é instalar o Java e o Elasticsearch. Confira neste post o passo a passo para instalá-los.

Antes de executá-lo, devemos adicionar um arquivo elasticsearch.yml. Crie um arquivo chamado elasticsearch.yml no mesmo diretório que o Dockerfile, com este conteúdo:

cluster.name: "docker-cluster"
network.host: 0.0.0.0

Além disso, para que o log funcione com o docker, devemos adicionar um arquivo logging.yml simples:

rootLogger: INFO,console
appender:
 console:
   type: console
   layout:
     type: consolePattern
     conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"

Nota: Ao executar o log para stdout/stderr, o Docker armazena o log em um arquivo json, e é recomendável especificar um tamanho máximo para o arquivo de log a ser rotacionado e um número máximo de arquivos a serem mantidos. Por exemplo:

  --log-opt max-size=50m --log-opt max-file=10

Para adicionar esses arquivos ao contêiner, adicionamos o seguinte ao Dockerfile:

COPY logging.yml /usr/share/elasticsearch/config/
COPY elasticsearch.yml /usr/share/elasticsearch/config/

Isso gravará os arquivos na imagem durante a execução docker build.

O que resta agora é fazer com que o contêiner execute o Elasticsearch na inicialização.

USER elasticsearch

ENV PATH=$PATH:/usr/share/elasticsearch/bin

CMD ["elasticsearch"]

EXPOSE 9200 9300

Para executá-lo, primeiro o construa como antes e, em seguida, execute-o com docker run --rm -p 9200:9200 my-es-image. Isso abre a porta 9200 do contêiner para o host e executa o CMD. Agora você deve ver a instância do Elasticsearch sendo iniciada.

Observe que atualmente essa instância do Elasticsearch não mantém os dados entre as execuções, pois é efêmera e não especificamos nenhum volume de dados.

Volumes de armazenamento persistentes

Armazenar dados constantemente no Docker requer o uso de volumes. Por padrão, os volumes estão usando bind-mount, o que significa que um arquivo pertencente a um usuário com ID 1000 dentro do contêiner será de propriedade do usuário 1000 no host, que pode ou não ser o mesmo usuário real. O Docker está trabalhando para consertar isso, e ele foi parcialmente implementado, mas precisamos da “fase 2” dos namespaces do usuário para resolver isso completamente.

Enquanto isso, precisamos de alguma solução alternativa para armazenar os dados. Uma maneira de contornar isso é codificar o ID do usuário e certificar-se de que seja o mesmo em todos os computadores que executam esse contêiner.

Se apenas nos preocuparmos com a consistência dos dados entre as reinicializações, outra maneira é permitir que o contêiner crie o volume para que as permissões estejam corretas, já que não precisamos acessar o conteúdo do contêiner da máquina host.

Vamos fazer a última abordagem com um recurso chamado “named volumes”. Crie um volume nomeado:

docker volume create --name esdata

Você pode montar esse volume usando a opção -v:

docker run --rm -ti -p 9200:9200 -v 

esdata:/usr/share/elasticsearch/data my-es-image

Mesmo se você reiniciar o contêiner do Elasticsearch, ele deverá preservar todos os dados.

Nota: Isso requer pelo menos a versão 1.10 do Docker

Tamanho de memória e heap

Por padrão, a memória de um contêiner é ilimitada. Se você quiser limitar a memória máxima que o contêiner usa, você pode especificar, por exemplo,  --memory="4g" com docker run.

Você também deve definir o tamanho de heap para o Elasticsearch. A recomendação normal com alocação de metade da memória para o heap também se aplica. Por exemplo:

docker run --rm -ti -p 9200:9200 -v 

esdata:/usr/share/elasticsearch/data --memory="4g" -e

ES_HEAP_SIZE=2g my-es-image

Fonte: Elastic