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?
Respostas:
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.
(Observe que não há sistema operacional convidado necessário no caso do Docker)
fonte
[Observe que esta resposta se concentra em contêineres Linux e pode não se aplicar totalmente a outros sistemas operacionais. ]
É 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:
/
no contêiner serão diferentes 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.
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.
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.
fonte
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.
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.
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).
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).
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.
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.
Como o docker resolve os problemas acima -
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.
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 :) .
Espero que isso seja útil.
fonte
Deixe-me tentar fornecer respostas o mais simples possível:
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.
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.
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:
fonte