Se você usa ou pretende usar Redis, RabbitMQ, WordPress, MySql/MariaDB, Postgres, Memcached, MongoDB, ElasticSearch, LogStash, Kibana, e outras soluções, plataformas ou ferramentas e não sabe como Docker vai obrigatoriamente mudar sua vida nos próximos anos, preste bem atenção.

Sendo Docker ou um sucessor, a utilização de containers está aí para ficar e já está mudando a forma como vemos infraestrutura. Nunca foi tão fácil ter acesso a soluções originalmente linux, sem precisar aguardar um port para windows.

A diferença

O primeiro aspecto, extremamente relevante e serve muito bem como porta de entrada, é a possibilidade de testar tecnologias de forma muito fácil. Qualquer pequenina máquina virtual, com Docker, permite a você criar ambientes de desenvolvimento e testes, com qualquer uma das soluções que citei no primeiro parágrafo, entre outras milhares. É tão interessante quanto indispensável dizer que você usará uma única linha para instalar cada um desses serviços, essa é a mágica que faz toda diferença.

Enquanto no passado além de uma máquina virtual Linux, você precisava conhecer detalhes de cada instalação, e talvez sofrer com pequenos conflitos entre versões de pacotes, dependências, e conflitos causados por uma nova instalação, todo container é uma virtualização, não tão complexa quanto uma máquina virtual, trabalha sob features do kernel Linux, mas não deixa de ser uma forma de virtualização.

Você, como usuário de um container nem sabe, mas a imagem que você usa para criar um container provavelmente possui muitos novos pacotes e dependências que seu host desconhece. Esse isolamento e abstração faz com que seja, sem sombra de dúvida, a melhor estratégia para montar ambientes de desenvolvimento. Na minha visão pessoal, complementa o modelo de virtualização convencional oferecendo um segundo nível de virtualização, eficiente, robusto e homogêneo.

A simplicidade

A partir de uma vm com Docker, é mais simples criar uma instância MySql ou MariaDB, do que fazer um cadastro em qualquer cloud service que possa oferecer a mesma coisa. Isso se aplica a praticamente todos as imagens de produtos. Não acredita?

Poste.io

Abaixo, temos o comando para a criação de um servidor de email com Webmail, SMTP, POP, IMAP, SSH. Pode parecer simples, mas a figura abaixo demonstra todo o trabalho necessário para juntar isso tudo em uma única imagem docker.

 Schema Poste.IO

Ao final, usar uma imagem Docker é extremamente simples. Olhe com calma o script, é um comando único que separei em diversas linhas para facilitar a compreensão. Você deve ter notado a repetição do parâmetro -p. Esse parâmetro informa para o Docker como ele fará o binding de portas. Note que -p 1080:80 -p 10443:443, estão diferentes dos demais. Não vou detalhar agora, mas lembre-se disso, esse exemplo será útil no final desse post.

MySQL

O comando abaixo cria uma uma instância MySQL, onde a senha do usuário root do banco é “rootpwd”, além de termos um novo database “NomeDataBase”, onde usuário e senha são respectivamente “NomeUsuario” e “SenhaUsuario”.

Simples não? Agora seu MySQL está criado, rodando na porta 3306, seu novo banco, vazio, está criado, e com conectividade tanto para o root, quanto para o usuário e senha que você especificou nos argumentos do comando. Deseja criar uma nova base? Crie uma base, usando seu cliente MySQL de preferência, ou crie um novo container. Ainda não estamos falando de boas práticas!

O que você precisa saber?

O estudo de Docker não é nada assustador, exige algum conhecimento de Linux, mas Docker é permissivo quanto ao seu nível de conhecimento. Mesmo que você não conheça nada de Linux e não conheça nada  de Docker, conseguirá usá-lo já na primeira hora, na medida que for se aprofundando, verá que as possibilidades são infinitas.

Terminologia

