Imagens e Containers II

Continuando o conteúdo da semana passada, finalmente chegamos no tópico principal que são os containers.

Como criar um Container?

Agora que temos a nossa imagem "buildada" podemos finalmente criar os nossos containers.

O comando é igualmente simples:

docker run my-node-api

Simples assim, use o comando run, passe o nome da imagem que você quer criar o container, e teremos o nosso container de pé funcionando:

Hello Docker!

Gerenciando o ciclo de vida do container

A princípio, ele deve travar o seu terminal pois o container vai continuar executando em primeiro plano.

Podemos fazer ele entrar em segundo plano, devolvendo o controle do terminal para nós apertando:

Ctrl + P --> Ctrl + Q

Isso faz o Docker desprender o container do seu terminal e rodar em segundo plano.

Tendo o controle de volta, é possível checar a existência do container listando todos os containers. Semelhante ao que fizemos com as imagens, e nesse caso o comando é o ps:

> docker ps

CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS PORTS     NAMES
7f3a9c2d1e45   my-docker-api   "/bin/sh"     2 minutes ago   Up 2 minutes             happy_tesla

Podemos ver detalhes interessantes sobre o nosso container ali.

Primeiro que o nome dele é "happy_tesla", isso acontece pois não definimos um nome para o container quando criamos ele, então o Docker dá um nome aleatório para o identificarmos.

Outra coisa interessante é que ele tem um status, atualmente é "Up" que significa que ele está rodando, ou seja, está ligado.

Naturalmente, se ele pode estar ligado, podemos desligar ele também. O comando é stop:

docker stop happy_tesla

Também é possível remover ele usando o comando rm (remove):

docker rm happy_tesla

Lembrete rápido

O rm remove um container. O rmi remove a imagem.

A diferença entre o stop e o rm é que o stop só desliga o container, então podemos ligar ele de novo por meio do start (esse só liga, já o run cria e liga):

docker start happy_tesla

Já o rm remove mesmo o container, a "máquina" deixa de existir, então você não conseguiria dar mais o start .

Se precisar do container de novo, aquele já não existe mais, você precisaria criar um novo por meio do run.

Em uma analogia, o stop seria como desligar o seu computador ao invés de formatar ele para começar a usar do zero, que seria o rm seguido de um run.

Conhecendo melhor o run

Ao longo dessa aula nós passamos por alguns problemas como ter o terminal ocupado pelo docker depois de subir o container, e a falta de nome dele.

Rodando com nome em segundo-plano

Para resolver isso, o recomendado é utilizar uma versão mais completa do run ao invés de só passar o nome da imagem. Nesse caso, nós podemos fazer o seguinte:

docker run --name api -d my-node-api

O --name indica qual o nome que queremos dar ao nosso container.

Já o -d faz ele ser iniciado já em segundo plano, o que evita a necessidade de usar o Ctrl + P --> Ctrl + Q.

Dessa forma ele será criado com o nome api e rodará em segundo plano, liberando o terminal para usarmos de novo.

Rodando e destruindo automaticamente

Outra prática bem comum é criar o container, usar ele, e quando for parar de trabalhar, dar o stop no container e já remover ele usando o rm logo em seguida para o container não ficar ocupando o espaço na sua lista do ps.

Então para automatizar esse processo, podemos adicionar o --rm também nas opções:

docker run --name api --rm -d my-node-api

Assim, quando executarmos o docker stop my-node-api, o comando docker rm api será executado automaticamente depois do container desligar.

Esse é o padrão usado para containers que serão utilizados em ambiente de desenvolvimento.

Rodando comandos dentro do container

Um container é um computador linux rodando dentro da sua máquina, então pode ser que tenhamos a necessidade de executar um comando ou outro depois que ele foi criado, por exemplo: verificar o log de algo dentro do container, configurar permissões, instalar dependências, etc.

Quando o container estava rodando em primeiro plano, os comandos que nós estavamos executando estavam sendo enviados para o container, mas agora que iniciamos ele em segundo plano, eles voltaram a ser enviados para o nosso computador.

Então para voltar a direcionar um comando para o container, podemos usar o docker exec que serve para executar um comando dentro do container, ex:

docker exec api touch README.md

O api é o nome do nosso container, e o touch README.md é um comando do linux para criar um arquivo chamado README.md.

Para além disso, podemos querer entrar de novo no terminal do container igual quando o container estava rodando em primeiro-plano, e para isso podemos usar a flag -it junto com um comando que inicia o shell daquela imagem:

docker exec -it api bash

O it é a abreviação para Interactive + TTY.

Uma vez que nós quisermos sair do terminal do container e voltar para o nosso, podemos executar o comando:

exit

Isso vai encerrar o processo do shell dentro do container e nos devolver para o terminal do computador.

Considerações finais

Com isso nós aprendemos como lidar com os containers, gerenciar seu ciclo de vida, e executar comandos neles. Na semana que vem vamos aprender sobre volumes outro conceito essencial do Docker.

Fica ligado, assista a versão em vídeo no Youtube, curta, comente se tiver alguma dúvida, e compartilhe para aquele seu amigo que também está interessado no Docker.

Até a próxima.