Docker, o que é e qual é o propósito

111

Ouvi falar do Docker há alguns dias e queria ir.

Mas, na verdade, não sei qual é o propósito desse "container"?

O que é um container?

Ele pode substituir uma máquina virtual dedicada ao desenvolvimento?

Qual é o propósito, em palavras simples, de usar o Docker nas empresas? A principal vantagem?

mfrachet
fonte

Respostas:

116

VM: Usando o software VM, por exemplo, o Ubuntu pode ser instalado dentro de um Windows. E os dois correriam ao mesmo tempo. É como construir um PC, com seus componentes principais como CPU, RAM, discos, placas de rede, etc, dentro de um sistema operacional e montá-los para funcionar como se fosse um PC real. Desta forma, o PC virtual torna-se um “convidado” dentro de um PC real que com seu sistema operacional, que é chamado de host.

Container: é o mesmo que acima, mas em vez de usar um sistema operacional inteiro, ele corta os componentes "desnecessários" do SO virtual para criar uma versão mínima dele. Isso levou à criação de LXC (Linux Containers). É mais rápido que máquinas VM.

Docker: um contêiner docker, ao contrário de uma máquina virtual e um contêiner, não requer ou inclui um sistema operacional separado. Em vez disso, ele depende da funcionalidade do kernel do Linux e usa o isolamento de recursos.
Objetivo do Docker: Seu foco principal é automatizar a implantação de aplicativos dentro de contêineres de software e a automação da virtualização de nível de sistema operacional no Linux. É mais leve do que os contêineres padrão e inicializa em segundos. ggg

(Observe que não há sistema operacional convidado necessário no caso do Docker)

JerryGoyal
fonte
1
Tentei procurar recursos relacionados ao fluxo de trabalho de desenvolvimento-implantação do docker, mas não consigo encontrar nada. Vamos dar por exemplo um ambiente lampp com laravel + angular4. Eu compartilho um determinado arquivo com meus companheiros de equipe? Como edito a fonte do aplicativo (php html js / ts) se eu colocá-lo dentro de um contêiner? Ainda podemos usar git / svn em nosso código-fonte?
anaval
13
VM significa "máquina virtual". Não há necessidade de chamá-lo de "Máquina VM" porque então se torna "Máquina Virtual". :)
Dzhuneyt
32

[Observe que esta resposta se concentra em contêineres Linux e pode não se aplicar totalmente a outros sistemas operacionais. ]

O que é um container?

É um aplicativo : um contêiner é uma maneira de executar aplicativos isolados uns dos outros. Em vez de virtualizar o hardware para executar vários sistemas operacionais, os contêineres contam com a virtualização do sistema operacional para executar vários aplicativos. Isso significa que você pode executar mais contêineres no mesmo hardware do que VMs, porque você tem apenas uma cópia do sistema operacional em execução e não precisa pré-alocar os núcleos de memória e CPU para cada instância do seu aplicativo. Assim como qualquer outro aplicativo, quando um contêiner precisa da CPU ou Memória, ele os aloca e, em seguida, os libera quando concluído, permitindo que outros aplicativos usem esses mesmos recursos limitados posteriormente.

Eles aproveitam os namespaces do kernel : por padrão, cada contêiner receberá um ambiente em que os seguintes são namespaces:

  • Monte: sistemas de arquivos, /no contêiner serão diferentes do /host.
  • PID: ids do processo, pid 1 no contêiner é o seu aplicativo lançado, este pid será diferente quando visto do host.
  • Rede: os contêineres são executados com sua própria interface de loopback (127.0.0.1) e um IP privado por padrão. O Docker usa tecnologias como redes de ponte do Linux para conectar vários contêineres em sua própria rede privada.
  • IPC: comunicação entre processos
  • UTS: inclui o nome do host
  • Usuário: você pode, opcionalmente, deslocar todos os IDs de usuário para serem deslocados do host

Cada um desses namespaces também evita que um contêiner veja coisas como o sistema de arquivos ou processos no host ou em outros contêineres, a menos que você remova explicitamente esse isolamento.

E outras ferramentas de segurança do Linux : Os contêineres também utilizam outros recursos de segurança como SELinux, AppArmor, Capabilities e Seccomp para impedir que os usuários dentro do contêiner, incluindo o usuário root, possam escapar do contêiner ou impactar negativamente o host.

