Primeiros passos com Docker

O que é Docker ?

De forma bem resumida, podemos dizer que o Docker é uma plataforma aberta, criada com o objetivo de facilitar o desenvolvimento, a implantação e a execução de aplicações em ambientes isolados. Foi desenhada especialmente para disponibilizar uma aplicação da forma mais rápida possível

Usando o Docker, você pode facilmente gerenciar a infra-estrutura da aplicação, isso agilizará o processo de criação, manutenção e modificação do seu serviço.

Todo processo é realizado sem necessidade de qualquer acesso privilegiado à infraestrutura corporativa. Assim, a equipe responsável pela aplicação pode participar da especificação do ambiente junto com a equipe responsável pelos servidores.

Virtualização a nível do sistema operacional

O modelo de isolamento utilizado no Docker é a virtualização a nível do sistema operacional, um método de virtualização onde o kernel do sistema operacional permite que múltiplos processos sejam executados isoladamente no mesmo host. Esses processos isolados em execução são denominados no Docker de contêiner.

Para criar o isolamento necessário do processo, o Docker usa a funcionalidade do kernel, denominada de namespaces, que cria ambientes isolados entre containers: os processos de uma aplicação em execução não terão acesso aos recursos de outra.A menos que seja expressamente liberado na configuração de cada ambiente.

Instalação

Para execução dos próximos passos a segui é necessário ter o docker instalado de acordo com o seu sistema operacional.

Caso não tenha instalado ainda siga os passos AQUI.

Comandos básicos

Para utilização do Docker é necessário conhecer alguns comandos e entender de forma clara e direta para que servem, assim como alguns exemplos de uso.

Executando um contêiner

Para iniciar um contêiner é necessário saber a partir de qual imagem será executado. Para listar as imagens que seu Docker host tem localmente, execute o comando abaixo:

docker image list

As imagens retornadas estão presentes no seu Docker host e não demandam qualquer download da nuvem pública do Docker, a menos que deseje atualizá-la. Para atualizar a imagem basta executar o comando abaixo:
docker image pull python

Caso deseje inspecionar a imagem que acabou de atualizar, basta usar o comando abaixo:

docker image inspect python

O comando inspect é responsável por informar todos os dados referentes à imagem. Agora que temos a imagem atualizada e inspecionada, podemos iniciar o contêiner.

docker container run <parâmetros> <imagem> <CMD> <argumentos>

Mapeamento de volumes

Para realizar mapeamento de volume basta especificar qual origem do dado no host e onde deve ser montado dentro do contêiner.

docker container run -it --rm -v "<host>:<container>" python

Mapeamento de portas

Para realizar o mapeamento de portas basta saber qual porta será mapeada no host e qual deve receber essa conexão dentro do contêiner.

docker container run -it --rm -p "<host>:<container>" python

Um exemplo com a porta 80 do host para uma porta 8080 dentro do contêiner tem o seguinte comando:

docker container run -it --rm -p 80:8080 python

Com o comando acima temos a porta 80 acessível no Docker host que repassa todas as conexões para a porta 8080 dentro do contêiner. Ou seja, não é possível acessar a porta 8080 no endereço IP do Docker host, pois essa porta está acessível apenas dentro do contêiner que é isolada a nível de rede, como já dito anteriormente.

Verificando a lista de contêineres

Para visualizar a lista de contêineres de um determinado Docker host utilizamos o comando docker container ls. Esse comando é responsável por mostrar todos os containers,
mesmo aqueles que não estão mais em execução.

docker container ls <parâmetros>

Gerenciamento de contêineres

Uma vez iniciado o contêiner a partir de uma imagem é possível gerenciar a utilização com novos comandos. Caso deseje desligar o contêiner basta utilizar o comando docker stop. Ele recebe como argumento o ID ou nome do contêiner. Ambos os dados podem ser obtidos com o docker ps, explicado no tópico anterior.

Um exemplo de uso:

docker container stop meu_python

No comando acima, caso houvesse um contêiner chamado meu_python em execução, ele receberia um sinal SIGTERM e, caso não fosse desligado, receberia um SIGKILL depois de
10 segundos. Caso deseje reiniciar o contêiner que foi desligado e não iniciar um novo, basta executar o comando docker start:

docker container start meu_python

Criando sua própria imagem no Docker

Antes de explicarmos como criar sua imagem, vale a pena tocarmos em uma questão que normalmente confunde iniciantes do docker: “Imagem ou contêiner?”

Qual a diferença entre Imagem e Contêiner?

Traçando um paralelo com o conceito de orientação a objeto, a imagem é a classe e o contêiner o objeto. A imagem é a abstração da infraestrutura em estado somente leitura, de
onde será instanciado o contêiner.
Todo contêiner é iniciado a partir de uma imagem, dessa forma podemos concluir que nunca teremos uma imagem em execução.

Um contêiner só pode ser iniciado a partir de uma única imagem. Caso deseje um comportamento diferente, será necessário customizar a imagem.

Como criar imagens

Há duas formas de criar imagens customizadas: com commit e com Dockerfile.

Criando imagens com commit

É possível criar imagens executando o comando commit, relacionado a um contêiner. Esse comando usa o status atual do contêiner escolhido e cria a imagem com base nele.

Vamos ao exemplo. Primeiro criamos um contêiner qualquer:

docker container run -it --name containercriado ubuntu:16.04 bash

Agora que estamos no bash do contêiner, instalamos o nginx:

apt-get update
apt-get install nginx -y
exit

docker container stop <containercriado>

Agora, efetuamos o commit desse contêiner em uma imagem:

docker container commit containercriado meuubuntu:nginx 

Criando imagens com Dockerfile

Quando se utiliza Dockerfile para gerar uma imagem, basicamente, é apresentada uma lista de instruções que serão aplicadas em determinada imagem para que outra imagem
seja gerada com base nas modificações.

Primeiro crie um arquivo qualquer para um teste futuro:

touch arquivo_teste

Crie um arquivo chamado Dockerfile e dentro dele o seguinte conteúdo:

FROM ubuntu:16.04
RUN apt-get update && apt-get install nginx -y
COPY arquivo_teste /tmp/arquivo_teste
CMD bash

No arquivo acima, utilizamos quatro instruções:

FROM para informar qual imagem usaremos como base, nesse caso foi ubuntu:16.04.

RUN para informar quais comandos serão executados nesse ambiente para efetuar as mudanças necessárias na infraestrutura do sistema. São como comandos executados no shell do ambiente, igual ao modelo por commit, mas nesse caso foi efetuado automaticamente e, é completamente rastreável, já que esse Dockerfile será armazenado no sistema de controle de versão.

COPY é usado para copiar arquivos da estação onde está executando a construção para dentro da imagem. Usamos um arquivo de teste apenas para exemplificar essa possibilidade,
mas essa instrução é muito utilizada para enviar arquivos de configuração de ambiente e códigos para serem executados em serviços de aplicação.

CMD para informar qual comando será executado por padrão, caso nenhum seja informado na inicialização de um contêiner a partir dessa imagem. No exemplo, colocamos o
comando bash, se essa imagem for usada para iniciar um contêiner e não informamos o comando, ele executará o bash.

Após construir seu Dockerfile basta executar o comando abaixo:

docker image build -t meuubuntu:nginx_auto .

Tal comando tem a opção “-t”, serve para informar o nome da imagem a ser criada. No caso, será meuubuntu:nginx_auto e o “.” ao final, informa qual contexto deve ser usado nessa construção de imagem. Todos os arquivos da pasta atual serão enviados para o serviço do docker e apenas eles podem ser usados para manipulações do Dockerfile (exemplo do uso do COPY).