Docker e Docker Cluster (Swarm)
Primeiro temos de garantir que estamos com a versão kernel 3.10 ou superior.
Sem isso, nada feito. Não vou explicar aqui como se actualiza o kernel, mas se usar um Linux mais actual, não terá problemas.
Para ver qual a sua versão de Kernel, façam
root@node1:~# uname -r
Por vezes forçar um upgrade de todos os pacotes, resolve o problema. Mas não se esqueçam que um novo kernel (recém instalado) só fica activo após reboot.
Para actualizar os pacotes façam.
root@node1:~# aptitude update
root@node1:~# aptitude safe-upgrade
Passada toda esta fase de verificação de kernel, passemos à instalação do Docker.
Numa primeira fase se ainda não têm o binário curl têm de o instalar.
root@node1:~# aptitude install curl
Para instalar o Docker, existem muitas formas, mas para mim esta é a mais simples.
root@node1:~# curl -sSL http://get.docker.com | sh
Depois de muito output e se tudo correr bem
Executem o seguinte comando para verificar se está instalado e qual a versão.
root@node1:~# docker --version
Docker version 1.12.6, build 78d1802
Nos outros servidores de cluster (vamos chamar-lhes de nodes) seguir o mesmo procedimento feito até aqui, para instalar o docker.
Vamos agora ao cluster.
No node1 ou master node, corram o seguinte comando para iniciar o cluster
root@node1:~# docker swarm init --listen-addr [IP_LISTEN]
No IP_LISTEN coloquem o ip por onde querem que este docker comunique. No meu caso, o 64.137.197.68
Swarm initialized: current node (13lputgvbb1b3bm71rrkg4yww) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join
--token SWMTKN-1-3f12gtx7g17nhr158jp2dkil007ooi521evdiq47ulv4mcvm76b-2xcul6ip3ioamkcgapygfvdiu
64.137.197.68:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
E neste momento se corrermos o seguinte comando conseguimos ver que o nosso cluster já tem um nó (node) o Master/Leader, que é ele próprio o node1.
root@node1:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
13lputgvbb1b3sbm71rrkg4yww * node1 Ready Active Leader
No output anterior quando iniciámos o swarm, está descrito como adicionar um nó a este cluster. É muito simples, correm o comando:
Atenção: Onde está [IP] devem colocar o ip que têm como listen no vosso output.
root@node2:~# docker swarm join
--token SWMTKN-1-3f12gtx7g17nhr158jp2dkil007ooi521evdiq47ulv4mcvm76b-2xcul6ip3ioamkcgapygfvdiu
[IP]:2377
This node joined a swarm as a worker.
E assim podem fazer o mesmo em todos os outros nós.
Depois podem verificar como ficou o seu cluster correndo este comando no seu Master/Leader node… e apenas nesse node.
root@node1:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
13lputsgvbb1b3bm71rrkg4yww * node1 Ready Active Leader
7pt15nyw6f47xs5ytctrd33g6c node2 Ready Active
elfjsbkdst74tql8ahqeozeyfi node3 Ready Active
E pronto, neste momento temos o nosso cluster a correr sem problemas e de uma forma simples.
O próximo passo é colocar o nosso container (APP) a corre em todos os nós.
Vamos criar um container de nginx que apenas mostra a página welcome.
root@node1:~# docker service create --name nginx --publish 8000:80 nginx
72eczev99fm1tsb0sr1jvdevug
Reparem que em vez do habitual ‘docker run qualquer coisa’, que servia para correr um container individual, estamos a criar um service para esse container.
Fazemos isso para que a nossa APP (o nginx) tenha um ip que possa ser distribuido (escalado) para outros nós.
Podemos agora verificar quantos services temos actualmente:
root@node1:~# docker service ls
ID NAME REPLICAS IMAGE COMMAND
72eczev99fm1t nginx 1/1 nginx
Temos então um container a correr e só uma réplica do mesmo.
Se fizermos o seguinte comando vamos poder ver onde esse service está a correr.
root@node1:~# docker service ps 72eczev99fm1t
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
423mmhaoitygmqj42lppwdw3zv nginx.1 nginx node1 Running Running 6 minutes ago
Muito bom.
Mas vamos então agora ao mais interessante. Vamos escalar este serviço para 3 réplicas.
root@node1:~# docker service scale nginx=3
nginx scaled to 3
root@node1:~# docker service ls
ID NAME REPLICAS IMAGE COMMAND
72eczev99fm1t nginx 3/3 nginx
root@node1:~# docker service ps 7eczev99fm1t
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
43mmhaoitygmqj42lppwdw3zv nginx.1 nginx node1 Running Running 6 minutes ago
6kxvmnn49vpueg92ut7njo88y nginx.4 nginx node2 Running Running 3 seconds ago
dchf4iw9qnwkxyhlc31qirbmb nginx.2 nginx node3 Running Preparing 16 seconds ago
Olha só aí o serviço a correr nos três nós. Bonito, sim, muito…
Para verificar o vosso Welcome Page do nginx, abram o url http://ip_do_master:8000
E a página que estão a ver, pode ter sido servida por qualquer um dos nós. O Docker faz o balanceamento para o melhor nó.
Sensacional 🙂
Welcome to the platform, I wish everything work out for you. It’s not easy here but not difficult neither but just ask an extra effort, engagement is the key good luck I’m @goodaytraders Start by following people and they will do the same.
Obrigado pelas dicas, valeu!
Muito obrigado. Vou continuar a colocar mais, mas devo fazer em inglês