O Docker é a solução definitiva para o problema de contêineres de software e virtualização. Sim, é uma afirmação forte! Outros produtos tentaram lidar com esses problemas, mas a abordagem inovadora e o ecossistema do Docker eliminaram a concorrência do mercado. Este guia ajudará você a entender os conceitos básicos do Docker, para que você possa começar a usá-lo em suas próprias aplicações e adotá-lo em seu fluxo de trabalho.
Conteúdo:
- A História do Docker
- Como o Docker Funciona?
- Componentes e Ferramentas do Docker
- Compreendendo Contêineres do Docker
- Criando um Contêiner Docker com Imagens do Docker
- O que há em um Contêiner Docker?
- Como Executar um Contêiner?
- Por que Você Usaria um Contêiner?
- Dicas Úteis
- Melhores Práticas do Docker
- Comandos do Docker
- Considerações Finais
A História do Docker
O Docker foi criado em 2013 por Solomon Hykes enquanto trabalhava para a dotCloud, uma empresa de hospedagem em nuvem. Ele foi originalmente desenvolvido como uma ferramenta interna para facilitar o desenvolvimento e a implantação de aplicativos. Os contêineres do Docker são baseados em contêineres Linux, que existem desde o início dos anos 2000, mas não eram amplamente utilizados até que o Docker criou uma plataforma simples e fácil de usar para executar contêineres, que rapidamente ganhou popularidade entre desenvolvedores e administradores de sistema.
Em março de 2014, o Docker tornou sua tecnologia de código aberto e tornou-se um dos projetos mais populares no GitHub, levantando milhões de investidores logo em seguida.
Em um período incrivelmente curto de tempo, o Docker se tornou uma das ferramentas mais populares para desenvolvimento e implantação de software, sendo adotado por praticamente todos na comunidade DevOps!
Como o Docker Funciona?
O Docker é uma tecnologia que permite criar, executar, testar e implantar aplicativos distribuídos. Ele utiliza virtualização em nível de sistema operacional para fornecer software em pacotes chamados contêineres.
O Docker faz isso empacotando um aplicativo e suas dependências em um contêiner virtual que pode ser executado em qualquer computador. Essa containerização permite uma portabilidade e eficiência muito melhores em comparação com máquinas virtuais.
Esses contêineres são isolados uns dos outros e incluem suas próprias ferramentas, bibliotecas e arquivos de configuração. Eles podem se comunicar uns com os outros por meio de canais bem definidos. Todos os contêineres são executados por um único kernel do sistema operacional e, portanto, usam poucos recursos.
Como mencionado, a virtualização em nível de sistema operacional existe há algum tempo na forma de Linux Containers (LXC), Solaris Zones e FreeBSD jail. No entanto, o Docker levou esse conceito adiante, fornecendo uma plataforma fácil de usar que automatiza a implantação de aplicativos em contêineres.
Aqui estão alguns dos benefícios dos contêineres do Docker em relação às máquinas virtuais tradicionais:
- Eles são portáteis e podem ser executados em qualquer computador que tenha um ambiente de tempo de execução do Docker.
- Eles são isolados uns dos outros e podem executar diferentes versões do mesmo software sem afetar uns aos outros.
- Eles são extremamente leves, então podem ser iniciados mais rapidamente e usar menos recursos.
Agora, vamos dar uma olhada em alguns dos componentes e ferramentas que tornam tudo isso possível.
Componentes e ferramentas do Docker
O Docker consiste em três componentes principais:
- Docker Engine, um ambiente de tempo de execução para contêineres
- cliente de linha de comando do Docker, usado para interagir com o Docker Engine
- Docker Hub, um serviço em nuvem que fornece serviços de registro e repositório para imagens do Docker
Além desses componentes principais, também há várias outras ferramentas que funcionam com o Docker, incluindo:
- Swarm, uma ferramenta de clusterização e agendamento para aplicativos dockerizados
- Docker Desktop, sucessor do Docker Machine e a maneira mais rápida de containerizar aplicativos
- Docker Compose, uma ferramenta para definir e executar aplicativos Docker com vários contêineres
- Docker Registry, um serviço de registro local para armazenar e gerenciar imagens do Docker
- Kubernetes, uma ferramenta de orquestração de contêiner que pode ser usada com o Docker
- Rancher, uma plataforma de gerenciamento de contêiner para fornecer o Kubernetes como um serviço
Há até mesmo vários serviços que suportam o ecossistema do Docker:
- Amazon Elastic Container Service (Amazon ECS), um serviço de orquestração de contêiner gerenciado pela Amazon Web Services
- Azure Kubernetes Service (AKS), um serviço de orquestração de contêiner gerenciado pela Microsoft Azure
- Google Kubernetes Engine (GKE), um mecanismo Kubernetes totalmente gerenciado que é executado na plataforma Google Cloud
- Portainer, para implantar, configurar, solucionar problemas e proteger contêineres em minutos no Kubernetes, Docker, Swarm e Nomad em qualquer nuvem, data center ou dispositivo.
Compreendendo Contêineres do Docker
Os contêineres são frequentemente comparados às máquinas virtuais, mas existem algumas diferenças importantes entre os dois. As máquinas virtuais executam uma cópia completa de um sistema operacional, enquanto os contêineres compartilham o kernel do host com outros contêineres. Isso torna os contêineres muito mais leves e eficientes do que as máquinas virtuais.
Para começar, um contêiner é uma unidade autônoma de software que inclui todas as dependências necessárias para executar um aplicativo. Isso torna fácil empacotar e enviar aplicativos sem se preocupar com problemas de compatibilidade. Os contêineres Docker podem ser executados em qualquer máquina que tenha um motor Docker instalado.
Esses contêineres são isolados uns dos outros e empacotam suas próprias ferramentas, bibliotecas e arquivos de configuração, e podem se comunicar entre si por meio de canais bem definidos.
Criando um Contêiner Docker com Imagens do Docker
Os contêineres Docker são construídos a partir de imagens, que são modelos somente leitura com todas as dependências e configurações necessárias para executar um aplicativo.
Na verdade, um contêiner é uma instância em tempo de execução de uma imagem - o que a imagem se torna na memória quando realmente executada. Ele é executado completamente isolado do ambiente host por padrão, acessando apenas arquivos e portas do host se configurado para fazê-lo. Como tal, os contêineres têm sua própria rede, armazenamento e espaço de processo; e esse isolamento torna fácil mover contêineres entre hosts sem se preocupar com problemas de compatibilidade.
As imagens podem ser criadas usando um Dockerfile (que contém todas as instruções necessárias para criar uma imagem) ou usando o comando Docker commit, que pega um contêiner existente e cria uma imagem a partir dele.
O que há em um Contêiner Docker?
Os contêineres Docker incluem tudo o que um aplicativo precisa para ser executado, incluindo:
- o código
- um runtime
- bibliotecas
- variáveis de ambiente
- arquivos de configuração
Um contêiner Docker consiste em três partes principais:
- Dockerfile, usado para construir a imagem.
- a própria imagem, um modelo somente leitura com instruções para criar um contêiner Docker
- contêiner, uma instância executável criada a partir de uma imagem (você pode criar, iniciar, parar, mover ou excluir um contêiner usando a API ou CLI do Docker)
Um contêiner compartilha o kernel com outros contêineres e sua máquina host. Isso o torna muito mais leve do que uma máquina virtual.
Como Executar um Contêiner?
Os containers Docker são portáteis e podem ser executados em qualquer host com o Docker Engine instalado.
Para executar um container, você precisa primeiro baixar a imagem de um registro. Em seguida, você pode criar e iniciar o container usando esta imagem.
Por exemplo, digamos que queremos lançar um container do Alpine Linux. Primeiro, baixamos a imagem do Docker Alpine do Docker Hub. Para fazer isso, usamos o comando docker pull, seguido pelo nome do repositório e da tag (versão) que queremos baixar:
docker pull alpine:latest
Esta imagem em particular é muito pequena - apenas 5 MB de tamanho! Depois de baixá-la para o nosso sistema usando o docker pull, podemos verificar se ela existe localmente executando o comando docker images. Isso deve nos dar uma saída semelhante ao mostrado abaixo:
REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest f70734b6b2f0 3 weeks ago 5MB
Agora que temos a imagem localmente, podemos lançar um container usando-a. Para fazer isso, usamos o comando docker run, seguido pelo nome da imagem:
docker run alpine
Isso nos dará uma mensagem de erro informando que precisamos especificar um comando a ser executado dentro do nosso container. Por padrão, os containers Docker não iniciam nenhum processo ou comando quando são criados.
Podemos fornecer este comando como um argumento para o docker run, assim:
docker run alpine echo "Hello, World!"
Aqui, tudo o que estamos fazendo é executando o programa echo e passando "Olá, mundo!" como entrada. Quando você executar esta linha, você deve ver uma saída semelhante ao mostrado abaixo:
Hello, World!
Ótimo! Lançamos com sucesso nosso primeiro container Docker. Mas e se quisermos lançar um shell dentro de um container Alpine? Para fazer isso, podemos passar o comando sh como entrada para o docker run:
docker run -it alpine sh
O sinalizador -i significa "interativo" e é usado para manter stdin aberto mesmo que não esteja conectado. O sinalizador -t aloca um dispositivo pseudo TTY. Juntos, esses dois sinalizadores nos permitem nos conectar diretamente ao nosso container em execução e nos dar uma sessão de shell interativa:
/ #
A partir daqui, podemos executar quaisquer comandos disponíveis para nós na distribuição do Alpine Linux. Por exemplo, vamos tentar executar o comando ls:
/ # ls bin dev etc home lib media mnt proc root run sys tmp var boot home lib64 media mnt opt rootfs sbin usr
Se quisermos sair deste shell, podemos simplesmente digitar exit:
/ # exit
E é isso! Agora lançamos e saímos com sucesso de nosso primeiro container Docker.
Por que Você Usaria um Contêiner?
Existem muitas boas razões para usar containers:
- Flexibilidade. Os containers podem ser executados em qualquer plataforma que suporte o Docker, seja um laptop, servidor, máquina virtual ou instância na nuvem. Isso torna fácil mover aplicativos e ajuda as equipes de DevOps a alcançar ambientes consistentes em desenvolvimento, teste e produção.
- Isolamento. Cada container é executado em seu próprio ambiente isolado e tem seu próprio conjunto de processos, sistemas de arquivos e interfaces de rede. Isso garante que um container não possa interferir ou acessar os recursos de outro container.
- Densidade e Eficiência. Vários containers podem ser executados no mesmo sistema host sem exigir várias cópias do sistema operacional ou recursos de hardware extras, e os containers são leves e requerem menos recursos do que máquinas virtuais, tornando-os mais eficientes de executar. Tudo isso economiza tempo e dinheiro preciosos ao implantar aplicativos em escala.
- Escalabilidade. Os containers podem ser facilmente dimensionados para cima ou para baixo para atender a demandas em mudança. Isso torna possível utilizar recursos de forma eficiente quando a demanda é alta e liberá-los rapidamente quando a demanda diminui.
- Segurança. As capacidades de isolamento dos containers ajudam a proteger aplicativos de ataques maliciosos e vazamentos acidentais. Ao executar cada container em seu próprio ambiente isolado, você pode minimizar ainda mais o risco de comprometimento.
- Portabilidade. Os containers podem ser facilmente movidos entre hosts diferentes, tornando fácil distribuir aplicativos em uma frota de servidores. Isso torna possível utilizar recursos de forma eficiente e ajuda a garantir que os aplicativos estejam sempre disponíveis quando necessário.
- Reprodutibilidade. Os containers podem ser facilmente replicados para criar cópias idênticas de um ambiente. Isso é útil para criar ambientes de teste e preparação que correspondam à produção, ou para distribuir aplicativos em uma frota de servidores.
- Velocidade. Os containers podem ser iniciados e interrompidos rapidamente, tornando-os ideais para aplicativos que precisam estar em funcionamento a qualquer momento.
- Simplicidade. O paradigma de container é simples e fácil de entender, tornando fácil começar com containers.
- Ecossistema. O ecossistema do Docker inclui uma ampla variedade de ferramentas e serviços que tornam fácil construir, enviar e executar containers.
Dicas Úteis
Vamos encerrar este guia com algumas dicas sobre as melhores práticas e comandos úteis para aproveitar ao máximo o Docker.
Melhores Práticas do Docker
Existem algumas melhores práticas que você deve seguir ao trabalhar com o Docker:
- Use um arquivo .dockerignore para excluir arquivos e diretórios do seu contexto de construção.
- Mantenha o seu Dockerfile simples e fácil de ler.
- Evite usar o sudo ao trabalhar com o Docker.
- Crie uma rede definida pelo usuário para sua aplicação usando o comando docker network create.
- Use segredos do Docker para gerenciar dados sensíveis usados por seus contêineres.
Comandos do Docker
Se você quiser aprender mais sobre o Docker, aqui está uma lista de comandos para começar:
- docker, para gerenciar contêineres em seu sistema
- docker build, para criar uma nova imagem a partir de um Dockerfile
- docker images, para listar todas as imagens disponíveis em seu sistema
- docker run, para lançar um novo contêiner a partir de uma imagem
- docker ps, para listar todos os contêineres em execução em seu sistema
- docker stop, para parar um contêiner em execução de forma graciosa
- docker rm, para remover um contêiner parado do seu sistema
- docker rmi, para remover uma imagem do seu sistema
- docker login, para fazer login em um registro do Docker
- docker push, para enviar uma imagem para um registro do Docker
- docker pull, para baixar uma imagem de um registro do Docker
- docker exec, para executar um comando em um contêiner em execução
- docker export, para exportar um contêiner como um arquivo tar
- docker import, para importar um arquivo tar como uma imagem
Por fim, use um editor de texto como o VSCode, Vim ou o Emacs para editar seu Dockerfile.
Considerações Finais
O Docker é uma ferramenta poderosa que pode ajudá-lo a automatizar a implantação de suas aplicações. É simples de usar e não requer que você instale dependências em sua máquina host.
Nos últimos anos, o Docker se tornou uma das ferramentas mais populares para desenvolver e implantar software. É usado pelos desenvolvedores para empacotar seu código e dependências em uma unidade padronizada, que pode ser implantada em qualquer servidor. Além disso, o Docker também permite que os desenvolvedores executem várias aplicações isoladas em um único host, tornando-o uma ferramenta ideal para microservices.
Se você está procurando uma ferramenta que possa ajudá-lo a simplificar seu fluxo de trabalho e tornar sua vida como desenvolvedor e sysadmin mais fácil, então o Docker é uma ferramenta obrigatória para adicionar à sua caixa de ferramentas.