Desenvolvimento

20 jan, 2017

Colocando uma UI em torno do Docker com Portainer

Publicidade

Como somos programadores inteligentes, todas as tarefas que executamos fazemos através de um comando terminal, certo? Mas, de vez em quando, um pequeno feedback visual não faz mal, certo? O pessoal da portainer.io se sentiu da mesma maneira e forneceu uma interface de usuário de código aberto em torno de Docker e Docker Swarm. Vamos dar uma olhada.

O que vamos fazer é configurar uma pilha de aplicação completa, sendo o example-voting-app. E vamos usar o Play with Docker para configurar o cluster inteiro. Vamos trabalhar com um ambiente Docker Swarm com cinco nodes Docker: um gerente e quatro funcionários.

Vamos executar portainer:

docker run -d --name portainer \
  -p 9000:9000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  portainer/portainer

Nós executamos esse container como um daemon (`-d`) e o publicamos na porta 9000. Também precisamos ligar o socket Docker (`/var/run/docker.sock`) nesse container desde a imagem `portainer/portainer`, uma vez que ele precisa obter informações provenientes do runtime do Docker.

Em um adendo, um dos recursos mais recentes em Play with Docker é que agora cada porta publicada a partir de um container Docker ou cada serviço publicado no Docker Swarm será anunciado na interface do usuário em um pequeno jellybean. Clicando nele, você será direcionado diretamente para esse serviço, sem qualquer configuração de encaminhamento/proxying necessária (em demonstração anterior, nós usamos ngrok para esta finalidade)!

Ao clicar nisso, você primeiro obterá um assistente de configuração rápida para definir uma senha de administrador e o ambiente que deseja controlar. Basta escolher o ambiente local. Após esse assistente, basta fazer o login com a senha que você acabou de escolher, e você será recebido pela interface do usuário do Portainer.

Isso mostrará todas as informações sobre a configuração atual do meu Docker. Quais containers estão sendo executados? Quais imagens foram puxadas nessa máquina? Quais volumes foram criados? E quais redes foram criadas?

Outro recurso legal é Templates App: se você quiser uma maneira rápida para configurar um determinado aplicativo, você pode fazê-lo com o toque de um botão através dessa interface. Vamos configurar um container Nginx.

Basta clicar no botão ‘nginx’. Você pode deixar todas as configurações como padrão. Quando o container é lançado, você o verá rodando na guia ‘Containers’ na interface do usuário do Portainer. Em Play with Docker, estarão disponíveis duas novas portas jellybeans: uma porta atribuída aleatoriamente para publicar a porta de container 80 (http) e outra para a porta 443 (https). Clicar na única porta de publicação 80 resultará na página de saudação do nginx (conseguir que o https funcione requer mais configuração).

Vamos dar um passo adiante. Outra maneira de executar o Portainer é executá-lo como um serviço depois de configurar o Modo Swarm. Então, eu vou criar um serviço, também chamado de portainer, publicado na porta 9090. É muito importante que isso esteja limitado aos gestores no swarm, uma vez que estes são os únicos nodes que podem obter informações sobre o Swarm.

docker service create \
    --name portainer \
    -p 9090:9000 \
    --constraint 'node.role == manager' \
    --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
    portainer/portainer -H unix:///var/run/docker.sock

Depois que essa pesquisa for iniciada, abra-a e você verá a interface do usuário do Portainer novamente, só que desta vez ela parece um pouco diferente. No painel principal, você verá uma caixa “Informações sobre o Swarm” e na navegação agora existem guias para “Services” e “Swarm”.

Em nosso aplicativo agora:

O aplicativo de exemplo de votação terá duas redes nas quais lançaremos cinco serviços: dois frontends (voting-app e result-app), duas bases de dados (redis e postgres) e um worker, para fazer a ponte entre ambos os lados.

Primeiro, criaremos a rede ‘vote’ entrando na guia ‘Networks’. Em ‘Add a network’, preencha o nome: vote. Todas as outras configurações podem ser deixadas às suas configurações padrão. Clique em “create”. Uma nova rede, chamada vote, deve agora aparecer na lista de redes abaixo.

Próxima etapa, o primeiro serviço. Vá para a guia “Services” e clique em “Add service”. Aqui nós vamos configurar os serviços vote-app preenchendo alguns campos e marcando algumas caixas (deixe todas as outras opções em seus padrões):

# Name: voteapp
# Image: docker/example-voting-app-vote
# Replicas: 3
# Port mapping: 
#   host: 8080 -> container: 80

# Network: vote

No momento em que você lançar isso, seu serviço de aplicativo de voto aparecerá na lista de serviços e, quando você clicar nele, receberá uma visualização da configuração de tempo de execução do serviço. Abaixo, você verá os containers de que o serviço é composto e, uma vez que todos eles têm status de “execução”, seu serviço estará disponível e você verá o jellybean 8080 na interface Play with Docker em todos os nodes graças à malha de roteamento que carrega o tráfego de equilíbrio para os containers de serviço no Docker Swarm. Clicar nele deverá levar você para o frontend do aplicativo de votação com uma pesquisa para escolher entre gatos e cães.

Vamos seguir… agora, precisamos fazer backup do nosso aplicativo de frontend com uma camada de armazenamento persistente que enfileira os votos, e vamos fazer isso com redis. Então vamos criar um novo serviço:

# Name: redis
# Image: redis
# Replicas: 1

# Network: vote

Quando isso é iniciado, o lado de votação do aplicativo funcionará corretamente sem erros. Então, agora é hora de lançar o lado do resultado. Comece criando uma nova rede ‘resultad’. Então, vamos lançar dois novos serviços. Primeiro, um banco de dados Postgres:

# Name: db
# Image: postgres
# Replicas: 1

# Network: result

Em seguida, o frontend resultapp:

# Name: resultapp
# Image: ndemoor/example-voting-app-result
# Replicas: 2
# Port mapping: 
#   host: 8081 -> container: 80
#   host: 5858 -> container: 5858

# Network: result

Finalmente, para fazer a ponte entre as duas aplicações, vamos lançar o worker que vai pegar os votos na fila redis e armazená-los no banco de dados postgres:

# Name: worker
# Image: docker/example-voting-app-worker
# Replicas: 1

# Network: vote
# Extra network: result

Com a pilha inteira em funcionamento, agora você pode testar o fluxo todo de ponta a ponta, lançando um voto no voteapp e vendo as porcentagens mudarem no aplicativo de resultados.

Para obter informações sobre o desempenho em tempo real de seus containers, entre na guia “Containers” e clique em um dos containers. Você receberá uma exibição detalhada desse container específico, verá seus stdout e logs stderr, obterá gráficos sobre o uso de CPU/memória/rede do container e até mesmo mergulhará em um terminal para executar comandos ao vivo nesse container.

E é isso! O Portainer fornece outra maneira de configurar aplicativos facilmente e monitorar seu comportamento. Certifique-se de testá-lo sozinho ou confira o vídeo em nosso canal do YouTube no qual você executará durante toda esta demonstração.

***

Nils De Moor faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://cntnr.io/putting-a-ui-around-docker-with-portainer-c8ba07874f9d#.5hkvi7605.