Empacote seus aplicativos com suas dependências para portabilidade : Empacotar um aplicativo em um contêiner envolve a montagem não apenas do próprio aplicativo, mas de todas as dependências necessárias para executar esse aplicativo, em uma imagem portátil. Esta imagem é o sistema de arquivos base usado para criar um contêiner. Como estamos apenas isolando o aplicativo, esse sistema de arquivos não inclui o kernel e outros utilitários do sistema operacional necessários para virtualizar um sistema operacional inteiro. Portanto, uma imagem para um contêiner deve ser significativamente menor do que uma imagem para uma máquina virtual equivalente, tornando mais rápida a implantação em nós da rede. Como resultado, os contêineres se tornaram uma opção popular para implementar aplicativos na nuvem e em data centers remotos.

Ele pode substituir uma máquina virtual dedicada ao desenvolvimento?

Depende : se seu ambiente de desenvolvimento está executando Linux e você não precisa de acesso a dispositivos de hardware ou é aceitável ter acesso direto ao hardware físico, então você encontrará uma migração para um contêiner Linux bastante simples. O destino ideal para um contêiner docker são aplicativos como APIs baseadas na web (por exemplo, um aplicativo REST), que você acessa através da rede.

Qual é o propósito, em palavras simples, de usar o Docker nas empresas? A principal vantagem ?

Dev ou Ops : Docker é normalmente colocado em um ambiente em um de dois caminhos. Desenvolvedores que procuram uma maneira de desenvolver mais rapidamente e testar localmente seus aplicativos e operações que procuram executar mais carga de trabalho em menos hardware do que seria possível com máquinas virtuais.

Ou Devops : um dos alvos ideais é aproveitar o Docker imediatamente a partir da ferramenta de implantação de CI / CD, compilando o aplicativo e construindo imediatamente uma imagem que é implantada para desenvolvimento, CI, prod, etc. Os contêineres geralmente reduzem o tempo para mover o aplicativo desde o check-in do código até que esteja disponível para teste, tornando os desenvolvedores mais eficientes. E quando projetada corretamente, a mesma imagem que foi testada e aprovada pelos desenvolvedores e ferramentas de CI pode ser implantada na produção. Como essa imagem inclui todas as dependências do aplicativo, o risco de algo quebrar na produção que funcionou no desenvolvimento é reduzido significativamente.

Escalabilidade : um último benefício importante dos contêineres que mencionarei é que eles são projetados para escalabilidade horizontal em mente. Quando você tem aplicativos sem estado sob carga pesada, os contêineres são muito mais fáceis e rápidos de dimensionar devido ao seu tamanho de imagem menor e sobrecarga reduzida. Por esse motivo, você vê os contêineres sendo usados ​​por muitas das maiores empresas baseadas na web, como Google e Netflix.

BMitch
fonte
2
+1 Concordo totalmente com sua resposta, especialmente com a parte "pode ​​substituir a (s) máquina (s) virtual (is)". Vejo muitos comentários em outros lugares enfatizando que o Docker não é uma máquina virtual, mas, por experiência própria, para muitos casos de uso ele funciona tão bem ou é até uma alternativa melhor. O que você quis dizer quando disse "aceitável ter acesso direto ao hardware físico"?
Tyress
2
@tyress se seu host for Linux, você pode montar dispositivos diretamente em um contêiner Linux. Já vi isso ser feito com dispositivos de som, mas tudo em / dev pode ser adicionado. Isso ignora algum isolamento do contêiner, mas faz sentido para tarefas específicas, como aplicativos de desktop.
BMitch
isso é incrível. Eu não pensei nisso.
Tyress
@BMitch: resposta muito limpa e elegante, thx !! Acho que agora posso visualizar o que é contêiner ... no entanto, seria ótimo se você pudesse atualizar sua resposta sobre como o contêiner está relacionado ao docker? Em comparação com o contêiner e a VM, o docker é equivalente ao hipervisor?
rahulaga_dev
1
O Docker é uma ferramenta que implementa contêineres, além de fornecer o restante do ecossistema necessário, como o registro no hub do docker e ambientes de desktop que incorporam uma VM para executar contêineres Linux.
BMitch
6

As mesmas perguntas estavam batendo na minha cabeça há alguns dias e o que descobri depois de entrar nisso, vamos entender em palavras bem simples.

Por que alguém pensaria em docker e containers quando tudo parece bem com o processo atual de arquitetura e desenvolvimento de aplicativos !!

Vamos dar um exemplo de que estamos desenvolvendo um aplicativo usando os serviços nodeJs, MongoDB, Redis, RabbitMQ etc [você pode pensar em quaisquer outros serviços].

