Olá!

Iniciamos agora uma série de posts técnicos que lhe ajudarão a entender o funcionamento do Docker, e como cada componente é utilizado dentro desta plataforma.

Primeiro temos que definir o que não é Docker. Docker não é um sistema de virtualização tradicional. Enquanto em um ambiente de virtualização tradicional nós temos um S.O. completo e isolado, dentro do Docker nós temos recursos isolados que utilizando bibliotecas de kernel em comum (entre host e container), isso é possível pois o Docker utiliza como backend o nosso conhecido LXC.

Abaixo podemos ver uma figura que ilustra essa diferença.

lxc-vm

 

Docker é uma plataforma Open Source escrito em Go, que é uma linguagem de programação de alto desempenho desenvolvida dentro do Google, que facilita a criação e administração de ambientes isolados.

Mas por que que o Docker é tão legal?

O Docker possibilita o empacotamento de uma aplicação ou ambiente inteiro dentro de um container, e a partir desse momento o ambiente inteiro torna-se portável para qualquer outro Host que contenha o Docker instalado.

Isso reduz drasticamente o tempo de deploy de alguma infraestrutura ou até mesmo aplicação, pois não há necessidade de ajustes de ambiente para o correto funcionamento do serviço, o ambiente é sempre o mesmo, configure-o uma vez e replique-o quantas vezes quiser.

Outra facilidade do Docker é poder criar suas imagens (containers prontos para deploy) a partir de arquivos de definição chamados Dockerfiles (veremos isso melhor em posts futuros).

Não podemos nos esquecer também de que o Docker utiliza como backend default o LXC, com isso é possível definir limitações de recursos por container (memória, cpu, I/O, etc.)

Para ficar um pouco mais claro, podemos ver na imagem abaixo a diferença em se utilizar o LXC puro e o Docker.

lxc_vs_docker

 

Como o Docker faz isso?

Como ele trabalha utilizando cliente e servidor (toda a comunicação entre o Docker Daemon e Docker client é realizada através de API), basta apenas que você tenha instalado o serviço do Docker em um lugar, e aponte em seu Docker Client para esse servidor. A plataforma do Docker em si utilizada alguns conjuntos de recursos, seja para a criação ou administração dos containers, entre esses conjuntos podemos destacar a biblioteca libcontainer, que é responsável pela comunicação entre o Docker Daemon e o backend utilizado, é ela a responsável pela criação do container, e é através dela que podemos setar os limites de recursos por container.

Podemos ver na imagem abaixo como é o Workflow dentro do Docker.

libcontainer intro

 

 

Ficou com dúvidas? Ótimo! nos mande suas dúvidas para que possamos conversar mais sobre essa tecnologia. E aguardem, nos próximos posts explicaremos melhor cada um dos componentes do Docker, e claro traremos algumas aplicações práticas dele 😉

Até Mais!

 