Docker traz consigo alguns termos, por hora vou me ater aos principais termos necessários para você usá-lo. Sob esse ponto de vista, você vai precisar saber que um DockerFile foi necessário para criar uma Imagem, que um container é criado obrigatoriamente a partir de uma imagem. Uma imagem obrigatoriamente foi criada sob outra imagem, e apenas a imagem principal do Docker não possui nenhuma base, ela é a partícula de Deus, no universo Docker.

DockerFile

Arquivo de Script, que especifica para o Docker comandos Linux a serem executados afim de criar uma imagem. Um DockerFile começa especificando uma imagem-base, necessária para a execução dos seus scripts. Além dos scripts, o DockerFile contém instruções que determinam arquivos, pastas e downloads a serem feitos durante o processo de build de uma imagem.

Imagem

Uma imagem é um container pré-compilado, que pode ser usado para criar um container ou para ser estendido por um DockerFile na criação de uma nova imagem.

Port Binding

A maioria dos containers oferecem algum serviço, exposto por alguma(s) porta(s). Todo container, no Docker, é executado em uma rede virtual, e possui um IP exclusivo. Nos exemplos vemos o parâmetro -p 10443:443, essa sentença define para o Docker que, no IP virtual do container, definido por ele mesmo, temos uma porta 443 exposta, enquanto no host, onde o Docker foi instalado, um redirecionamento virtual será criado, escutando a porta 10433. Como resultado, todo tráfego TCP ou UDP da porta do Host será redirecionada para a porta do container.

Container

O container é um processo virtualizado, que executa uma imagem, possui autonomia de Máquina Virtual, mas com a leveza de um processo virtualizado. Possui um IP virtual, pode ou não escutar portas específicas, e pode compartilhar diretórios, ou volumes.

Exemplo real

Vejamos como podemos criar 2 containers mysql na mesma máquina:

Nesse exemplo tive a necessidade de especificar portas de binding diferentes (10001 e 10002), no entanto as 2 instalações do MySQL estão escutando a porta 3306. Sim, como cada container recebeu um IP virtual, ambos podem escutar a porta 3306, sem entrar em conflito, pois cada um escuta em um ip, em uma placa de rede virtual e independente da outra. O Binding feito no host que precisa respeitar a alocação de portas, já que estamos falando de uma única placa de rede, e por isso no host os bindings são feitos para portas independentes, respectivamente 10001 e 10002.

A estratégia de entregar IP’s virtuais para cada container é uma ideia simples, eficiente e extremamente poderosa. Cada container continua usando as mesmas portas, o que efetivamente faz diferença é o binding, e a porta alocada no host. Esse detalhe é feito na criação e uma imagem não precisa ser modificada por conta desse tipo de mudança, é uma simples configuração do parâmetro de criação do container.

Introdução ao Docker no Canal.Net

No dia 4/Março, uma sexta-feira, 21:00, vou compor o time do Renato Groff  e vamos falar de Docker no hangout Introdução ao Docker do Canal .Net.

Se você está interessado em conhecer um pouquinho mais sobre Docker, já está mais que convidado!

Canal .Net - Introdução ao Docker

Sugestões e novos temas

Pelo menos para as próximas semanas, Docker será um assunto latente no meu dia-a-dia, não apenas por conta do hangout, mas por conta de trabalhos, ambientes que cuido que estão em produção com Docker e minha recente paixão pela solução.

Se você tem alguma dúvida, sugestão, ou mesmo algum questionamento, sinta-se a vontade para falar diretamente comigo. Diferente do que pode parecer, estou completamente acessível e gosto muito de escutar opiniões e responder a questionamentos. Sua dúvida pode ser útil a milhares de outros assinantes! Use o espaço de comentários aqui embaixo para comentar, ou me mande um email, o endereço está no topo da página.

Comente, compartilhe, curta!

Logo abaixo desse texto você encontra os Posts Relacionados, e botões de compartilhamento, em seguida a sessão de comentários!

Gostou? Então aproveite para curtir, compartilhar e enviar comentários, dúvidas ou sugestões.

Conheça o Grupo Arquitetura de Softwate | .NET: Facebook e Telegram
Luiz Carlos Faria: Site, Youtube, Facebook, Twitter, Telegram, Linkedin e Email