RabbitMQ #2 – RabbitMQ no docker-compose

English version – RabbitMQ #2 – RabbitMQ in docker-compose

Antes de continuarmos a teoria de sistemas de mensageria, vamos criar um container com base na imagem RabbitMQ disponível no Docker Hub.

English version: click HERE

Nosso roteiro neste artigo será: instalando o docker, instalando docker-compose, criando o artigo yml com parâmetros do sistema, verificar funcionamento do container via portainer.

Tutorial RabbitMQ:

Artigo 01: RabbitMQ #1 – O que são sistemas de mensageria?

Artigo 02: RabbitMQ #2 – RabbitMQ no docker-compose

Artigo 03: RabbitMQ DLX com Java Spring

Os artigos relacionados estarão sempre referenciados ao longo do texto. Fique tranquilo caso você precise de algum conceito que ainda não foi explicado. Ao longo do texto darei uma breve descrição de alguns componentes.

Instalando Docker

Primeiramente, esse tutorial é baseado em sistemas Linux especificamente Ubuntu.  

Este artigo apresenta o passo a passo de instalação do docker – artigo docker . Irei colocar os comandos básicos neste artigo. Contudo, se você não possui familiaridade com o Docker, ou tem alguma dúvida… aconselho a leitura do artigo citado acima. 

Primeiramente, atualize seu linux antes e após a instalação do docker.

sudo apt-get update

sudo apt-get install docker.io 

sudo apt-get update

sudo apt-get upgrade

Pronto …. espere terminar a instalação e execute o comando

docker run hello-world

Caso tudo tenha dado certo, algo semelhante deverá aparecer em sua tela.

hello-world docker

RabbitMQ no Docker

Existem duas opções de imagens que podem ser utilizadas para criar o container com RabbitMQ. A primeira consiste na imagem oficial do RabbitMQ no docker hub. Essa imagem vem com o RabbitMQ com as configurações básicas. Contudo, você precisará setar na mão a permissão para o gerenciador web. Isso acontece porque a API vem desabilitada por padrão.

Primeira opção  – imagem oficial

Caso essa seja sua opção, execute o comando para baixar a imagem oficial. Contudo, você também quer utilizar a API web para gerenciamento… então, execute os comandos abaixo.

sudo docker pull rabbitmq

sudo docker images

Rodando pelo nome da imagem gera um novo container.

sudo docker run -it <id_da_imagem> bash

Você pode verificar pelo id do container para executar o container correto. Caso execute o run no nome da imagem, um container adicional será criado. Neste caso queremos executar o container já existente.

docker ps -a 

Dessa forma, ao utilizar o comando exec ao invés do run estaremos apenas executando o container. Substitua o <id_container> pelo id do container em sua máquina.

docker exec -it  <id_container> bash

Segunda opção – docker compose

A partir de agora irei utilizar o docker compose para criar o container. Sendo assim, o arquivo .yml conterá os parâmetros necessários para o container. Caso você ainda não saiba do que se trata o docker-compose, leia este artigo que descreve essa ferramenta.

Primeiramente, precisamos criar uma tanto o diretório que irá armazenar o arquivo, quanto o .yml. Como por exemplo via terminal no linux.

mkdir dockercompose
cat > docker-compose.yml

Após executar o comando de criação do arquivo, pressione CTRL+D para salvar o arquivo.

Dessa forma, o próximo passo será preencher o arquivo de configuração .yml com as informações para levantar o container. O arquivo completo segue abaixo, contudo, irei detalha-lo para seu completo entendimento.

Ver este gist no GitHub
file-docker-compose.yml

Detalhando o file-docker-compose

Dando continuidade ao nosso assunto, nesta etapa você irá definir os parâmetros de connfiguração do seu container docker. Portanto, é preciso saber extamente o que está sendo especificado. Poís uma configuração equivocada por interferir no funcionamento do seu sistema.

Definindo o serviço

