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 se tornou parte da engine estável do Docker – sim estamos falando do docker stack/deploy. Mas antes, recomendo fortemente você ler este artigo 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.
Lembra-se que falei que era muito importante olhar esse artigo? 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 artigo supracitado, 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.
“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 vai 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 ele, 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.
“Está bem; 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 avise que ajudamos. Por hoje era isso.
Abraço!