Oi Pessoal,
Nós já conversamos sobre o Docker 1.13 aqui, agora vamos explorar um pouco mais sobre essa funcionalidade que saiu do modo experimental e tornou-se parte da engine estável do Docker, sim estamos falando do docker stack/deploy. Mas antes, recomendo fortemente você ler este post aqui sobre docker compose v3, ele é muito, mas muito importante mesmo para os exemplos que veremos neste post.
Agora com o Docker 1.13 é possível você portar suas aplicações do compose para o Swarm, e isso graças a funcionalidade de deploy disponível na engine. Seu funcionamento é bem simples, basta você informar na execução do comando o diretório de onde está o seu arquivo compose, e o nome da aplicação, se lembra que falei que era muito importante olhar esse post? Pois bem, não adianta você ter um compose escrito para a versão 2 e tentar utilizar aqui, será necessário você se altere para as novas regras da versão 3 para que seja possível a criação de sua stack pelo docker deploy. Mas digamos que você já tem seu arquivo pronto na versão 3, vamos pegar o exemplo do outro post, basta executar:
$ docker deploy --compose-file docker-compose.yml app
O retorno desse comando será
$ docker deploy --compose-file docker-compose.yml app Creating network app_default Creating service app_nginx Creating service app_redis
Dessa forma foram criados uma rede e dois serviços, o mesmos definidos no arquivo compose. Para obter mais informações da stack, você pode executar os comandos:
$ docker stack ls NAME SERVICES app 2
Com o stack ls, será retornado todas as stacks que você criou, neste caso retornou apenas a “app” e informa também quantos serviços existem para essa stack, com este comando:
$ docker stack ps app ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xb02xrua71db app_redis.1 redis:latest node1 Running Running 7 minutes ago lm7k8obhncyl app_nginx.1 nginx:latest node1 Running Running 7 minutes ago jh65f9scx0cq app_nginx.2 nginx:latest node1 Running Running 7 minutes ago
Você visualizará mais informações sobre a stack, como por exemplo o id de cada container, imagem utilizada, nome do container, nó onde está executando e claro o estado de cada container. Você pode ainda, executar o comando:
$ docker stack services app ID NAME MODE REPLICAS IMAGE g3i4f4erympf app_nginx replicated 2/2 nginx:latest s11w093eraxz app_redis replicated 1/1 redis:latest
Para ter a visualização de sua stack no mesmo formato dos serviços (docker service ls).
O que fizemos até aqui foi portar uma stack do docker-compose para o cluster de swarm.
“Ahh mas como assim?”
Bom se você pegar esse mesmo arquivo de compose e executar: docker-compose up -d, ele funcionará também, sem erro, sua stack iniciará e ficará disponível para uso, MAS, não em cluster :), você continuará utilizando o docker-compose da mesma forma que antes, sem os benefícios do Swarm. Apenas com o docker deploy é que você poderá fazer o deploy e gerenciamento de sua stack dentro do cluster de swarm.
“Ok, entendido, mas como eu escalo agora a minha stack? Antes eu executava: docker-compose scale app=3, como faço isso com o docker stack?”, não se preocupe, você continuará tendo a possibilidade de escalar a sua stack, vamos lá: Já sabemos que o docker deploy criar todos os serviços necessários para a stack, certo? Pois bem, para escalar algum componente da sua stack, basta você escalar o serviço, da mesma forma como se você estivesse manipulando um serviço dentro do swarm, veja:
$ docker service ls ID NAME MODE REPLICAS IMAGE cnnabnpqkjvy app_redis replicated 1/1 redis:latest pcn4urntqn8l app_nginx replicated 2/2 nginx:latest
Agora vamos escalar o serviço de nginx da minha stack app:
$ docker service scale app_nginx=4 app_nginx scaled to 4
E o resultado é:
$ docker service ls ID NAME MODE REPLICAS IMAGE cnnabnpqkjvy app_redis replicated 1/1 redis:latest pcn4urntqn8l app_nginx replicated 4/4 nginx:latest
Ou seja, escalei apenas o nginx.
“Ok, muito bonito, mas como eu acesso a minha stack?”
Boa pergunta, mas é claro que há uma resposta, e é aqui que vem a parte mais legal ;).
Vamos voltar ao docker-compose.yml que usamos para criar essa stack, veja essas linhas:
nginx: image: nginx ports: - 80:80
Preste atenção no parâmetro: ports, ali você define em qual porta o serviço vai ouvir, neste caso, o nginx estará trabalhando na porta 80, ou seja, o serviço no cluster de swarm estará disponível para acesso através da porta 80, e todos os nós do cluster, quando receberem alguma requisição na porta 80 encaminharão para o container que atende este serviço (utilizando uma das funcionalidade do docker swarm que é a rede de serviço em mesh).
Quando escalamos um serviço, dizemos ao docker para adicionar mais containers para atender as requisições que estarão sendo feitas para o mesmo, ou seja, teremos diversos containers atendendo um único recurso que é o serviço, e o swarm se encarrega de distribuir os acessos para todos os containers.
“Ta bom, me convenceu, mas como removo tudo agora pra fazer direito?”
Muito fácil, da mesma forma que o docker service, basta você executar:
$ docker stack rm app Removing service app_redis Removing service app_nginx Removing network app_default
E serão removidos todos os serviços, containers e rede que tenham sido criadas pela sua stack.
Interessante não? Esperamos que tenha sido útil, se ficou com dúvida nos avisa que ajudamos. Por hoje era isso, nos ajude divulgando o blog e fique atento, teremos mais novidades em breve ;).
Abraço!
0sem comentários ainda