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.