[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.