DevSecOps

22 fev, 2017

Docker 1.13: conheça mais sobre as funcionalidades Stack e Deploy

Publicidade

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!