Iniciando com Docker

Depois de algum tempo sem escrever para o blog resolvi compartilhar com os amigos um pouco mais sobre o tão falado Docker.

Primeiramente é importante destacar o que é um container e qual a diferença entre o container e uma máquina virtual. Para explicar melhor a diferença entre um e outro vamos ver a imagem abaixo:

O container ele abstrai da máquina host o kernel e todos os binários para execução de um novo sistema operacional abstraído dentro do Container. Na Virtual Machine é necessário que cada VM tenha uma instalação completa
do sistema operacional. Isto consome mais recursos visto que precisamos o sistema operacional completo para executar nossas aplicações. A grande vantagem do Docker é você poder dividir dentro de uma mesma máquina diversos containers com apenas aquela
parte do SO que precisamos para rodar nossa aplicação. Além disso assim como o antigo Chroot Jail ele possibilita individualizarmos as estruturas de modo que cada container acesse apenas o file system mapeado no container.

A diferença entre a imagem vs Container

O que é uma imagem
A imagem é a aplicação que nós queremos rodar

O que é um container
O container é a instância da imagem que rodará o processo, nós podemos ter vários containers rodando sob a mesma imagem do SO.
Em nossos testes iremos utilizar uma imagem do servidor web NGINX. O docker procura por padrão uma imagem registrada com o nome solicitado no repositório
do Docker Hub hub.docker.com

– Nosso primeiro teste baixando a imagem do NGINX pelo Docker Hube colocar para rodar em foreground

Para começar vamos fazer o NGINX rodar em nossa porta 80 em foreground usando o comando

docker container run –publish 80:80 nginx

1. No exemplo acima o Docker baixou do hub.docker.com uma imagem com o nome de NGINX
2. Iniciou um novo container pela imagem do NGINX
3. Abriu a porta 80 no localhost
4. Roteou o tráfego do container para o IP e porta 80 local

Rodando o container do NGINX em background

Para colocarmos a imagem do NGINX em background devemos adicionar o comando –detach

docker container run --publish 80:80 --detach nginx
a saída do comando irá gerar algo como o exemplo abaixo. que é a hash gerada pelo docker

c51b53bf4e45f97e1f06a827c8b18bd050f15a388609cc2360e4c01f94b4da77

Verificando os containers online
Para verificarmos o status dos containers abertos usamos o comando

docker container ls

Um exemplo de saída de comando será algo como:

bash-3.2# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c51b53bf4e45 nginx "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp pensive_stallman

* Isto mostra que temos o container NGinx rodando a 3 minutos. O ID do container serve para tomarmos ações junto ao container

Com o comando abaixo você pode verificar todos os containers que fora executados e stopados anteriormente. Basta adicionar a flag -a

docker container ls -a

Parando um container
Para parar um container ativo devemos executar o comando:

docker container stop c51b53bf4e45

Para verificar o efeito do comando basta executar o docker container ls para ver o status dos containers

Iniciando um novo container e dando um nome
O comando abaixo adiciona um nome ao nosso container. No exemplo abaixo vamos adicionar o nome de webhost

docker container run --publish 80:80 --detach --name webhost nginx

Verificando os logs de um determinado container
Para verificarmos os logs em tempo real de um determinado container vamos utilizar o comando:

docker container logs webhost

* temos que especificar o nome do container no qual queremos ver os logs

Consultando os processos de um determinado container
A forma mais fácil de verificar o que um determinado container está executando é o comando top. Com o comando abaixo você
pode consultar em tempo real os containers que estão em ação:

docker container top webhost

Removendo múltiplos containers
Para remover múltiplos container simultaneamente precisamos execificar as iniciais dos IDs. Siga o nosso exemplo abaixo:

docker container rm 105 c51 1b9 8e0 2ae 9bc 5c6 ff9 f03 2a6 474 563 5b6

* OBS: Você não pode remover um container que está em execução a menos que utilize a flag -f para forçar. O correto é você parar o container e depois remover

Criando um novo container e mapeando um diretório local para dentro do container

Vamos imaginar agora que queremos mapear o diretório src/ para dentro do container e vamos utilizar este diretório como diretório principal do NGINX. Para isto siga os passos abaixo:

Primeiramente vamos criar um diretório para nosso exemplo. No meu caso resolvi centralizar tudo em

/Docker/dockerfiles/nginx-test/

Dentro deste diretório criei meu arquivo Dockerfile com o seguinte conteúdo:

FROM nginx:latest

Este docker file é muito simples, podemos adicionar diversas outras linhas nele mas começaremos apenas especificando esta dependência.

Vamos mandar o docker executar o comando:

docker build -t helloworld .

Com o comando acima estamos levando em consideração que criamos um novo container para ser rodado com o nome de helloworld.

Depois basta rodarmos o comando

docker run -v src:/usr/share/nginx/html -p 80:80 helloworld

Mapeando portas locais diferentes das portas do container
Vamos imaginar que eu queira mapear a porta 8080 para dentro da porta 80 dentro do container. Para isto vamos executar o comando:

docker container run -p 8080:80 nginx

Mapeando diretórios locais dentro de um container em modo interativo
O modo interativo é interessante para testes de scripts e desenvolvimento, mas para ambiente de produção é interssante utilizar o Dockerfile. Vamos utilizar um exemplo simples de mapeamento de diretório para dentro do nosso container com NGINX.

Primeiramente vamos criar um diretório chamado public_html. Dentro deste diretório criaremos um arquivo chamado index.html com o conteúdo Hello World.

Agora vamos mapear este diretório padrão para o NGINX para dentro de nosso container:

docker container run -p 8080:80 -v $(pwd)/public_html:/usr/share/nginx/html nginx

O comando acima quer dizer:

-p 8080:80: isto diz para que container rode da porta local 8080 para dentro da porta 80 do NGINX

-v $(pwd)/public_html: diz para mapear o volume public_html do diretório do NGINX /usr/share/nginx/html