No mundo do desenvolvimento de software moderno, eficiência e consistência são fundamentais. Equipes de desenvolvimento e operações precisam de soluções que os ajudem a gerenciar, implantar e executar aplicativos de forma integrada em diferentes ambientes.

Contêineres e Docker são tecnologias que revolucionaram a forma como o software é construído, testado e implantado.

Se você é novo no mundo da tecnologia ou apenas deseja entender o básico do Docker, este artigo o guiará pelos essenciais.

Sumário

O Que São Contêineres?

Antes de mergulhar no Docker, vamos primeiro entender contêineres. Imagine que você está trabalhando em um projeto, e sua aplicação funciona perfeitamente em seu laptop. Mas quando você tenta executar a mesma aplicação em outra máquina, falha. Isso geralmente ocorre devido a diferenças nos ambientes: sistemas operacionais diferentes, versões de software instaladas ou configurações diferentes.

Contêineres resolvem esse problema ao empacotar uma aplicação e todas as suas dependências como bibliotecas, frameworks e arquivos de configuração em uma unidade única e padronizada. Isso garante que a aplicação seja executada da mesma forma, não importa onde ela seja implantada, seja em seu laptop, em um servidor ou na nuvem.

Principais características dos contêineres:

  • Leveza: Os contêineres compartilham o kernel do sistema hospedeiro, ao contrário das máquinas virtuais (VMs) que requerem instâncias de SO separadas, tornando-os mais rápidos e eficientes.

  • Portátil: Uma vez construído, um contêiner pode ser executado de forma consistente em vários ambientes.

  • Isolado: Os contêineres são executados em processos isolados, o que significa que eles não interferem em outros aplicativos que estão rodando no mesmo sistema.

O que é o Docker?

Agora que entendemos os contêineres, vamos falar sobre o Docker, a plataforma que tornou os contêineres populares.

O Docker é uma ferramenta de código aberto projetada para simplificar o processo de criação, gerenciamento e implantação de contêineres. Lançado em 2013, o Docker rapidamente se tornou a solução preferida para containerização devido à sua facilidade de uso, suporte da comunidade e poderoso ecossistema de ferramentas.

Conceitos Chave no Docker

  1. Imagens Docker: Pense em uma imagem Docker como um projeto para o seu contêiner. Ela contém tudo o que é necessário para executar o aplicativo, incluindo código, bibliotecas e dependências do sistema. As imagens são construídas a partir de um conjunto de instruções escritas em um Dockerfile.

  2. Containers Docker: Um container é uma instância em execução de uma imagem Docker. Quando você cria e inicia um container, o Docker lança a imagem em um ambiente isolado onde sua aplicação pode ser executada.

  3. Dockerfile: Este é um arquivo de texto que contém as etapas necessárias para criar uma imagem Docker. É aqui que você define como o seu container será, incluindo a imagem base, código de aplicação e quaisquer dependências adicionais.

  4. Docker Hub: O Docker Hub é um registro público onde os desenvolvedores podem compartilhar e acessar imagens pré-criadas. Se você está trabalhando em uma aplicação comum ou pilha de tecnologia, há grandes chances de já haver uma imagem disponível no Docker Hub, economizando seu tempo.

  5. Docker Compose: Para aplicações que requerem múltiplos contêineres (por exemplo, um servidor web e um banco de dados), o Docker Compose permite que você defina e gerencie ambientes de múltiplos contêineres usando um simples arquivo YAML.

Por que Docker?

A popularidade do Docker decorre de sua capacidade de resolver uma variedade de desafios que os desenvolvedores enfrentam hoje:

  • Consistência entre Ambientes: Os desenvolvedores podem “compilar uma vez, rodar em qualquer lugar”, garantindo que a mesma aplicação funcione da mesma forma em diferentes ambientes, desde o desenvolvimento local até a produção.

  • Velocidade: Os contêineres Docker são rápidos para iniciar e parar, tornando-os ideais para testes e pipelines de implantação.

  • Uso Eficiente de Recursos: Como os contêineres compartilham os recursos do sistema host de forma mais eficaz do que as máquinas virtuais, eles reduzem a sobrecarga e permitem uma maior densidade nas implantações.

  • Controle de Versão para Suas Aplicações: O Docker permite que você controle a versão não apenas do seu código, mas também do ambiente em que seu código é executado. Isso é particularmente útil para reverter para versões anteriores ou para depurar problemas em produção.

Arquitetura do Docker

Quando você começa a usar o Docker, pode tratá-lo como uma caixa que “simplesmente funciona”. Embora isso seja bom para começar, uma compreensão mais profunda da arquitetura do Docker ajudará você a solucionar problemas, otimizar o desempenho e tomar decisões informadas sobre sua estratégia de contêinerização.