Agora encaramos as seguintes coisas como problemas no desenvolvimento de aplicativos e no processo de remessa, se esquecermos da existência de docker ou outras alternativas de aplicativos em contêineres.

  1. Compatibilidade de serviços (nodeJs, mongoDB, Redis, RabbitMQ etc.) com o sistema operacional (mesmo depois de encontrar versões compatíveis com o sistema operacional, se algo inesperado acontecer relacionado às versões, então precisamos relançar a compatibilidade e consertar isso).

  2. Se dois componentes do sistema requerem uma biblioteca / dependência com versões diferentes no aplicativo no SO (Isso precisa ser relook todas as vezes no caso de um comportamento inesperado do aplicativo devido a problema de biblioteca e versão de dependência).

  3. Mais importante ainda, se uma nova pessoa entrar para a equipe, acharemos muito difícil configurar o novo ambiente, a pessoa terá que seguir um grande conjunto de instruções e executar centenas de comandos para finalmente configurar o ambiente. Isso leva tempo e esforço.

    As pessoas precisam ter certeza de que estão usando a versão correta do sistema operacional e verificar a compatibilidade dos serviços com o sistema operacional. E cada desenvolvedor deve seguir isso todas as vezes durante a configuração.

  4. Também temos ambientes diferentes, como desenvolvimento, teste e produção . Se um desenvolvedor se sentir confortável usando um sistema operacional e o outro estiver confortável com outro sistema operacional E, neste caso, não podemos garantir que nosso aplicativo se comportará da mesma maneira nessas duas situações diferentes .

Tudo isso dificulta nossa vida no processo de desenvolvimento , teste e envio de aplicativos.

Portanto, precisamos de algo que trate do problema de compatibilidade e nos permita fazer alterações e modificações em qualquer componente do sistema sem afetar os outros componentes.

Agora pensamos no docker porque seu objetivo é colocar os aplicativos em contêineres e automatizar a implantação de aplicativos e enviá-los com muita facilidade.

insira a descrição da imagem aqui

Como o docker resolve os problemas acima -

  1. Podemos executar cada componente de serviço (nodeJs, MongoDB, Redis, RabbitMQ) em diferentes contêineres com suas próprias dependências e bibliotecas no mesmo sistema operacional, mas com ambientes diferentes.

  2. Precisamos apenas executar a configuração do docker uma vez, então todos os desenvolvedores da nossa equipe podem começar com o comando docker run simples, economizamos muito tempo e esforços aqui :) .

Portanto, os contêineres são ambientes isolados com todas as dependências e bibliotecas agrupadas com seus próprios processos e interfaces de rede e montagens .

Todos os contêineres usam os mesmos recursos do sistema operacional, portanto, demoram menos para inicializar e utilizam a CPU de maneira eficiente com menos custos de hardware.

Espero que isso seja útil.

Siyaram Malav
fonte
2

Deixe-me tentar fornecer respostas o mais simples possível:

Mas, na verdade, não sei qual é o propósito desse "container"?

O que é um container?

Simplificando: um pacote contendo software . Mais especificamente, um aplicativo e todas as suas dependências agrupadas. Um ambiente de aplicativo normal, não dockerizado, é conectado diretamente ao SO, enquanto um contêiner Docker é uma camada de abstração do SO.

E um contêiner difere de uma imagem porque um contêiner é uma instância de tempo de execução de uma imagem - semelhante a como os objetos são instâncias de tempo de execução de classes, caso você esteja familiarizado com OOP.

Ele pode substituir uma máquina virtual dedicada ao desenvolvimento?

Ambas as VMs e os contêineres Docker são técnicas de virtualização, pois fornecem abstração sobre a infraestrutura do sistema.

Uma VM executa um sistema operacional “convidado” completo com acesso virtual aos recursos do host por meio de um hipervisor. Isso significa que a VM geralmente fornece ao ambiente mais recursos do que ele realmente precisa. Em geral, as VMs fornecem um ambiente com mais recursos do que a maioria dos aplicativos precisa. Portanto, os recipientes são uma técnica mais leve. Os dois resolvem problemas diferentes.

Qual é o propósito, em palavras simples, de usar o Docker nas empresas? A principal vantagem?

A conteinerização anda de mãos dadas com os microsserviços. Os serviços menores que compõem o aplicativo maior geralmente são testados e executados em contêineres do Docker. Isso torna o teste contínuo mais fácil.

Além disso, como os contêineres do Docker são somente leitura, eles impõem um princípio fundamental do DevOps: os serviços de produção devem permanecer inalterados

Alguns benefícios gerais de usá-los:

  • Grande isolamento de serviços
  • Grande capacidade de gerenciamento, pois os contêineres contêm tudo o que o aplicativo precisa
  • Encapsulamento da tecnologia de implementação (nos contêineres)
  • Utilização eficiente de recursos (devido à virtualização de sistema operacional leve) em comparação com VMs
  • Implementação rápida
Joel H
fonte