Aula 3 - Simulando Sistemas Distribuídos Com Docker
Aula 3 - Simulando Sistemas Distribuídos Com Docker
Aula 3 - Simulando Sistemas Distribuídos Com Docker
Nesta aula, veremos detalhes específicos para utilização do Docker, abordando questões de
configuração e uso do Apache.
Introdução da aula
Você já pensou de que maneira são orquestrados os serviços quando acessamos um website?
Uma das principais plataformas de conteinerização utilizadas atualmente é o Docker, principal
assunto desta aula. Aqui vamos trabalhar com a instalação do Docker no sistema operacional
GNU/Linux Ubuntu e aprender alguns dos principais comandos que podem ser utilizados na
plataforma Docker. Você já parou para pensar em quais comandos devem ser usados para que
essa orquestração de serviços funcione adequadamente?
1. Crie um cluster com cinco réplicas do servidor web Apache utilizando o Docker Swarm;
3. Acesse a página de boas-vindas desse servidor Apache através do(s) endereço(s) IPv4
de cada nó onde esse serviço web estiver rodando.
Para completar o desafio, nessa aula você verá, em detalhes, como se utiliza o Docker,
incluindo comandos específicos a serem utilizados, tanto para configuração, quanto para
constatação de que o serviço de Apache está funcionando de maneira adequada. Ficou
curioso? Vamos lá!
Conceito e instalação do Docker
Instalação do Docker
Vamos fazer a instalação do Docker em uma das distribuições populares GNU/Linux, o sistema
operacional Ubuntu, cuja versão utilizada foi a 14.04.5 LTS. Para isso, devemos seguir os passos
a seguir. Todo o procedimento deve ser feito com um usuário com permissões de
administrador. Nesse caso, utilizaremos o root através do comando sudo su.
Você também pode instalar o Docker no sistema operacional Windows, fazendo o download da
versão mais atual no Portal Docker (DOCKER, [s.d.]). O processo de instalação é bem simples, é
preciso somente avançar as etapas do instalador.
______
Assimile
______
Antes de instalar a ferramenta, devemos remover versões anteriores do Docker que possam
estar instaladas, usando o comando:
Antes de instalar o Docker CE pela primeira vez em uma nova máquina host, você precisa
configurar o repositório do Docker, atualizando os pacotes de sua máquina. Depois, você pode
instalar e atualizar o Docker do repositório. Portanto, execute os comandos que vão atualizar a
máquina:
O comando utiliza a permissão considerada admin nos sistemas operacionais da família Linux,
através da palavra sudo. Depois de usar a permissão de usuário do sudo, utilizamos o add-apt-
repository para adicionar o repositório, que pode ser comparado a uma loja de aplicativos,
responsável pelo download do Docker na versão Ubuntu. O restante do comando é o caminho
do repositório.
Após adicionar o repositório para download do Docker, como mostra a figura a seguir, devemos
mais uma vez atualizar o apt-get, conforme o comando seguinte para aplicar as alterações:
Agora vamos utilizar o comando de instalação do Docker. Lembrando que, para que esse
comando funcione, devemos seguir as etapas de apontar o repositório em que o Docker está
disponível e adicionar esse repositório em nossa lista. No comando utilizamos o sudo para usar
a permissão admin do sistema e o apt-get install para a fazer a instalação, por último o nome
do programa que vamos instalar, no caso, o Docker (docker-ce).
Saída do comando que faz a instalação do Docker. Fonte: captura de tela elaborada pelo autor.
Iniciando e testando o Docker
Para ver se o Docker foi instalado corretamente, devemos iniciar o serviço do Docker e verificar se ele está em execução. Podemos fazer isso com os
seguintes comandos:
Após a inicialização do Docker, utilizamos o comando service docker status que mostra o status
do serviço, ou seja, se ele está em execução ou parado.
Caso ocorra algum erro ao iniciar e testar o Docker, você deve executar os dois comandos
seguintes e tentar novamente:
Esses comandos utilizam a permissão de usuário administrador através do sudo e, além disso,
executam uma atualização de pacotes essenciais para o bom funcionamento do sistema
operacional, assim como o bom funcionamento dos serviços que rodam através dele, como o
Docker.
Agora que instalamos e verificamos seu funcionamento, o sistema está apto a receber as
especificidades que queremos criar. Para isso, é possível usar o Docker Swarm. Essa ferramenta
é nativa e permite a criação de clusters de Docker. Nesse cenário, é possível agrupar vários
hosts em um mesmo pool de recursos, o que facilita o deploy de contêineres (DIEDRICH, 2018).
Esse framework é integrado ao Docker Engine a partir da versão 1.12.0, com o chamado
“swarm mode”.
______
Dica
Uma alternativa à instalação do Docker é o portal Play With Docker, plataforma pela qual é
possível testar o Docker utilizando seus comandos diretamente via navegador, mediante um
cadastro (PLAY WITH DOCKER, [s.d.]).
______
Exemplificando
Após a criação do login na plataforma, teremos acesso a uma interface para criação de
instâncias como clusters e nós.
Através do botão Add new instance, podemos criar nós para o nosso cluster e, então, é possível
entrar com comandos na plataforma. Vamos conhecer um dos principais comandos para
depois interagirmos com a plataforma. A figura a seguir exibe a interface após a criação de um
nó:
Plataforma Play With Docker. Fonte: captura de tela elaborada pelo autor.
______
Através dos comandos listados abaixo podemos simular algumas características de sistemas
distribuídos com Docker, como criação de nós dos tipos mestre (manager) e escravo (worker)
dentro do nosso cluster, gerenciamento de contêiner, réplica de serviços etc.
Comando executado fora do(s) nó(s) e comando executado dentro
do(s) nó(s) Manager
Agora vamos ver alguns comandos que são executados fora dos nós do ambiente Docker. Um
dos mais importantes é o de criação de um novo manager para o cluster. Através do comando,
criamos um manager chamado de mestre:
O começo desse comando significa que estamos criando uma nova máquina através do Docker.
Utilizaremos docker-machine create como driver no VirtualBox e daremos o nome de mestre
para nossa máquina.
Agora, vamos fazer a criação de uma nova máquina: o comando segue o mesmo padrão do
anterior, mas desta vez vamos chamar a máquina de “escravo1”. Ela será um worker para o
cluster, conforme comando abaixo:
docker-machine ip mestre
Um dos comandos Linux mais populares utilizados para acesso de máquinas/servidores é o ssh,
que significa “Secure Shell”, em que fazemos um acesso ou uma conexão através desse
protocolo de rede criptográfica, que aplica mais segurança aos serviços de redes. Na utilização
do Docker o mesmo comando é usado com o objetivo de acessar os nós criados que, em nosso
ambiente, possuem os nomes “mestre” e “escravo1”.
É possível verificar os nós (nodes) criados através do comando “ls”. Podemos criar um escravo
para o cluster com hardware diferente do padrão. Também pode-se ver no comando a seguir
que a máquina chamada “escravo5” que definimos a memória com o valor de 512 MB através
da instrução virtualbox-memory “512” e um disco rígido de 5 GB através da
instrução virtualbox-disk-size “5000”:
Vamos ver os alguns comandos executados dentro do manager de nosso ambiente Docker. O
comando a seguir pode ser utilizado para iniciar o cluster através do framework Swarm, de
gerenciamento de contêineres.
Podemos consultar os nós que fazem parte do cluster utilizando o comando node ls: docker
node ls
A seguir, é possível observar um exemplo de criação de um novo serviço (tarefa) para o cluster.
Nesse caso, criamos um serviço Web através do popular servidor web nginx, que contém 3
réplicas:
No parâmetro name definimos um nome para a execução do serviço, em nosso caso, WEB.
Através do parâmetro publish definimos uma porta de execução para o Docker e uma para o
servidor web Nginx, no caso, “85” e “80” e, por último, definimos que o serviço terá 3 réplicas
e utilizará o Nginx na versão 1.12.1.
Agora que criamos nosso serviço de internet chamado WEB, podemos utilizar o
comando ps seguido do nome do serviço para verificar suas informações. Portanto, o comando
a seguir mostra informações sobre um serviço específico aqui denominado como WEB:
É possível usar os comandos a seguir para alterar a versão das instâncias do Nginx. No primeiro
comando atualizamos, através do comando update, a versão do Nginx para 1.13.5
(anteriormente estávamos com a versão 1.12.1). Após isso, utilizamos o comando ps com o
parâmetro -f que significa filter ou find, que pode ser considerado um filtro para a busca, em
que usamos a palavra-chave Running para descobrir qual serviço está em execução e se sua
versão foi mesmo atualizada. O resultado dos comandos está ilustrado na figura a seguir.
Caso quiséssemos desfazer nossa atualização de versão das instâncias do Nginx, podemos
utilizar o comando update como parâmetro rollback aplicado sobre o serviço WEB. Com isso,
teremos a volta da versão das instâncias do Nginx para a versão anterior. Que pode ser
consultado através do mesmo comando ps utilizado no exemplo anterior, conforme a seguir:
Quando executamos esse comando, tanto o nó quanto os serviços que estão em execução
serão parados.
Comando executado dentro do(s) nó(s) Worker e comando
executado dentro de cada um dos nós (Managers e Workers)
Agora vamos ver um dos comandos que são executados dentro dos nós escravos (worker) do
ambiente Docker. O comando a seguir pode ser utilizado para adicionar um worker ao nosso
cluster (figura abaixo). Para isso, devemos acessar o nó escravo que queremos adicionar a um
cluster e executar o comando a seguir, passando o token de segurança e o IP do nó mestre
(manager) seguido por porta, conforme a sintaxe representada no comando:
Plataforma Play With Docker. Fonte: captura de tela elaborada pelo autor.
Comando executado dentro de cada um dos nós (Managers e Workers)
Agora vamos ver um dos comandos executados dentro dos nós tanto worker,
quanto managers de nosso ambiente Docker. Quando executamos o comando Docker system
prune com o parâmetro all dentro de um nó, ele será responsável por apagar/deletar tudo o
que foi feito dentro do mesmo. Observamos a seguir sua utilização:
Agora que já conhecemos alguns comandos, vamos através da plataforma Play With
Docker orquestrar um servidor web Apache em um cluster simples. Primeiramente, você deve
estar logado na plataforma de playground do Docker, conforme orientações já apresentadas
anteriormente. Uma vez que obteve acesso à plataforma, você deverá:
1. Criar um cluster com 3 nós, que serão suficientes para analisarmos nosso cluster sem
comprometer a usabilidade da plataforma de testes do Docker. Sendo assim, você deve
adicionar 3 nós, que farão parte do cluster, através do botão Add new instance.
Saída do comando docker swarm init. Fonte: captura de tela elaborada pelo autor.
3. Agora que os nós estão criados e seus papéis definidos, para criar o serviço que estará
rodando (de maneira distribuída, replicada) do servidor web Apache, digite o seguinte
comando no nó mestre:
4. Para saber em quais nós as 5 réplicas desse serviço estão sendo executadas, digite o
seguinte comando:
No caso da figura abaixo, podemos ver que 2 instâncias estão rodando no nó 1, e as outras 3
estão rodando no nó 2.
Porta mapeada aparece como um hyperlink. Fonte: captura de tela elaborada pelo autor.
5. Por fim, precisamos acessar a página de boas-vindas desse servidor Apache através
do(s) endereço(s) IPv4 de cada nó em que esse serviço web estiver rodando. Reparou
que, ao criar o serviço, a porta que você mapeou aparece na parte superior, como um
hyperlink? Caso não tenha percebido, veja a porta 80, destacada em vermelho na
figura 24. Para acessar a página de boas-vindas, basta clicar nessa porta, em cada um
dos nós onde esse serviço está rodando (no caso, nós 1 e 2 do cluster), para vermos a
famosa mensagem “It works!” do Apache.
Porta mapeada aparece como um hyperlink. Fonte: captura de tela elaborada pelo autor.
Esta sequência de comandos que utilizamos para orquestrar um servidor web Apache em 3 nós
é a configuração utilizada em sistemas distribuídos, para que os acessos a um website sejam
balanceados e, caso ocorra algum problema em um dos nós que mantêm a aplicação, o outro
nó assume a execução.
______
Reflita
Parou para pensar em quantas aplicações esses conceitos podem ser aplicados? E quantas
melhorias as implantações desses conceitos podem trazer a um sistema web?
Conclusão
Nesta aula você conheceu alguns comandos Docker e aprendeu a fazer uma configuração de
cluster e de nós para servidor web.
Mais um passo e a tão cobiçada vaga naquela grande empresa será sua! O coordenador está
gostando de seu desempenho nos testes e diz que, caso você consiga orquestrar o servidor
web Apache em um cluster simples, será contratado! Desta forma:
1. Crie um cluster com cinco réplicas do servidor web Apache utilizando o Docker Swarm.
3. Acesse a página de boas-vindas desse servidor Apache através do(s) endereço(s) IPv4
de cada nó onde esse serviço web estiver rodando.
Para resolver esse desafio, primeiramente você deve estar logado na plataforma de playground
do Docker, conforme orientações já apresentadas anteriormente. Uma vez que obteve acesso à
plataforma, você deverá seguir os passos abaixo:
1. Como não foi especificada a quantidade de nós do cluster, crie o mesmo com 3 nós,
que serão suficientes para analisar o cluster sem comprometer a usabilidade da
plataforma de testes do Docker. Sendo assim, adicione 3 nós, que farão parte do
cluster, através do botão Add new instance.
Saída do comando docker swarm init. Fonte: captura de tela elaborada pelo autor.
3. Agora que os nós estão criados e seus papéis definidos, para criar o serviço que estará
rodando (de maneira distribuída, replicada) do servidor web Apache, digite o seguinte
comando no nó mestre:
Esse comando cria 5 instâncias de um servidor web Apache, que responderá na porta mapeada
(80, nesse caso) e, para facilitar sua monitoração, demos um nome “amigável” a este serviço:
WEB.
4. Para saber em quais nós as 5 réplicas desse serviço estão sendo executadas, digite o
seguinte comando:
No caso da figura abaixo, podemos ver que 2 instâncias estão rodando no nó 1, e as outras 3
estão rodando no nó 2.
Porta mapeada aparece como um hyperlink. Fonte: captura de tela elaborada pelo autor.
5. Por fim, precisamos acessar a página de boas-vindas desse servidor Apache através
do(s) endereço(s) IPv4 de cada nó onde esse serviço web estiver rodando. Reparou
que, ao criar o serviço, a porta que você mapeou aparece na parte superior, como um
hyperlink? Caso não tenha percebido, veja a porta 80, destacada em vermelho na
figura abaixo. Para acessar a página de boas-vindas, basta clicar nessa porta, em cada
um dos nós onde esse serviço está rodando (no caso, nós 1 e 2 do cluster), para
vermos a famosa mensagem “It works!” do Apache.
Porta mapeada aparece como um hyperlink. Fonte: captura de tela elaborada pelo autor.
Referências Bibliográficas
ANDROID Studio. Start the emulator from the command line. Developers. Última atualização
em: 2019. Disponível em: https://bit.ly/3oV6O1g. Acesso em: 7 fev. 2019.
DAWSON, P e WOLF, C. (Portal). Virtualization Key Initiative Overview. 22 jul. 2011. Disponível
em: https://gtnr.it/3txpRSK. Acesso em: 03 nov. 2018.
DIEDRICH, C. Docker Swarm. Disponível em: https://bit.ly/3ju0xIU. Acesso em: 9 jul. 2021.
DOCKER, C. Docker Containerization Unlocks the Potential for Dev and Ops. 2018. Disponível
em: https://dockr.ly/2YTojVl. Acesso em: 10 dez. 2018.
DOCKER (Portal). Swarm mode. [s.d.] Disponível em: https://dockr.ly/3ryJY18. Acesso em: 10
dez. 2018.
GLASSDOOR. Website. 2021. Disponível em: https://bit.ly/39NgR4i. Acesso em: 9 jul. 2021.