Os contêineres são uma palavra da moda há anos... mas o que são exatamente?
Os contêineres são um método de execução de aplicativos virtualizados em seu computador, semelhante às máquinas virtuais, mas usando um conjunto diferente de tecnologias subjacentes. Eles podem ser complexos de entender, mas são essenciais para executar tudo, desde Minecraft servidores para o Google. E vamos mostrar como configurá-los.
Usaremos Linux, um sistema operacional desenvolvido com foco em portabilidade, modularidade e estabilidade. O Linux está em tudo, desde servidores até micro-ondas e consoles de videogame. Os contêineres não estão limitados à execução no Linux, mas as tecnologias por trás deles são mais adequadas e funcionam melhor no Linux. Se você é novo no Linux, recomendamos que você dê uma olhada em nosso Guia do iniciante antes de mergulhar.
Os contêineres são máquinas virtuais?
Os contêineres podem ser um tópico complexo, mas é melhor começar com um ponto-chave: um contêiner é não uma máquina virtual. Uma máquina virtual é uma versão simulada de hardware específico e seu software executado no que é conhecido como hipervisor. Se você já usou software como VirtualBox ou
O hipervisor geralmente é executado como seu próprio sistema operacional (conhecido como hipervisor tipo 1) ou dentro dos limites de outro sistema operacional como Windows ou Ubuntu (um hipervisor tipo 2). A responsabilidade do hipervisor é apresentar ao sistema operacional convidado o hardware simulado necessário para sua execução. O sistema operacional completo pode então ser executado no topo. Isso inclui tudo, desde CPU e RAM simuladas até barramentos de dados, unidades de disco ou adaptadores de rede. Essa simulação é computacionalmente cara, portanto, as máquinas virtuais normalmente apresentam sobrecarga significativa.
Então, o que é um contêiner?
Um contêiner é semelhante a uma máquina virtual, pois contém e executa software em um ambiente isolado em um sistema host. No entanto, os contêineres substituem a virtualização de hardware tradicional, contando diretamente com o sistema operacional host. Os contêineres compartilham as bibliotecas e binários do sistema operacional host e possuem apenas os recursos e dependências necessários para executar o aplicativo específico que contêm. Isso significa que não há necessidade de um sistema operacional completo por contêiner, pois todos os contêineres executados em um sistema pode compartilhar o sistema operacional de host único, mantendo a segregação que você obtém com o virtual máquinas.
Os contêineres acessam o sistema operacional host por meio de um mecanismo de contêiner, que gerencia os contêineres em execução e controla seu acesso ao sistema operacional subjacente. Isso pode incluir reforçar a segurança entre contêineres e conceder ou negar acesso a arquivos do sistema operacional ou conexões de rede.
Quais são algumas compensações no uso de contêineres?
Embora máquinas virtuais e contêineres sejam semelhantes, o uso de contêineres tem suas desvantagens. Por um lado, as máquinas virtuais são consideradas mais seguras, pois a superfície de ataque para “escapar” da máquina virtual é significativamente menor e mais difícil de penetrar. Um contêiner pode não ser adequado para testar malware, por exemplo.
O principal benefício do uso de contêineres é que eles são leves, evitando a necessidade de virtualizar um sistema operacional inteiro, o que significa tempos mínimos de inicialização e redução da sobrecarga do sistema. Isto significa que muitos mais contêineres podem ser executados em um host, o que não seria possível com máquinas virtuais.
Como os contêineres não exigem um sistema operacional completo, eles podem ser facilmente empacotados em imagens menores e distribuídos. Embora uma imagem completa de máquina virtual possa facilmente ter dezenas de gigabytes, os contêineres podem vir em imagens de até 15 KB. Isso torna extremamente fácil distribuir e usar contêineres. Demonstraremos isso executando alguns exemplos simples de contêineres no Docker.
Instalando o Docker
Isso é muita teoria, então vamos ser práticos. Para mostrar como configurar um contêiner, instalaremos o Docker no Ubuntu 23.10 e o usaremos para executar um contêiner Hello World simples. Nossas etapas são testadas em uma máquina virtual, mas você também pode fazer inicialização dupla a partir do seu PC com Windows ou usar um ótimo laptop para Linux.
O Docker rapidamente se tornou a ferramenta de fato para conteinerização. Embora existam outras ferramentas, o Docker é amplamente adotado e é perfeito para todos, exceto os aplicativos mais exigentes. Há documentação sobre as diferentes maneiras de instalar o Docker, mas usaremos o script de instalação conveniente. Este comando baixará um script de get.docker.com para sua máquina local:
$ curl -fsSL https://get.docker.com -o get-docker.sh
Você pode então executar este script para instalar o Docker. Você pode verificar se o Docker está instalado corretamente verificando a versão com:
$ sudo sh ./get-docker.sh
Seguido por uma verificação de versão com:
$ sudo docker version
Você também pode verificar se o serviço docker está sendo executado em segundo plano com:
$ sudo systemctl status docker
Deve indicar ‘ativo (em execução)’ em texto verde, conforme destacado na imagem abaixo. A versão do mecanismo Docker também deve ser impressa sem erros.
Executando um exemplo simples
Agora que o Docker está instalado, você pode usá-lo para baixar uma imagem de contêiner. As imagens de contêiner são muito parecidas com ISOs para máquinas virtuais, exceto que geralmente são menores e mais fáceis de construir. Baixe uma imagem simples de contêiner hello-world com o seguinte comando:
$ sudo docker pull hello-world
Depois que a imagem for baixada, você pode verificar listando as imagens baixadas em seu sistema usando o seguinte:
$ sudo docker images
Agora você deve ver o hello-world baixado. Observe o tamanho muito pequeno (13 KB em nossa máquina de teste), bem como sua etiqueta. A tag de uma imagem é efetivamente sua versão. Por padrão, o Docker baixará a versão mais recente de uma imagem. Execute um contêiner baseado nesta imagem usando:
$ sudo docker run hello-world: latest
Isso produzirá o discurso hello-world do Dockers, que é executado a partir de um programa C muito pequeno (que você pode conferir em GitHub).
Parabéns; você executou seu primeiro contêiner! Neste caso, o programa apresentou seu resultado e finalizou sua execução. O contêiner agora está morto e não está mais em execução.
Como manter os contêineres vivos
Depois de executar um contêiner básico, agora podemos construir um exemplo mais complexo que não sai imediatamente após a conclusão de uma tarefa. Os contêineres geralmente são construídos em torno de um único processo, o que pode gerar mais processos. Assim que esse processo base terminar, todo o contêiner sairá com ele. Isso pode parecer uma limitação, mas na verdade é muito semelhante ao funcionamento dos sistemas init no kernel Linux completo.
Para executar um exemplo persistente, podemos extrair uma imagem do Nginx, que é um servidor web usado para hospedar uma porcentagem significativa dos sites do mundo. Escolhemos o Nginx para este exemplo porque é simples, não requer configuração avançada e é leve. Baixe a imagem Nginx mais recente com o seguinte comando:
$ sudo docker pull nginx
Nós adicionamos o -p sinalizar aqui para configurar o encaminhamento de porta do contêiner para o sistema operacional host. A porta 80 é usada para tráfego HTTP não criptografado (ou seja, web). Isso permitirá que você acesse o contêiner da sua máquina host:
$ sudo docker run -p 80:80 nginx
Este comando será executado em seu terminal no modo anexado, o que significa que o contêiner está literalmente anexado ao seu terminal, então todos os logs do contêiner serão impressos lá. Depois que o contêiner for iniciado, abra http://localhost no seu navegador. Você verá uma tela de boas-vindas do Nginx semelhante a abaixo:
O contêiner Nginx agora está sendo executado dentro do seu mecanismo de contêiner. Embora o Nginx seja executado no modo anexado, ele continuará funcionando apenas enquanto estiver aberto. Você pode sair do contêiner Nginx pressionando Ctrl + C no seu terminal.
Como executar contêineres em segundo plano
Para executar o Nginx em segundo plano, adicionaremos outro sinalizador, -d, para modo desanexado. Isso iniciará o contêiner desanexado do seu terminal, o que significa que ele estará em segundo plano. Por exemplo:
$ sudo docker run -d -p 80:80 nginx
Você pode listar contêineres em execução em um sistema. Observe como seu contêiner Nginx agora está sendo executado em segundo plano e recebeu um ID.
$ sudo docker ps
Um contêiner em segundo plano em execução pode ser eliminado usando seu ID. Você também pode notar que o contêiner recebeu um nome. Quando um não for especificado, o Docker dará a cada contêiner um nome aleatório e exclusivo.
$ sudo docker kill
No entanto, você pode testar isso com algumas imagens mais interessantes. Há muitos disponíveis no Hub Docker, que funciona como um repositório central para imagens de contêineres públicos.
Mergulhando mais fundo com contêineres
Esta foi uma breve introdução aos contêineres. Os contêineres podem ser infinitamente complexos, mas são um elemento fundamental dos sistemas altamente distribuídos que executam grande parte da nossa Internet moderna. No entanto, esse poder não diminui seu uso em menor escala. A familiaridade com os conceitos básicos de contêineres e do Docker pode ser a porta de entrada para a execução de serviços locais úteis, como um Servidor minecraft ou Plex em um PC antigo.