A arquitetura do Docker é projetada para garantir eficiência, flexibilidade e escalabilidade. Ela é composta por vários componentes que trabalham juntos para criar, gerenciar e executar contêineres. Vamos dar uma olhada mais de perto em cada um desses componentes.

Arquitetura do Docker: Componentes Chave

A arquitetura do Docker é construída em torno de um modelo cliente-servidor que inclui os seguintes componentes

  • Cliente Docker

  • Daemon Docker (dockerd)

  • Motor do Docker

  • Imagens do Docker

  • Containers do Docker

  • Registros do Docker

1. Cliente do Docker

O Cliente do Docker é a principal forma de os usuários interagirem com o Docker. É uma ferramenta de linha de comando que envia instruções para o Daemon do Docker (que abordaremos a seguir) usando APIs REST. Comandos como docker build, docker pull e docker run são executados a partir do Cliente do Docker.

Quando você digita um comando como docker run nginx, o Cliente do Docker traduz isso em uma solicitação que o Daemon do Docker pode entender e agir. Basicamente, o Cliente do Docker atua como uma interface para interagir com os componentes mais complexos do backend do Docker.

2. Motor do Docker (dockerd)

O Daemon do Docker, também conhecido como dockerd, é o cérebro de toda a operação do Docker. É um processo em segundo plano que escuta as solicitações do Cliente do Docker e gerencia objetos do Docker como containers, imagens, redes e volumes.

Aqui está o que o Daemon do Docker é responsável por

  • Construir e executar containers: Quando o cliente envia um comando para executar um container, o daemon baixa a imagem, cria o container e o inicia.

  • Gerenciamento de recursos do Docker: O daemon lida com tarefas como configurações de rede e gerenciamento de volumes.

  • O Docker Daemon é executado na máquina host e se comunica com o Cliente Docker usando uma API REST, soquetes Unix ou uma interface de rede. Ele também é responsável por interagir com runtimes de contêineres, que lidam com a execução real dos contêineres.

3. Docker Engine

O Docker Engine é a parte central do Docker. É o que faz toda a plataforma funcionar, combinando o cliente, o daemon e o runtime do contêiner. O Docker Engine pode ser executado em vários sistemas operacionais, incluindo Linux, Windows e macOS.

Existem duas versões do Docker Engine

  • Docker CE (Community Edition): Esta é a versão gratuita e de código aberto do Docker amplamente utilizada para projetos pessoais e em menor escala.

  • Docker EE (Enterprise Edition): A versão paga de nível empresarial do Docker vem com recursos adicionais como segurança aprimorada, suporte e certificação.

O Docker Engine simplifica as complexidades da orquestração de contêineres integrando os vários componentes necessários para construir, executar e gerenciar contêineres.

4. Imagens Docker

Uma Imagem Docker é um modelo somente leitura que contém tudo o que sua aplicação precisa para ser executada – código, bibliotecas, dependências e configurações. As imagens são os blocos de construção dos contêineres. Quando você executa um contêiner, essencialmente está criando uma camada gravável em cima de uma imagem Docker.

As Imagens Docker são tipicamente construídas a partir de Dockerfiles, que são arquivos de texto que contêm instruções sobre como construir a imagem. Por exemplo, um Dockerfile básico pode começar com uma imagem base como nginx ou ubuntu e incluir comandos para copiar arquivos, instalar dependências ou definir variáveis de ambiente.

Aqui está um exemplo simples de um Dockerfile

dockerfileCopy codeFROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80

Neste exemplo, estamos usando a imagem oficial do Nginx como base e copiando nossos arquivos HTML locais para o diretório web do contêiner.

Uma vez que a imagem é construída, ela pode ser armazenada em um Registro Docker e compartilhada com outros.

5. Contêineres Docker

Um Contêiner Docker é uma instância em execução de uma Imagem Docker. É leve e isolado de outros contêineres, porém compartilha o kernel do sistema operacional hospedeiro. Cada contêiner tem seu próprio sistema de arquivos, alocação de memória, CPU e configurações de rede, o que o torna portátil e reprodutível.

Containers podem ser criados, iniciados, parados e destruídos, e até mesmo persistidos entre reinicializações. Como os containers são baseados em imagens, garantem que os aplicativos se comportem da mesma maneira, não importa onde sejam executados.

Algumas características-chave dos containers Docker:

  • Isolamento: Os containers são isolados entre si e do hospedeiro, mas ainda compartilham o mesmo kernel do sistema operacional.

  • Portabilidade: Os containers podem ser executados em qualquer lugar, seja em sua máquina local, em uma máquina virtual ou em um provedor de nuvem.

