<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Docker Archives - Pereira, Thiago Santos.</title>
	<atom:link href="https://thiagosantos.com/blog/category/docker/feed/" rel="self" type="application/rss+xml" />
	<link>https://thiagosantos.com/blog/category/docker/</link>
	<description>the fun of code.</description>
	<lastBuildDate>Sun, 22 Oct 2023 23:29:54 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5</generator>
	<item>
		<title>Rodando o Elastic Search no Docker</title>
		<link>https://thiagosantos.com/blog/788/docker/rodando-o-elastic-search-no-docker/</link>
					<comments>https://thiagosantos.com/blog/788/docker/rodando-o-elastic-search-no-docker/#respond</comments>
		
		<dc:creator><![CDATA[Pereira, Thiago Santos]]></dc:creator>
		<pubDate>Sun, 22 Oct 2023 22:03:20 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[ElasticSearch]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[elasticsearch]]></category>
		<category><![CDATA[installing docker]]></category>
		<category><![CDATA[rodando o docker]]></category>
		<guid isPermaLink="false">https://thiagosantos.com/blog/?p=788</guid>

					<description><![CDATA[<p>Tive a impressão, lendo alguns tutoriais em português, que o material estava um tanto desatualizado. Isso me fez perder algum tempo tentando entender o que eu estava fazendo de errado até entender que: eu não estava fazendo nada errado. O passo a passo estava correto, mas a forma de chamar as APIs do Elastic Search [&#8230;]</p>
<p>The post <a href="https://thiagosantos.com/blog/788/docker/rodando-o-elastic-search-no-docker/">Rodando o Elastic Search no Docker</a> appeared first on <a href="https://thiagosantos.com/blog">Pereira, Thiago Santos.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Tive a impressão, lendo alguns tutoriais em português, que o material estava um tanto desatualizado. Isso me fez perder algum tempo tentando entender o que eu estava fazendo de errado até entender que: eu não estava fazendo nada errado. O passo a passo estava correto, mas a forma de chamar as APIs do Elastic Search é que haviam mudados. Faço esse post para não me deixar esquecer de como funciona e também para facilitar a vida de quem quer subir um container local para desenvolvimento ou para brincar antes de jogar para produção.</p>



<span id="more-788"></span>



<h2 class="wp-block-heading"><strong>Instalando</strong></h2>



<p>É necessário que você já tenha o Docker instalado e rodando na sua máquina. Antes de começar o primeiro passo tenha certeza de que o Docker está rodando! Todas as instruções são via linha de comando e funcionam igualmente no PowerShell e no terminal do Linux (eu uso o Ubuntu 22.04).</p>



<p>O primeiro passo aqui é baixar a imagem do Elastic Search que atualmente está na 8.10.4. Vou usar o repositório de imagens do próprio Elastic pois no repositório do Docker a última versão é a 8.10.2 no dia de hoje e quero usar a última porquê sim. Você pode verificar outras versões aqui <a href="https://www.docker.elastic.co/r/elasticsearch">https://www.docker.elastic.co/r/elasticsearch</a>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.10.4
</pre></div>


<p>Se tudo der certo o resultado vai ser algo parecido com a imagem abaixo. No meu caso rodando no Ubuntu tive que rodar o comando com o<mark style="background-color:#e6e6e6" class="has-inline-color"> sudo </mark> .</p>



<figure class="wp-block-image size-full is-style-default"><img fetchpriority="high" decoding="async" width="810" height="298" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image.png" alt="Docker Pull na imagem do Elastic Search" class="wp-image-789" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image.png 810w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-300x110.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-768x283.png 768w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-624x230.png 624w" sizes="(max-width: 810px) 100vw, 810px" /><figcaption class="wp-element-caption">docker pull na imagem do Elastic Search</figcaption></figure>



<p>Podemos ver que na minha lista de imagens salvas localmente temos lá o Elastic Search na versão 8.10.4. Lembrando que no meu caso tive que adicionar o<mark style="background-color:#e6e6e6" class="has-inline-color"> sudo </mark>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
docker image ls
</pre></div>


<figure class="wp-block-image size-full"><img decoding="async" width="860" height="108" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image-1.png" alt="Docker Image LS para listar as imagens baixadas e mostrando a imagem do Elastic Search" class="wp-image-793" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-1.png 860w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-1-300x38.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-1-768x96.png 768w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-1-624x78.png 624w" sizes="(max-width: 860px) 100vw, 860px" /></figure>



<h2 class="wp-block-heading">Rodando</h2>



<p>Até aqui todos os tutoriais foram bem. Alguns instalando diredo do repositório do Docker outros do repositório do ElasticSearch, mas daqui em diante é o que estava me confundindo um tanto, mas que vai ficar bem claro aqui.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
docker run --name elasticboladao -p 9200:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.10.4
</pre></div>


<h3 class="wp-block-heading">Deu erro?</h3>



<p>Em alguns tutoriais o container subia e tudo funcionava magicamente bem, mas quando eu tentei encontrava alguns erros e que seguindo o tutorial me dava a entender de que eu estava fazendo alguma coisa errada. Seguindo o passo a passo até aqui dava um erro tanto rodando no Windows quanto rodando no Ubuntu, então se você rodou até aqui e se esbarrou com o erro <mark style="background-color:#f8ed04" class="has-inline-color">node validation exception\n[1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.\nbootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]</mark> siga a recomendação abaixo, caso não tenha tido problema e o comando tenha rodado pode pular direto para o tópico &#8220;Testando&#8221;.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="246" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image-2-1024x246.png" alt="Erro ao rodar o comando docker run com a imagem do Elastic Search" class="wp-image-815" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-2-1024x246.png 1024w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-2-300x72.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-2-768x184.png 768w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-2-1536x369.png 1536w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-2-624x150.png 624w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-2.png 1907w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Significa que você precisa aumentar o valor do vm.max_map_count para o valor minimo de 262144, como recomendando pelo Elastic Search. No Ubuntu basta rodar o comando baixo.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
sysctl -w vm.max_map_count=262144
</pre></div>


<p>Se você quiser deixar esse valor minimo definido como padrão no seu sistema sempre você só precisa editar o arquivo <mark style="background-color:#e6e6e6" class="has-inline-color">/etc/sysctl.conf</mark> e adicionar ao final dele o <em>vm.max_map_count=262144</em>.</p>



<h3 class="wp-block-heading">Deu bom?</h3>



<p>Se você não teve o problema acima, ou fez o ajuste necessário, depois de rodar o comando docker run e ao final da processo de inicialização do container você provavelmente vai ver essa tela na primeira.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="912" height="425" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image-4.png" alt="Docker Run rodado com sucesso mostrando as informações de senha do Elastic Search e outras informações" class="wp-image-818" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-4.png 912w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-4-300x140.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-4-768x358.png 768w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-4-624x291.png 624w" sizes="(max-width: 912px) 100vw, 912px" /></figure>



<h2 class="wp-block-heading">Testando</h2>



<p>Esse foi um outro ponto confuso em que cheguei depois de seguir os tutoriais. O pessoal simplesmente lançava na URL <mark style="background-color:#e6e6e6" class="has-inline-color">http://localhost:9200</mark> e entrava com uma autenticação básica e conseguia fazer algumas consultas direto no navegador. No entanto temos ai duas possibilidade: No Windows, rodando o Docker Desktop com WSL ativado, não consegui acessar a URL diretamente pelo navegador. Só consegui fazer as requisições usando o Postman/Insomnia ou pelo CURL. No Ubuntu funcionou com https, mas não com o http e até aí tudo bem, pois não pretendo usar o navegador mesmo. Acessar via navegador era mais um teste simples para verificar se estava funcionando.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="851" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image-5-1024x851.png" alt="Elastic Search sendo acessado via navegador na porta 9200" class="wp-image-820" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-5-1024x851.png 1024w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-5-300x249.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-5-768x638.png 768w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-5-624x518.png 624w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-5.png 1218w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Depois de autenticar com o usuário <mark style="background-color:#e6e6e6" class="has-inline-color">elastic</mark> e com a senha que é gerada quando o elastic é iniciado (da uma olhada na imagem do Deu Bom?).</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="641" height="410" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image-6.png" alt="Retorno efetivo com as informações do Elastic Search" class="wp-image-821" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-6.png 641w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-6-300x192.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-6-624x399.png 624w" sizes="(max-width: 641px) 100vw, 641px" /></figure>



<h3 class="wp-block-heading">Insomnia/Postman</h3>



<p>Tanto usando o Insomnia quanto o Postman talvez seja necessário desabilitar a validação de certificados SSL, ao menos tive que fazer isso, já que o certificado gerado localmente não é realmente reconhecido.</p>



<p>Antes de você realizar uma requisição você precisa configurar a autenticação do tipo basic e há duas formas de fazer isso a primeira é usando o recurso direto do Postman ou do Insomina que basicamente é ir na aba de <em>Authorization</em>, escolher a opção <em>Basic</em> preencher o usuário com o <mark style="background-color:#e6e6e6" class="has-inline-color">elastic</mark> e a senha com aquela que já sabemos. </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="967" height="388" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image-7.png" alt="" class="wp-image-823" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-7.png 967w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-7-300x120.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-7-768x308.png 768w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-7-624x250.png 624w" sizes="(max-width: 967px) 100vw, 967px" /><figcaption class="wp-element-caption">Autenticação Basic direto no Insomnia</figcaption></figure>



<p>A outra forma é configurar diretamente no Headers o cabeçalho <em>Authorization</em> com o usuário e senha separado por &#8220;:&#8221; encodados na <em>base64</em>. Eu particularmente prefiro essa pois já fica mais baixo nível e mais próximo da chamada que vou precisar fazer via código. Algo como <mark style="background-color:#e6e6e6" class="has-inline-color">elastic:O*<em>ZMpUEhF*</em>+5cHAYW3yR</mark> viraria <mark style="background-color:#e6e6e6" class="has-inline-color">ZWxhc3RpYzpPKlpNcFVFaEYqKzVjSEFZVzN5Ug==</mark>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1017" height="367" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image-8.png" alt="" class="wp-image-824" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-8.png 1017w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-8-300x108.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-8-768x277.png 768w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-8-624x225.png 624w" sizes="(max-width: 1017px) 100vw, 1017px" /></figure>



<p>É isso, objetivo aqui foi alcançado que era deixar rodando o ElasticSearch com Docker. Fiquem a vontade pra tirar dúvidas dessa instalação ou mesmo outras coisas que tenha dito e não tenha ficado claro.</p>



<h2 class="wp-block-heading">Pra fechar</h2>



<p>Se você precisar gerar uma nova senha para o usuário elastic você pode em um outro terminal enviar um comando para essa troca.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
docker exec -it elasticboladao bin/elasticsearch-reset-password -u elastic
</pre></div>


<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="892" height="150" src="https://thiagosantos.com/blog/wp-content/uploads//2023/10/image-9.png" alt="" class="wp-image-832" srcset="https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-9.png 892w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-9-300x50.png 300w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-9-768x129.png 768w, https://thiagosantos.com/blog/wp-content/uploads/2023/10/image-9-624x105.png 624w" sizes="(max-width: 892px) 100vw, 892px" /></figure>



<h2 class="wp-block-heading">Referências</h2>



<p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html</a><br><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html</a></p>
<p>The post <a href="https://thiagosantos.com/blog/788/docker/rodando-o-elastic-search-no-docker/">Rodando o Elastic Search no Docker</a> appeared first on <a href="https://thiagosantos.com/blog">Pereira, Thiago Santos.</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thiagosantos.com/blog/788/docker/rodando-o-elastic-search-no-docker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Docker Cron</title>
		<link>https://thiagosantos.com/blog/755/linux/docker-cron/</link>
					<comments>https://thiagosantos.com/blog/755/linux/docker-cron/#respond</comments>
		
		<dc:creator><![CDATA[Pereira, Thiago Santos]]></dc:creator>
		<pubDate>Thu, 18 May 2023 03:15:26 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker cron]]></category>
		<category><![CDATA[infinite cron]]></category>
		<guid isPermaLink="false">https://thiagosantos.com/blog/?p=755</guid>

					<description><![CDATA[<p>Pod com cron rodando de forma infinita. Sim é possível.</p>
<p>The post <a href="https://thiagosantos.com/blog/755/linux/docker-cron/">Docker Cron</a> appeared first on <a href="https://thiagosantos.com/blog">Pereira, Thiago Santos.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Uma demanda bem diferente, um container cujo único proposito em vida é ter o cron rodando. Na verdade, um pouco mais que isso, mas não vem ao caso. O ponto é como fazer um container chamador de cron?</p>



<p>Para os apressados a solução é rodar o cron em foreground. Dessa forma ele segura o container e ele não morre de cara.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
ENTRYPOINT &#x5B;&quot;cron&quot;, &quot;-f&quot;]
</pre></div>


<span id="more-755"></span>



<p>Para quem curte uma solução mais completa abaixo está o Dockerfile que usei para resolver essa tarefa. No container deveria haver dois scripts, o primeiro que consultava uma API e retornava uma lista contendo um GUID, data da ultima alteração e a periodicidade que esse GUID deveria ser chamado. O segundo script que era chamado pelo cron passando o GUID respeitando a periodicidade definida.</p>



<p>Assim o primeiro script, deveria acessar uma API a cada 15 minutos, verificar localmente se aqueles GUID recebidos já tinham seus respectivos arquivos cron gerados. A solução foi que para cada GUID recebido criariamos arquivos na pasta do cron.d no formato abaixo.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; highlight: [2]; title: ; notranslate">
#/etc/cron.d/run_primeiro_script
*/15 * * * * root /app/primeiro_script.py
</pre></div>


<p>O segundo script precisa ser chamado dada uma periodicidade e passando um ID como parâmetro.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [2]; title: ; notranslate">
#/etc/cron.d/426c3f18-8f87-4ca7-98a9-aaa865ae46d1
*/5 * * * * root /app/segundo_script.py --id 426c3f18-8f87-4ca7-98a9-aaa865ae46d1
</pre></div>


<p>O Dockerfile ficou assim. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; highlight: [5]; title: ; notranslate">
FROM ubuntu:23.04 AS base

WORKDIR /app
RUN apt-get update &amp;&amp; apt-get install -y cron python3
RUN echo &quot;*/15 * * * * root python3 /app/primeiro_script.py &gt; /proc/1/fd/1 2&gt;/proc/1/fd/2&quot; &gt; /etc/cron.d/run_primeiro_script

COPY . .

ENTRYPOINT &#x5B;&quot;cron&quot;, &quot;-f&quot;]
</pre></div>


<p>Eu ressalto que como a tarefa do cron é executado em um bash as mensagens da aplicação não saem no bash principal e como consequência não é possível ver essas mensagens no log. Por isso redirecionamos o stdout e o stderr do &#8220;primeiro_script.py&#8221; para o processo de PID 1 que é o comando executado pelo entrypoint.</p>



<p>Essa é uma solução interessante também para manter o log quando o cron executar scripts, programas e aplicações que tenham muita saída no stdout e que normalmente estivessem rodando em foreground seriam enviados para o log do pod.</p>
<p>The post <a href="https://thiagosantos.com/blog/755/linux/docker-cron/">Docker Cron</a> appeared first on <a href="https://thiagosantos.com/blog">Pereira, Thiago Santos.</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thiagosantos.com/blog/755/linux/docker-cron/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