Primeiramente, você estará determinando um serviço. Contudo, podemos definir qualquer classe de serviço como: front-end, foo, redis entre outros. Em nosso cenário de aplicação utilizaremos o rabbitmq. Fique atento a identação, ela identifica a hirárquia dos comandos.

services:
        rabbitmq:
               image: rabbitmq:3-management
               container_name: rabbitmq_management

Neste campo iremos especificar a imagem a ser utilizada e o nome do container. Optei pela imagem não oficial (rabbitmq:3-management) por praticidade. Neste caso, a API de gerenciemnto web já vem ativada. Precisamos apenas mapear as portas utilizadas na comunicação.

Falando nisso, o próximo trecho de código irá determinar o mapeamento das portas entre o host e o container. O parâmetro ports está associado ao parâmetro rabbitmq. Assim como: volume, environment e restart.

Portas de comunicação

ports: 
    - 25672:25672 # (erlang) communication between the nodes and CLI tool
    - 15672:15672 # communication with the web management API

Como descrito na própria configuração as portas 25672 e 15672 especificam respectivamente a comunicação dos:

  • nós rabbitmq e a ferramenta CLI (política do sistema)
  • API web de gerenciamento com o host

Persistência de dados e mapeamento

Em volumes definimos o mapeamento dos dados utilizados nas filas e mensagens trafegadas. Assim, estes dados que antes eram restritos ao container serão armazenados no host.

volumes:
    - /docker_conf/rabbitmq/data/:/var/lib/rabbitmq/

Por sua vez, o parâmetro environment define as informações de login e senha para acesso a API de gereniamento do rabbitmq. Nela é possível criar filas, exchanges e definir políticas de maneira transparente ao usuário.

Parâmetros de usuário e sistema

environment:
     - RABBITMQ_DEFAULT_USER = admin
     - RABBITMQ_DEFAULT_PASS = passw123

O comando restart define quando o container deve ser inicializado. Em nosso caso, utilizamos always como valor para este parâmetro. Isso significa que o container irá utiliza o host como referência. Consequentemente, sempre que houver um restart do host, o container também irá reinicializar.

restart: always

Da mesma forma que o anterior, volume, está relacionado à persistência de dados. Contudo, perceba que este não pertence ao parâmetro service. Neste caso, essa persistência de dados está relacionada ao container configurado pelo docker-compose.

Logs do container

volumes:
    logs-folder:
        name: ${log_rabbitmq_management}
        driver: local

Para nosso caso, iremos mapear as informações de log do sistema. Portanto, utilizamos o parâmetro logs-folder com as informações de name e driver.

Para saber mais sobre os comandos de configuração do arquivo docker-compose acesse a especificação no github.

Levantando container com docker-compose rabbitmq

Muito bem! Uma vez que o arquivo foi devidamente configurado nos resta iniciar o docker-compose. Para isso, vá ao diretório do arquivo via terminal e digite o comando abaixo.

docker-compose up

O retorno na tela será a saída da inicialização do container. Consequentemente, será algo semelhante a figura abaixo. Caso não haja erro, e o símbolo do rabbitmq apareceu em sua tela o container por docker-compose com rabbitmq foi levantado com sucesso.

Ok, mas agora você já sabe como funciona e não precisa ver a saída do docker-compose. Para evitar que toda essa informação seja printada na tela utilize o -d.

docker-compose up -d

A saída deste comando será similar a apresentada na figura.

Pronto! Seu container está pronto para ser utilizado. Caso você não tenha conseguido rodar o comando docker-compose up, pode haver problema de permissão. Para isso acesse o post “Permissão de grupos docker – docker compose não funciona”.

Tutorial RabbitMQ:

Artigo 01: RabbitMQ #1 – O que são sistemas de mensageria?

Artigo 02: RabbitMQ #2 – RabbitMQ no docker-compose

Artigo 03: RabbitMQ DLX com Java Spring

Artigos relacionados

Juliana Mascarenhas
Juliana Mascarenhas

Cientista de dados e mestre em modelagem computacional pelo LNCC.