6. Registros do Docker

Um Registro do Docker é um local centralizado onde as Imagens do Docker são armazenadas e distribuídas. O registro mais popular é o Docker Hub, que hospeda milhões de imagens disponíveis publicamente. As organizações também podem configurar registros privados para armazenar e distribuir suas próprias imagens de forma segura.

Os Registros do Docker oferecem várias características-chave:

  • Versionamento de Imagem: As imagens são versionadas usando tags, facilitando o gerenciamento de diferentes versões de um aplicativo.

  • Controle de Acesso: Os registros podem ser públicos ou privados, com controle de acesso baseado em funções para gerenciar quem pode puxar ou empurrar imagens.

  • Distribuição: As imagens podem ser puxadas de um registro e implantadas em qualquer lugar, facilitando o compartilhamento e reutilização de aplicativos containerizados.

Container Runtime do Docker: containerd

Um desenvolvimento importante recente na arquitetura do Docker é o uso do containerd. O Docker costumava ter seu próprio tempo de execução de contêiner, mas agora usa o containerd, um tempo de execução de contêiner que segue padrões da indústria e também é usado por outras plataformas como o Kubernetes.

  1. O containerd é responsável por

    • Iniciar e parar contêineres

    • Gerenciar armazenamento e redes para contêineres

    • Puxar imagens de contêineres de registros

Ao separar o tempo de execução do contêiner da funcionalidade de nível mais alto do Docker, o Docker se tornou mais modular, permitindo que outras ferramentas usem o containerd enquanto o Docker se concentra em recursos voltados para o usuário.

Como Criar um Contêiner Simples Usando o Docker

Baixe a Imagem do Linux

Comece baixando a imagem alpine do Docker Hub. A imagem alpine é uma distribuição Linux mínima, projetada para ser leve e rápida.

Execute o seguinte comando:

docker pull alpine

Isso irá baixar a imagem alpine para o seu sistema local.

Execute o Contêiner

Crie e inicie um contêiner usando a imagem alpine. Também iremos iniciar uma sessão de terminal dentro do contêiner.

docker run -it alpine /bin/sh

Aqui está o significado de cada opção:

  • docker run: Cria e inicia um novo contêiner.

  • -it: Permite interagir com o contêiner (modo interativo + terminal).

  • alpine: Especifica a imagem a ser usada.

  • /bin/sh: Especifica o comando a ser executado dentro do contêiner (uma sessão de shell neste caso).

Explore o Contêiner

Assim que o contêiner estiver em execução, você verá um prompt de comando que se parece com isso

/ #

Isso indica que você está dentro do contêiner Alpine Linux. Agora você pode executar comandos do Linux. Por exemplo:

Verifique o diretório atual:

pwd

Liste os arquivos no diretório:

ls

Resultado: Uma estrutura de diretório mínima, já que o Alpine é uma imagem leve.

Você também pode instalar um pacote (Alpine usa apk como seu gerenciador de pacotes):

apk add curl

Sair do Contêiner

Quando terminar de explorar, digite exit para fechar a sessão e parar o contêiner

bashCopy codeexit

Acesse o Contêiner Após Pará-lo

Se deseja acessar o contêiner novamente após pará-lo, você pode usar este comando para listar todos os contêiners (incluindo os parados):

docker ps -a

Você verá uma lista de contêiners com seus IDs e status, então poderá iniciar o contêiner parado:

docker start <container-id>

Você pode anexar ao shell do contêiner usando este comando:

docker exec -it <container-id> /bin/sh

Se não precisar mais do contêiner, você pode removê-lo

  1. Parar o contêiner (se ainda estiver em execução):

     docker stop <id-do-contêiner>
    
  2. Remova o contêiner:

     docker rm <id-do-contêiner>
    

Resumo dos Principais Comandos do Docker

Comando Descrição
docker pull alpine Baixa a imagem do Alpine Linux.
docker run -it alpine /bin/sh Cria e inicia um contêiner interativo.
docker ps -a Lista todos os contêineres (em execução e parados).
docker start <id-do-contêiner> Inicia um contêiner parado.
docker exec -it <id-do-contêiner> Anexa a um contêiner em execução.
docker stop <id-do-contêiner> Para um contêiner em execução.
docker rm <id-do-contêiner> Remove um contêiner parado.

Conclusão

Agora que você tem um entendimento básico, é hora de colocar seu conhecimento em prática. Comece a experimentar o Docker, construa seu primeiro contêiner e explore seu vasto ecossistema.

Logo você verá por que o Docker se tornou um pilar da moderna DevOps e engenharia de software.

Você pode me seguir em