Docker é uma plataforma de software para construir aplicativos baseados em contêineres – ambientes de execução pequenos e leves que fazem uso compartilhado do kernel do sistema operacional, mas são executados isoladamente um do outro. Embora contêineres como conceito já existam há algum tempo, o Docker, um projeto de código aberto lançado em 2013, ajudou a popularizar a tecnologia e ajudou a impulsionar a tendência de contêinerização e micros serviços no desenvolvimento de software, que ficou conhecido como desenvolvimento nativo da nuvem.
Um dos objetivos do desenvolvimento de software moderno é manter os aplicativos no mesmo host ou cluster isolados uns dos outros para que não interfiram indevidamente na operação ou manutenção uns dos outros. Isso pode ser difícil, graças aos pacotes, bibliotecas e outros componentes de software necessários para sua execução. Uma solução para esse problema são as máquinas virtuais, que mantêm os aplicativos no mesmo hardware totalmente separados e reduzem ao mínimo os conflitos entre os componentes de software e a competição por recursos de hardware. Mas as máquinas virtuais são volumosas – cada uma requer o seu próprio sistema operacional, então geralmente tem gigabytes de tamanho – e são difíceis de manter e atualizar.
Os contêineres, por outro lado, isolam os ambientes de execução dos aplicativos uns dos outros, mas compartilham o kernel do SO subjacente. Eles normalmente são medidos em megabytes, usam muito menos recursos do que as VMs e inicializam quase imediatamente. Eles podem ser compactados com muito mais densidade no mesmo hardware e girados para cima e para baixo em massa com muito menos esforço e sobrecarga. Os contêineres fornecem um mecanismo altamente eficiente e granular para combinar componentes de software nos tipos de aplicativos e pilhas de serviço necessários em uma empresa moderna e para manter esses componentes de software atualizados e mantidos.
Docker é um projeto de código aberto que facilita a criação de contêineres e aplicativos baseados em contêiner. Construído originalmente para Linux, o Docker agora funciona no Windows e no MacOS também. Para entender como o Docker funciona, vamos dar uma olhada em alguns dos componentes que você usaria para criar aplicativos em contêineres do Docker.
Cada contêiner do Docker começa com um Dockerfile. Um Dockerfile é um arquivo de texto escrito em uma sintaxe fácil de entender que inclui as instruções para construir uma imagem Docker (falaremos mais sobre isso em instantes). Um Dockerfile especifica o sistema operacional que servirá de base para o contêiner, junto com as linguagens, variáveis ambientais, locais de arquivos, portas de rede e outros componentes de que precisa – e, é claro, o que o contêiner realmente fará quando for executado.
Depois de escrever seu Dockerfile, você invoca o utilitário de compilação do Docker para criar uma imagem baseada nesse Dockerfile. Enquanto o Dockerfile é o conjunto de instruções que informa ao build como fazer a imagem, uma imagem do Docker é um arquivo portátil que contém as especificações para quais componentes de software o contêiner será executado e como. Como um Dockerfile provavelmente incluirá instruções sobre como obter alguns pacotes de software de repositórios online, você deve tomar cuidado para especificar explicitamente as versões adequadas, ou então o seu Dockerfile pode produzir imagens inconsistentes dependendo de quando é invocado. Mas, uma vez que uma imagem é criada, ela é estática.
O utilitário run do Docker é o comando que realmente inicia um contêiner. Cada contêiner é uma instância de uma imagem. Os contêineres são projetados para serem transitórios e temporários, mas podem ser parados e reiniciados, o que ativa o contêiner no mesmo estado de quando foi interrompido. Além disso, várias instâncias de contêiner da mesma imagem podem ser executadas simultaneamente (desde que cada contêiner tenha um nome exclusivo). A revisão do código apresenta uma grande análise das diferentes opções para o comando de execução, para lhe dar uma ideia de como ele funciona.
Embora a construção de contêineres seja fácil, não pense que você precisará construir cada uma de suas imagens do zero. Docker Hub é um repositório SaaS para compartilhamento e gerenciamento de contêineres, onde você encontrará imagens oficiais do Docker de projetos de código aberto e fornecedores de software e imagens não oficiais do público em geral. Você pode baixar imagens de contêineres contendo códigos úteis ou fazer upload do seu próprio código, compartilhá-los abertamente ou torná-los privados. Você também pode criar um registro Docker local se preferir. (Docker Hub teve problemas no passado com imagens carregadas com backdoors integrados nelas).
O Docker Engine é o núcleo do Docker, a tecnologia cliente-servidor subjacente que cria e executa os contêineres. De modo geral, quando alguém diz Docker genericamente e não está falando sobre a empresa ou o projeto geral, está se referindo ao Docker Engine. Existem duas versões diferentes do Docker Engine em oferta: Docker Engine Enterprise e Docker Engine Community.
A Docker lançou sua Enterprise Edition em 2017, mas a sua oferta original, renomeada Docker Community Edition, permanece como fonte aberta e gratuita, e não perdeu nenhum recurso no processo. Em vez disso, a Enterprise Edition, que custa $1.500 por nó por ano, adicionou recursos avançados de gerenciamento, incluindo controles para cluster e gerenciamento de imagem e monitoramento de vulnerabilidade. O blog BoxBoat apresenta um resumo das diferenças entre as edições.
A ideia de que um determinado processo possa ser executado com algum grau de isolamento do resto do seu ambiente operacional foi construída em sistemas operacionais Unix, como BSD e Solaris, por décadas. A tecnologia de contêiner Linux original, LXC, é um método de virtualização de nível de sistema operacional para executar vários sistemas Linux isolados em um único host. O LXC foi possibilitado por dois recursos do Linux: namespaces, que envolvem um conjunto de recursos do sistema e os apresentam a um processo para fazer parecer que são dedicados a esse processo; e cgroups, que controlam o isolamento e o uso de recursos do sistema, como CPU e memória, para um grupo de processos.
Os contêineres separam os aplicativos dos sistemas operacionais, o que significa que os usuários podem ter um sistema operacional Linux limpo e mínimo e executar todo o resto em um ou mais contêineres isolados. E como o sistema operacional é abstraído dos contêineres, você pode mover um contêiner em qualquer servidor Linux que suporte o ambiente de tempo de execução do contêiner.
O Docker introduziu várias mudanças significativas no LXC que tornam os contêineres mais portáteis e flexíveis de usar. Usando contêineres do Docker, você pode implantar, replicar, mover e fazer backup de uma carga de trabalho de forma ainda mais rápida e fácil do que usando máquinas virtuais. O Docker traz flexibilidade semelhante à da nuvem para qualquer infraestrutura capaz de executar contêineres. As ferramentas de imagem de contêiner do Docker também foram um avanço em relação ao LXC, permitindo a um desenvolvedor construir bibliotecas de imagens, compor aplicativos a partir de várias imagens e lançar esses contêineres e aplicativos em infraestrutura local ou remota.
O Docker também torna mais fácil coordenar os comportamentos entre os contêineres e, assim, criar pilhas de aplicativos juntando os contêineres. O Docker Compose foi criado pelo Docker para simplificar o processo de desenvolvimento e teste de aplicativos de vários contêineres. É uma ferramenta de linha de comando, que lembra o cliente Docker, que obtém um arquivo descritor formatado especialmente para montar aplicativos de vários contêineres e executá-los em conjunto em um único host.
Versões mais avançadas desses comportamentos – que são chamados de orquestração de contêineres – são oferecidas por outros produtos, como Docker Swarm e Kubernetes. Mas o Docker fornece o básico. Embora o Swarm tenha crescido a partir do projeto Docker, o Kubernetes se tornou a plataforma de orquestração Docker preferida.
Os contêineres Docker fornecem uma maneira de construir aplicativos corporativos e de linha de negócios que são mais fáceis de montar, manter e mover do que seus equivalentes convencionais.
Os contêineres Docker permitem o isolamento e a limitação
Os contêineres do Docker mantêm os aplicativos isolados, não apenas uns dos outros, mas do sistema subjacente. Isso não apenas torna a pilha de software mais limpa, mas torna mais fácil ditar como um determinado aplicativo em contêiner usa os recursos do sistema – CPU, GPU, memória, E/S, rede e assim por diante. Também torna mais fácil garantir que os dados e o código sejam mantidos separados. (Consulte “Os contêineres do Docker são sem estado e imutáveis” abaixo.)
Contêineres Docker permitem portabilidade
Um contêiner Docker é executado em qualquer máquina que ofereça suporte ao ambiente de tempo de execução do contêiner. Os aplicativos não precisam estar vinculados ao sistema operacional host, portanto, tanto o ambiente do aplicativo quanto o ambiente operacional subjacente podem ser mantidos limpos e mínimos.
Por exemplo, um contêiner MySQL para Linux será executado na maioria dos sistemas Linux que oferecem suporte a contêineres. Todas as dependências do aplicativo são normalmente entregues no mesmo contêiner.
Aplicativos baseados em contêiner podem ser movidos facilmente de sistemas locais para ambientes em nuvem ou de laptops de desenvolvedores para servidores, desde que o sistema de destino suporte Docker e qualquer uma das ferramentas de terceiros que possam estar em uso com ele, como Kubernetes.
Normalmente, as imagens de contêiner do Docker devem ser construídas para uma plataforma específica. Um contêiner do Windows, por exemplo, não será executado no Linux e vice-versa. Anteriormente, uma maneira de contornar essa limitação era iniciar uma máquina virtual que executasse uma instância do sistema operacional necessário e executar o contêiner na máquina virtual.
No entanto, a equipe do Docker, desde então, desenvolveu uma solução mais elegante, chamada manifestos, que permite que imagens para vários sistemas operacionais sejam empacotadas lado a lado na mesma imagem. Os manifestos ainda são considerados experimentais, mas indicam como os contêineres podem se tornar uma solução de aplicativo de plataforma cruzada e também de ambiente cruzado.
Os contêineres Docker permitem a composição
A maioria dos aplicativos de negócios consiste em vários componentes separados organizados em uma pilha – um servidor da web, um banco de dados, um cache na memória. Os recipientes permitem compor essas peças em uma unidade funcional com peças facilmente substituíveis. Cada peça é fornecida por um contêiner diferente e pode ser mantida, atualizada, trocada e modificada independentemente das outras.
Este é essencialmente o modelo de micros serviços de design de aplicativo. Ao dividir a funcionalidade do aplicativo em serviços separados e independentes, o modelo de micros serviços oferece um antídoto para retardar os processos de desenvolvimento tradicionais e aplicativos monolíticos inflexíveis. Contêineres leves e portáteis facilitam a construção e manutenção de aplicativos baseados em micros serviços.
Os contêineres do Docker facilitam a orquestração e o dimensionamento
Como os contêineres são leves e impõem pouca sobrecarga, é possível iniciar muitos mais deles em um determinado sistema. Mas os contêineres também podem ser usados para dimensionar um aplicativo em clusters de sistemas e para aumentar ou diminuir os serviços para atender a picos de demanda ou conservar recursos.
A maioria das versões de nível empresarial das ferramentas para implantação, gerenciamento e dimensionamento de contêineres são fornecidas por meio de projetos de terceiros. O principal deles é o Kubernetes do Google, um sistema para automatizar como os contêineres são implantados e escalonados, mas também como eles são conectados, balanceados e gerenciados. O Kubernetes também fornece maneiras de criar e reutilizar definições de aplicativos de vários contêineres ou “gráficos Helm”, para que pilhas complexas de aplicativos possam ser criadas e gerenciadas sob demanda.
O Docker também inclui o seu próprio sistema de orquestração integrado, o modo Swarm, que ainda é usado para casos menos exigentes. Dito isso, o Kubernetes se tornou algo da escolha padrão, na verdade, o Kubernetes vem com o Docker Enterprise Edition.
Os contêineres resolvem muitos problemas, mas não são a cura para tudo. Algumas de suas deficiências são por design, enquanto outras são subprodutos de seu design.
Os contêineres Docker não são máquinas virtuais
O erro conceitual mais comum que as pessoas cometem com contêineres é equipará-los a máquinas virtuais. No entanto, como os contêineres e as máquinas virtuais usam mecanismos de isolamento diferentes, eles têm vantagens e desvantagens distintas.
As máquinas virtuais fornecem um alto grau de isolamento para processos, uma vez que são executadas em sua própria instância de um sistema operacional. Esse sistema operacional não precisa ser igual ao executado no host. Uma máquina virtual Windows pode ser executada em um hipervisor Linux e vice-versa.
Os contêineres, por outro lado, usam partes controladas dos recursos do sistema operacional host, muitos aplicativos compartilham o mesmo kernel do sistema operacional, de forma altamente gerenciada. Como resultado, os aplicativos em contêineres não são tão isolados quanto as máquinas virtuais, mas fornecem isolamento suficiente para a grande maioria das cargas de trabalho.
Referencia: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
A gestão de custos é um dos maiores desafios enfrentados pelas empresas, especialmente quando esses…
As startups, impulsionadas por inovação e agilidade, navegam em um cenário digital vibrante, mas também…
A segurança cibernética é crucial para startups, independentemente do seu tamanho ou setor de atuação.…
O gerenciamento de vulnerabilidades é o processo de identificar, avaliar, tratar e relatar vulnerabilidades de…
O DNS Cache Poisoning, ou envenenamento de cache DNS, é uma forma de ataque cibernético…
O DNS hijacking é um ataque malicioso que envolve a alteração das configurações de DNS…