Entusiasta Open Source, seu principal foco é ir atrás de ideias novas e torna-las realidade através de soluções simples e eficientes, o menos é mais, e o dividir é multiplicar.
  • Ricardo Fontanelli

    Olá cristiano, primeiramente parabéns pelo site, peguei o link por um post do Imasters e to gostando bastante. eu sempre me confundo com o conceito do Docker. Quer dizer, eu posso ter uma maquina com CentOS e ter containers nela rodando Ubunto ou Debian, por exemplo? Pelo que entendi, o que ele compartilha é só o kernel, então teoricamente, os containers possuem (parte de um OS).

  • Olá Ricardo,

    Junto com o Cristiano agradecemos ao seu elogio. Estamos começando com o projeto desse blog, onde queremos compartilhar a nossa vivência com Docker.

    Você pode ter um Ubuntu, Debian, FreeBSD ou qualquer outra distribuição baseada em Unix, pois o Kernel do host compartilha as bibliotecas comum entre o Kernel do host e o da imagem que você deseja utilizar, os complementos de uma distribuição para outra estarão na imagem que você irá utilizar.

    Se tiver mais alguma dúvida nos pergunte e vamos conversando sobre

  • Pingback: Docker API com Python | Mundo Docker()

  • Victor Magalhaes

    Grande trabalho, parabeńs!
    Amigo, podemos dizer que o docker (LXC) é uma virtualização de uma maquina virtual?
    Por exemplo, tenho uma maquina física onde, consigo rodar várias VM, em um mesmo Kernel.

    Abraço.

  • Oi Victor, LXC não chega a ser virtualização, pelo menos não da forma convencional, pois não há o overhead de ter 2 sistemas operacionais, o host e o virtual, você pode ter o Docker instalado em um host físico e ter seus containers rodando em cima disso sem problema, os containers compartilharam bibliotecas com o kernel da mesma forma como se fosse em cima de um VM.
    Obrigado pelo feedback, e tendo dúvidas vai perguntando.

  • Thiago Vendramel

    Estpu começando a acompanhar agora , e estou gostando muito parabéns pelo empenho
    Já existem cursos relacionados, presenciais ?

  • Oi Thiago!
    Obrigado pelo Feedback, isso é essencial para que possamos melhorar nosso material. Sobre cursos presenciais de Docker, eu sei que em SP tem alguns, esse é um deles: http://ctnovatec.com.br/cursos/trilha-infraestrutura-virtualizacao-e-nuvem/curso-docker, e em quase todas as capitais ocorrem os meetups sobre Docker, você é de onde?

  • Thiago Vendramel

    Sou de SP, vi esse curso, muito interessante, provavelmente vou faze-lo.
    Mais uma vez, parabéns pelo site, conteúdo excelente, tanto que recomendei para meus amigos e professores da facul.
    Forte abraço !

  • Lucas Mior

    Bom trabalho, usastes bons exemplos e definições bem interessantes.
    Parabéns

  • Fernando Willian de Souza Furt

    Bom trabalho, estou começando agora com Docker e curti muito o post me esclareceu algumas dúvidas que eu tinha.
    Porém me deixou com algumas outras…kkk

    Se o docker usa o mesmo kernel do host para que os containers rodem… Como é possível usar imagens de outros S.O’s ?

    Exemplo rodo o docker em um ubuntu e rodo um container com Debian ou CentOS, como ele faz para que isso funcione?

    PS: pode ser que eu esteja dando uma viajada kkk (como disse, sou bem noob) .

    Desde já agradeço, Abraço.

  • Oi Fernando,
    Toda pergunta é valida, não se preocupe, e a sua é bem interessante de ser respondida. Na verdade o Docker compartilha bibliotecas do kernel do host com os containers (suas layers na verdade), independente da distribuição, o kernel é mesmo, único, é por esse motivo que você pode rodar containeres diversos no mesmo host, e as bibliotecas que são especificas de uma distrbuição, estão encapsuladas na imagem que você baixa. Resumindo: tudo que é possível de ser compartilhado entre host – container, é compartilhado, o restante está na imagem que você baixou.

  • Marcos Donato

    Parabéns pelo site, que continue com a alta qualidade dos posts.

    Apesar de já ter lido um tanto sobre container e docker, acredito que não entendi seu conceito fundamental.

    Então, se for possível, me tirem uma dúvida. Para efeito de entendimento, suponha um ambiente de infraestrutura com quatro servidores, sei lá, DHCP, DNS, Print server e AD, e que devem estar isolados.

    Bem, seria possível criar um container para cada uma destes serviços deixando-os assim isolados um do outros?
    O funcionamento seria como se tivéssemos em quatro maquinas físicas?

  • Oi Marcos,
    Sim, o funcionamento é semelhante, apenas tome cuidado para que cada container execute no máximo 1 processo, tenha em mente que container foi feito para ser removido e criado a qualquer momento, então informações que precisam ser persistidas devem estar em volumes.

  • Miguel

    opa.. parabens pelo post..
    entao seria um pouco do conceito de “paravirtualização”? o que o xen e o vmware fazem quando estão virtualizado o linux?

  • Oi Miguel,
    Na verdade, para-virtualização é emulação de S.O como um todo, Docker não emula nada o que ele faz é trabalhar com uma biblioteca chamada containerd que realizada todas as operações no kernel do linux, criar as regras de isolamento do processo, limitações, etc. A grosso modo, é uma “virtualização” do processo, não de sistema operacional.

  • Miguel

    ah tah.. entendi.. obrigado.

  • Fabiano Farah

    Olá pessoal,
    Sou desenvolvedor .NET e em meu trabalho temos uma grande dificuldade com relação a manter o ambiente de desenvolvimento ser identico ao de produção. Eu nunca tinha lido nada sobre o que vinha a ser o DOCKER até que a curiosidade me veio hoje e resolvir pesquisar chegando a esse post muito bacana que vocês criaram. Depois de ler um pouco sobre o que vem a ser o DOCKER me veio uma dúvida, para cada conteinar que eu gero eu preciso enpacotar o servidor da aplicação certo? no caso de .NET seria o IIS. Se for assim eu teria que ter uma licença para IIS que iria gerar dentro do DOCKER? Essa pergunta vale para o SQL-Server já que ambos precisam de licenças por estação.

    Desde já agradeço a ajuda!!!!

  • Oi Fabiano,
    Obrigado pelo feedback.
    Quanto a sua dúvida, tanto a imagem de IIS quanto SQLServer utilizam como base o Windows Server Core, e o tipo de licenciamento das aplicações obedece a forma como essa imagem é licenciada, nesse link: https://hub.docker.com/r/microsoft/nanoserver/ você terá mais informações sobre isso

  • Hybeki Hyuga

    O que eu to fazendo aqui?

  • Fernando P Sanchez

    Tenho 4 perguntas que não querem calar que endereçaria 90% dos problemas de infraestrutura que temos em relação à ambientes Windows. Linux é um SO padronizado, compartilhado mais Simple de entender o reaproveitamento de Recursos de Kernel para o Docker, porém no mundo Windows temos um legado gigantesco de um SO engessado e não compartilhado.

    Gostaria de saber se o Docker está mais próximo do analista de infraestrutura convencional que conhece SO, rede, Virtualizacao ou mais próximo do desenvolvedor que conhece a codificação?

    O Pacote Contêiner Docker inclui todos os recursos para aplicação rodar, mas como ele trata de dependências de configuração de ambiente, como hostname, Ip etc, essa configuração vem com o conteiner ?

    Docker pode ser utilizado em ambiente Windows?

    Aplicações legadas (Windows) que rodavam em Windows NT, 2K ou 2K3 funciona com conteiner sobre Windows 2012?

  • Oi @fernando_p_sanchez:disqus , vamos tentar responder, e vamos conversando sobre.

    1 – O mais interessante do Docker é a sua dualidade, pois da mesma forma que você pode penas jogar o seu código e colocar a rodar, você também pode/deve ter uma boa noção de otimizações, segurança e todo o resto, pois apenas de ser isolado, um container pode consumir todos os recursos do host por exemplo, e não exime o administrador de cuidar para que não haja deficiência relacionadas a segurança para a aplicação.

    2 – Docker mesmo se encarrega de definir um nome e ip, obviamente isso pode ser modificado e você mesmo pode definir essas informações no momento do start do container, mas não é obrigatório.

    3 – Sim, desde que atendido os requisitos mínimos para execução do mesmo.

    4 – Depende muito, se sua aplicação pode ser portada ou tem suporte na versão do Windows 2012 e principalmente o Windows 2016, então OK, se é algo que executa apenas nessas versões, dai você não terá sucesso.

    Este é um bom assunto, espero que possa ter contribuído para solucionar algumas das suas dúvidas, e fica a vontade para conversarmos mais.

    Abraço!

  • Bruno Medeiros Granja

    Como vim parar aqui?

  • Kaique Beraguas

    ola, sou um programador iniciante e gostaria de saber se é possível criar um contêiner e depois mostra-lo no lado cliente no browser html5.

  • Oi @kaiqueberaguas:disqus,
    Deixa eu ver se entendi, você quer disponibilizar uma console para um container através do browser, isso?

  • Gerson Fell

    Olá

    Sou estudando de Engenharia de Computação e estou na fase de escolha do assunto do trabalho de conclusão de curso. Reparei que ainda não existe nem uma ferramente Web para gerenciamento do Docker. Seria um bom assunto para evoluir ? Realmente não existe um ferramente web para gerenciar o Docker ?

  • Oi @gersonfell:disqus,
    Na verdade já existem algumas iniciativas nesse sentido, olha isso:
    http://portainer.io/
    http://rancher.com/

    É claro que são ferramentas para uso genérico, talvez você possa explorar algo especifico.. e claro elas podem servir de base para o seu.

  • Kaique Beraguas

    um exemplo, eu criei um jogo simples na unity que precisa ser instalado no pc, eu instalo no servidor esse jogo e crio um container e disponibilizo para que os outros joguem esse jogo no browser.
    um exemplo besta mas acho que explica bem minha duvida, lembrando que sou programador iniciante com pouca experiencia de bagagem

  • Onilson Oliveira

    Pessoal gostaria de saber como vcs estão resolvendo o problema das portas, quando se tem vários containers com aplicações em uma única máquina virtual ? Eu estou fazendo um teste aqui colcocando alguns sistemas em containers, mas esses usam portas padrão como 8080, 8081, 5432 e outras. Faço o mapeamento de portas dos containers com o host local, mas começou a dar choques de portas por que alguns sistemas usam a mesma porta de comunicação, desta forma eu tenho que parar alguns containers para poder funcionar. Quero saber como vcs estão fazendo para gerenciar essas portas ? Minha intenção é reduzir o núemro de máquinas virtuais que sustem sistemas web, e colcoar várias aplicações em containers em poucas MVs.

  • Oi @kaiqueberaguas:disqus, um container é um processo isolado, existem casos de uso onde se utiliza um container docker para executar o firefox, libreoffice, etc, então nada impede que você possa fazer algo nesse sentido, desde que o container execute o processo que tu quer.

  • Oi @onilsonoliveira:disqus, atualmente temos dois cenários: Serviço internos, que não precisam de comunicação externa, e serviços web, que rodam cada um em uma porta, mas temos um proxy na frente para converter a requisição de dominio para a porta onde ele ouve, se as suas aplicações são web, você provavelmente acessa através de: ferramenta.dominio.local por exemplo, você pode configurar no proxy uma acl que dia: ferramenta.dominio.local vai para ip:90000, não sei se fui claro, mas vamos conversando.

  • Kaique Beraguas

    entendi, obrigado

  • VANESSA BIGATTO

    Sou novata no mundo docker e queria fazer uma pergunta:
    Preciso testar um sistema em pelo menos 3 SOs diferentes (vista, xp e 7).
    É possivel usar o docker, tendo um SO em cada container e apontando os 3 para o mesmo sistema?

    Obrigada

  • Oi @[email protected]:disqus,
    Um container é um processo isolado com recursos limitados a apenas o seu uso. Não é possível atualmente (e provavelmente nunca será) ter um container utilizando uma imagem de um S.O dos quais mencionou. O que você pode fazer é encasular a sua aplicação em container e ai sim executá-la em outros hosts/S.O. desde que tenha Docker instalado (no caso dos S.O que mencionou você pode utilizar o Docker ToolBox)

  • Mica Freitas

    Boa noite! sou novato no mundo Linux. Tenho o seguinte cenário, uma suite de aplicações que rodam em conjunto para atender todos os cliente, sendo que cada cliente possui o seu servidor “em casa”, até onde vi o Docker se encaixa como uma luva no quesito de padronização da configuração, e principalmente do tempo de criação de um novo servidor, minha duvida é a seguinte, quando precisar instalar, remover ou dar manutenção em algum serviço dentro do container, preciso ir em todos os hosts de clientes, ou existe uma forma que eu poça fazer isso em um “container master”, e que essa nova configuração se replique em todos os outros containers, existe possibilidade de fazer isso?

  • Bom dia Mica Freitas,

    O ideal é que você não acesse os containers, mas sim se precisar fazer alguma modificação nele, você possa descarta-lo e subir outro. Você tem acesso aos servidores que os clientes tem? Se sim, você poderia criar um cluster com Docker Swarm e dai criar uma imagem para os clientes, quando precisa-se modificar algo você poderia alterar a imagem e mandar o container se atualizar com a imagem nova. É possível fazer isso utilizando services, segue o link aqui do post que pode lhe ajudar com isso: https://www.mundodocker.com.br/docker-service/

    Agora se você não possuí acesso a máquina do cliente então o ideal seria você criar uma imagem e sempre que modificar pedir pro cliente baixar essa sua imagem para pegar a ultima atualização e iniciar o container novamente.

    Obrigado e qualquer dúvida é só postar aqui novamente, tenha uma ótima semana.

  • Oi!!! Tem alguém aí ainda? Kkkk

    2017 e eu estou começando a estudar docker agora.

    Seguinte, temos 5 clientes, cada 1 com um droplet no digital ocean com seu bd MySQL, a cada semana eu tenho a árdua tarefa de fazer deploy de Back, front e BD em cada cliente deste.

    Docker poderia me ajudar nisso? Onde devo começar?

    MUITO OBRIGADO!!!

  • Oi @daniellucena:disqus,
    Docker pode te ajudar fazendo com que toda a sua “infra” necessária para executar a aplicação seja portável, ou seja, você pode converter tudo que tem no droplet para um container (não recomendo utilizar o banco de dados em containers). Dessa forma, você pode inclusive versionar a sua infra e fazer rollback muito mais fácil. Podemos seguir essa conversa por e-mail, caso queira.