Docker - Comandos básicos




O Docker lembra o conceito de máquina virtual onde é possível simular um sistema operacional dentro do sistema operacional principal (Exemplo: uma máquina rodando Windows 10 pode rodar dentro dela um ambiente com Linux, isolado do Windows).

Com o Docker é possível pegar seu script em qualquer linguagem (PHP, Node.JS, Python, etc), baixar uma imagem de sistema operacional apenas com os recursos básicos para rodar o script (Kernel de Linux mais a instalação do Node.JS com Mongo por exemplo) e rodar este script como se fosse uma máquina isolada dedicada apenas a este script.

Além disso é possível criar várias instancias de um mesmo script como se fossem várias máquinas separadas.

A instalação do Docker é um pouco chata e apenas máquinas com capacidade de virtualização podem rodá-lo. Algumas versões de Windows tem tido problemas para rodar o Docker. O Recomendado é que ele seja instalado em ambiente Linux que é seu lugar 'natural'. O guia para instalação pode ser acessado aqui ( DOCKER COMMUNITY EDITION (CE) ).

Dentro do diretório em que estão os arquivos de sua aplicação é necessário também um arquivo Dockerfile que possui as configurações necessárias para que o Docker saiba como montar a máquina e os recursos necessários para sua aplicação. Este arquivo é um txt normal que pode ser editado livremente por você. Neste breve guia não vamos indicar os comandos a serem colocados no arquivo Dockerfile.

Comandos básicos:

 $ docker ps  


Lista todos os containers que estão rodando no momento

 $ docker ps -a  


Lista todos os containers incluindo, além dos que estão rodando, os que rodaram e terminaram sua execução.

 $ docker images  


Lista todas as imagens criadas no Docker. Na lista não só estarão as imagens que você criou com seus scripts mas também as imagens que o Docker baixa com o kernel do sistema operacional e instalações de programas necessárias para rodar os seus scripts.

 $ docker start <nome_do_container>

 $ docker stop <nome_do_container>

 $ docker restart <nome_do_container>

Operações que podem ser feitas em um container

 $ docker build -t <nome_da_imagem>:<tag> .  


Cria a imagem do script com o nome nome_da_imagem no diretório em que você está no momento baseado nos parâmetros configurados no arquivo Dockerfile

 $ docker run --name <nome_do_container> <nome_da_imagem>:<tag>  


Cria um container ou uma instância da imagem <nome_da_imagem>:<tag>.
Neste ponto é interessante dizer que a partir de uma unica imagem é possível criar vários containers rodando em paralelo. Vamos supor que você tenha um script index.js em Node que imprime na tela um 'Hello Word'. A imagem neste exemplo se chama helloword. Podemos criar três containers com diferentes nomes rodando esta mesma imagem com o script dentro. Basta rodar:
 $ docker run --name hw1 helloword:latest

 $ docker run --name hw2 helloword:latest

 $ docker run --name hw3 helloword:latest

Serão três instancias do mesmo script/imagem. Ao dar um docker ps -a você poderá ver os três containers lá (hw1,hw2 e hw3).

 $ docker run -it -p <porta_de_escuta_externa>:<porta_de_escuta_interna> --name <nome_do_container> <nome_da_imagem>:<tag>  


Roda o container e faz com que ele escute a porta porta_de_escuta_externa . Ele poderia, por exemplo, escutar a porta 80 de um navegador e mandar os dados para a porta_de_escuta_interna. Por exemplo o comando docker run -it -p 80:3000 --name hw1 helloword:latest escuta a porta 80 (através de um navegador por exemplo) e envia os dados para a porta 3000 dentro do container, que se comunica com o script que está rodando.


 $ docker run -d <nome_da_imagem>:<tag>  

Roda um container em background com a opção -d

 $ docker network connect internet <nome_do_container>  

Em algumas situações o container não consegue se comunicar com o exterior (rede, internet). O comando acima libera a rede.

 $ docker run --rm --name <nome_do_container> <nome_da_imagem>:<tag>  


Remove o container automaticamente depois que este termina sua execução. Uma alternativa para processos que rodam em um crontab

 $ docker run --rm --env-file <caminho_para_o_arquivo_de_ambiente> --name <nome_do_container> <nome_da_imagem>:<tag>  


O --env-file acessa um arquivo de ambiente externo ao container com configurações. Remove o container automaticamente com --rm depois que este termina sua execução. --net


 $ docker rm <nome_do_container>


Mata o container de nome nome_do_container.

 $ docker rmi <nome_da_imagem>:<tag>


Destroi a imagem <nome_da_imagem>:<tag>.
Se você tentar destruir uma imagem em que existem containers rodando o Docker não vai permitir. É necessário matar os containers com docker rm <nome_do_container> que se referem àquela imagem. No exemplo do Hello Word seria necessário matar os três containers docker rm hw1, docker rm hw2, docker rm hw3 para depois destruir a imagem com docker rmi helloword:latest

 $ docker version

Mostra a versão do docker


 $ docker help <comando>

Ajuda do comando


 $ docker logs <nome_do_container>

Exibe os logs do container


 $ docker logs <nome_do_container> --tail=50 -f

Limita o log as 50 ultimas linhas


 $ docker exec -it <nome_do_container> <comando>


Acessa o container e roda um determinado comando. Exemplo docker exec -it helloword bash acessa o bash dentro do container helloword.

Brincando com uma instalação do Ubuntu


 $ docker run -it ubuntu bash


O Docker irá verificar se existe uma imagem do Ubuntu em sua máquina, se não existir ele baixa e cria o container automaticamente com um nome padrão. O parametro -i deixa o STDIN aberto permitindo interagir com o container. Você poderá interagir com a imagem normalmente como se estivesse no sistema operacional Ubuntu. Para sair da imagem e voltar para o Docker basta dar um exit.

Se você der um docker ps -a poderá ver o container do Ubuntu em que acabou de sair. Um docker images irá mostrar a imagem do ubuntu:latest.




Comentários

Postagens mais visitadas deste blog

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()

MySQL - Clonando tabelas na linha de comando

PHP - Gerando arquivo em UTF-8 com fwrite() e utf8_encode()