DevOps Mind
Docker O que é E por que é a tecnologia número 1 na cultura DevOps
O Docker se tornou uma ferramenta essencial para desenvolvedores e engenheiros DevOps/SRE, tornando simples o desenvolvimento, teste e implantação de aplicações.
Desde seu surgimento, o Docker tem ganhado cada vez mais espaço nos servidores ao redor do mundo. Suas características fáceis de entender e simples de aplicar permitem sua utilização em diversos cenários.
Neste artigo, vamos entender melhor o que é o Docker, como ele funciona e por que ele é tão valioso para a gestão de ambientes de desenvolvimento, sendo uma ferramenta essencial para os times DevOps/SRE, entre outros.
Tópicos
O Problema
Tradicionalmente, configurar e manter ambientes de desenvolvimento consistentes era um desafio significativo. Problemas como “funciona na minha máquina, mas não no servidor” eram comuns devido a diferenças nos ambientes de desenvolvimento e produção.
Com o aumento da complexidade das aplicações modernas, essas inconsistências se tornaram ainda mais problemáticas, resultando em ciclos de desenvolvimento mais longos, maior tempo de resolução de bugs e frustração geral entre os desenvolvedores.
Solução
O Docker resolve esses problemas ao permitir que os desenvolvedores empacotem aplicações e suas dependências em containers. Esses containers podem ser executados em qualquer ambiente que suporte Docker, garantindo consistência e confiabilidade.
Por que Docker?
Exemplo de caso
Imagine que você é um desenvolvedor Python trabalhando em vários projetos. O primeiro projeto é uma aplicação web utilizando MySQL
e Python/Django
, enquanto o segundo lida com requisições e automações de posts usando REST API, usando DeepTranslator
e requests
.
Desenvolvendo na mesma máquina, você sabe que as dependências de um projeto não podem interferir no outro. Para resolver esse problema, você cria os ambientes virtuais dentro do Python. No entanto, ao distribuir projetos, é comum surgirem problemas de instalação de dependências devido às diferentes versões de sistemas operacionais.
É aqui que o Docker entra. Com Docker, você cria imagens que contêm todo o seu projeto, garantindo que ele funcione em qualquer plataforma ou sistema operacional, eliminando o famoso problema do “na minha máquina estava funcionando“.
Principais vantagens ao utilizar o Docker
Ciclos de desenvolvimento acelerados
Com o Docker, os desenvolvedores podem ativar containers em segundos. Esse rápido tempo de resposta facilita as práticas de integração contínua e entrega contínua (CI/CD), permitindo que as equipes iterem e forneçam recursos e correções mais rapidamente.
Colaboração aprimorada
Como os containers Docker são consistentes em todos os ambientes, desenvolvedores, testadores e equipes de operações podem trabalhar em sincronia, um princípio fundamental do desenvolvimento ágil e do DevOps. Todos trabalham com a mesma configuração de contêiner, o que reduz discrepâncias e mal-entendidos.
Custos de infraestrutura reduzidos
Ao otimizar a utilização de recursos e permitir que vários containers sejam executados em um único host, o Docker reduz a necessidade de vários servidores ou máquinas virtuais. Esta consolidação pode levar a economias substanciais de custos em termos de hardware e manutenção.
Processos de implantação repetíveis
Os containers Docker são criados a partir de imagens que podem ser versionadas e armazenadas em um registro. Isso significa que toda vez que você implanta um container, você usa uma configuração de ambiente idêntica. Essa repetibilidade garante que o processo de implantação seja simples, menos sujeito a erros e facilmente automatizado, aumentando a confiabilidade das implantações.
Docker O que é? 🐳
De uma forma resumida, o Docker é uma plataforma de conteinerização de código aberto que facilita o empacotamento, distribuição e execução de aplicações em ambientes baseados em containers Unix/Linux.
É plataforma como serviço (PaaS) que utiliza virtualização no nível do sistema operacional para oferecer software em pacotes chamados containers.
Os containers operam de forma isolada, contendo seu próprio conjunto de software, bibliotecas e configurações, enquanto interagem entre si por meio de canais claramente definidos. Todos os containers são executados por um único kernel do sistema operacional, o que os torna mais eficientes em termos de recursos comparado às máquinas virtuais.
Virtualização
Para avançar nos estudos sobre o Docker, é essencial ter conhecimento sobre como funciona a virtualização. Existem duas formas principais de criar ambientes virtuais isolados: baseados em containers ou em hypervisores.
Virtualização baseada em Hypervisor: Cria uma representação virtual do hardware, conhecida como máquina virtual (MV), controlada por um hypervisor. Este método permite a execução de sistemas operacionais completos dentro das MVs, completamente isolados do hardware físico. No entanto, cada MV requer um sistema operacional completo.
Virtualização baseada em Containers: Executa-se a nível de sistema operacional, criando ambientes isolados ou containers que compartilham o kernel do sistema base. Esses containers são usados para executar processos e aplicações específicas, tornando-os mais leves e eficientes que as máquinas virtuais.
Comparação entre Docker e Virtualização Tradicional
- Economia de Recursos: Containers consomem menos recursos em comparação às máquinas virtuais, uma vez que compartilham o kernel do S.O.(Sistema Operacional). Ao contrário das máquinas virtuais que exigem um sistema operacional completo, os containers Docker compartilham o sistema operacional do host, resultando em um consumo significativamente menor de recursos em geral. Esse uso eficiente dos recursos do sistema significa que você pode executar vários containers em um único host, maximizando a utilização de recursos e reduzindo custos.
- Isolamento: Containers isolam aplicações entre si, mas compartilham o kernel, enquanto máquinas virtuais isolam completamente, incluindo o sistema operacional.
- Portabilidade: Docker facilita a portabilidade de aplicações entre diferentes ambientes sem preocupações com dependências ou sistemas operacionais subjacentes.
Com Docker, você pode simplificar o desenvolvimento e a implantação de aplicações, garantindo consistência e eficiência em diferentes plataformas.
Termos e tecnologias do Docker
Para usar o Docker de maneira eficaz, é essencial estar familiarizado com suas principais terminologias e ferramentas associadas.
Termo | Descrição |
---|---|
Imagem | Modelo imutável que contém tudo o que é necessário para executar um aplicativo, incluindo o código, runtime, bibliotecas e dependências. |
Container | Instância de uma imagem em execução. Ele isola o aplicativo do ambiente ao redor. |
Dockerfile | Arquivo de texto que contém um conjunto de instruções para criar uma imagem Docker. |
Volume | Mecanismo para armazenar dados persistentes fora do contêiner. |
Registry | Repositório de imagens Docker, onde as imagens são armazenadas e compartilhadas. |
Orquestração | Gestão automatizada de containers, incluindo implantação, escalonamento e gerenciamento de falhas. |
Compreender esses termos e como eles se relacionam é fundamental para aproveitar todo o potencial do Docker no desenvolvimento e na implantação de aplicações.
Da mesma forma, familiarizar-se com o ecossistema de ferramentas do Docker pode melhorar significativamente o desenvolvimento, a implantação e o gerenciamento de aplicações em containers.
Tecnologia | Descrição |
---|---|
Docker Engine | O runtime que constrói e executa containers Docker, permitindo aos usuários construir, distribuir e executar containers Docker em qualquer plataforma compatível. |
Docker Hub | Um serviço na nuvem para compartilhar aplicações empacotadas como imagens Docker, sendo público e centralizado, facilitando a colaboração dentro da comunidade Docker. |
Docker Compose | Uma ferramenta para definir e executar aplicações Docker multi-containers, de forma simples e mais organizada. |
Docker Swarm | Ferramenta nativa de orquestração de contêineres do Docker para melhor gerenciamento de containers em diferentes nós. |
Docker CLI | Permite aos usuários interagir diretamente com o Docker a partir da linha de comando, oferecendo uma forma direta de controlar e automatizar tarefas Docker. |
Docker Desktop | Um aplicativo para máquinas Mac e Windows que facilita a construção e compartilhamento de aplicações e serviços em contêineres. |
Kubernetes | Uma plataforma de código aberto para automação de implantação, escalonamento e operações de contêineres de aplicação em clusters de hosts. Embora não seja uma ferramenta nativa do Docker, Kubernetes se integra profundamente com o Docker para oferecer uma solução poderosa de orquestração. |
Essa tabela resume as principais ferramentas e tecnologias associadas ao Docker.
O que é um container Docker?
Um container Docker representa a instância ativa de uma imagem em funcionamento. Quando baixamos uma imagem do Docker Hub, ela é um arquivo somente leitura. Podemos executar vários containers usando a mesma imagem, cada um em seu ambiente isolado, o que garante que a execução das aplicações não interfira no sistema local. Este formato aumenta a segurança das aplicações.
Para criar um contêiner a partir de uma imagem, utilizamos o comando docker run. Cada contêiner pode estar em diferentes estados, como reiniciando, em execução, pausado, encerrado ou inativo. O comando docker ps lista todos os containers em execução, enquanto docker ps -a mostra tanto os containers em execução quanto os parados.
Além disso, podemos executar várias instâncias de um mesmo aplicativo utilizando a mesma imagem. Cada contêiner terá um ID único, mas todos serão baseados na mesma imagem. Essa prática é vantajosa, por exemplo, para garantir a disponibilidade contínua do aplicativo mesmo se um contêiner falhar. Cada vez que o Docker cria um contêiner a partir de uma imagem, ele adiciona uma camada fina de escrita sobre a imagem original, permitindo alterações durante o tempo de execução do contêiner.
Principais pontos a serem lembrados:
- Containers são instâncias em execução de uma imagem.
- Podemos executar múltiplos containers usando a mesma imagem.
- Cada container opera em um ambiente isolado, sem impactar outras aplicações do sistema.
- Use o comando
docker run
para iniciar um contêiner a partir de uma imagem. - Cada contêiner possui uma camada de escrita que permite alterações durante seu tempo de execução.
De uma forma bem resumida, um container Docker é uma unidade autônoma e isolada de aplicação que pode representar desde um banco de dados até um servidor NGINX/proxy reverso, entre outros elementos, deixando simples a sua implantação e execução em diferentes casos.
Dockerfile O que é e qual a sua importância?
Ao desenvolver sua aplicação, a criação de um Dockerfile é fundamental. Este documento de texto contém alguns comandos essenciais que, ao serem executados, montam uma imagem Docker rapidamente. O Docker daemon, comumente chamado apenas de “Docker”, é o serviço em segundo plano que gerencia os containers Docker em um sistema, processando todas as instruções de cima para baixo no Dockerfile.
A estrutura do Dockerfile
Agora que você já sabe o que é Dockerfile, vamos explorar sua estrutura. O Dockerfile é composto por instruções que são executadas na ordem em que aparecem. Entre as principais instruções estão:
- FROM: É mandatório, define a imagem base a ser utilizada.
- RUN: Executa comandos durante o build para montar a imagem.
- CMD: Executado na criação do contêiner, deve aparecer apenas uma vez.
- EXPOSE: Define as portas a serem liberadas no contêiner.
- COPY: Copia arquivos e pastas locais para a imagem.
- ADD: Efetua a cópia de arquivos e pastas(remotos ou compactados).
- VOLUME: Especifica um ponto de montagem compartilhado entre contêiner e host.
- WORKDIR: Especifica o diretório de trabalho que o container vai utilizar.
- USER: Define o usuário para executar comandos.
- BUILD: Faz o build(criação/confecção) da imagem a partir do DockerFile.
Como fazer um build do Dockerfile
O processo de build envolve três etapas:
- Criar o DockerFile.
- Gerar a imagem.
- Construir o contêiner.
No primeiro passo, construa seu Dockerfile com as instruções de configuração do container, preferindo imagens oficiais para garantir qualidade, segurança e eficiência. Veja um exemplo simples usando o Ubuntu como base:
# Definindo a imagem base a ser utilizada
FROM ubuntu:20.04
# Informações sobre o mantenedor (opcional)
LABEL maintainer="seu_nome <seu_email@email.com>"
# Atualiza os pacotes e instala dependências
RUN apt-get update \
&& apt-get install -y \
software-properties-common \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# Especifica o diretório de trabalho que o container vai utilizar
WORKDIR /app
# Copia os arquivos do diretório local para o diretório de trabalho no contêiner
COPY . .
# Instala as dependências Python definidas no requirements.txt
RUN pip3 install --no-cache-dir -r requirements.txt
# Expõe a porta 8000 para acesso externo
EXPOSE 8000
# Trata-se de um comando padrão que o container executa ao iniciar
CMD ["python3", "app.py"]
Com o Dockerfile criado, gere a imagem com:
docker build -t nome_da_imagem .
Depois, crie o contêiner a partir dessa imagem:
docker run nome_da_imagem
Boas práticas na criação de DockerFile
Para criar Dockerfiles eficientes, siga estas dicas:
- Atenção à ordem das instruções.
- Containers devem ser imutáveis.
- Consolide instruções para minimizar camadas.
- Instale apenas pacotes necessários.
- Utilize o arquivo
.dockerignore
. - Declare elementos sujeitos a mudanças no final do arquivo.
- Use o menor número possível de instruções.
Quer se aprofundar mais sobre Dockerfile e Docker em geral? Recomendo demais o video abaixo:
Para entender mais sobre o conceito de Dockerfile O que é e maiores detalhes, consulte a documentação oficial do Docker:
- Writing a Dockerfile – https://docs.docker.com/guides/docker-concepts/building-images/writing-a-dockerfile/
- Dockerfile reference – https://docs.docker.com/reference/dockerfile/
O que é Docker Compose?
O Docker Compose facilita a definição e o gerenciamento de vários containers como uma única aplicação. Ele usa um arquivo YAML (docker-compose.yml) para descrever os serviços, redes e volumes necessários para sua aplicação. Este arquivo utilizar o formato Compose.
Com os comandos simples up
, down
e ps
, é possível iniciar, parar e listar o status dos serviços definidos no arquivo docker-compose.yml
, facilitando o desenvolvimento, teste e deploy de aplicações compostas por vários containers, você pode criar e iniciar sua aplicação com um único comando: docker compose up
.
De uma forma resumida, o Docker Compose é uma ferramenta para gerenciar Containers do Docker.
Três principais comandos do Docker Compose:
docker-compose up
: Efetua a subida dos serviços que foram declarados no arquivo Compose(docker-compose.yml). Se as imagens necessárias não estiverem presentes localmente, o Compose vai efetuar o download de todas elas.docker-compose down
: Para e remove todos os containers, redes e volumes criados pelodocker-compose up
.docker-compose ps
: Lista todos os serviços em execução especificados no arquivodocker-compose.yml
, mostrando seus estados (em execução, parado, etc.).
Exemplo de docker-compose.yml:
version: '3' # Versão do formato do Docker Compose
services: # Definição dos serviços do docker-compose
webapp: # Nome do serviço
image: nginx:latest # Imagem Docker a ser utilizada para este serviço
ports: # Mapeamento de portas
- "8080:80" # Mapeia a porta 8080 do host/hospedeiro com a porta 80 do Container Docker
volumes: # Mapeamento de volumes
- ./html:/usr/share/nginx/html # Monta o diretório local 'html' dentro do contêiner
networks: # Redes a serem conectadas
- backend-network # Conecta este serviço à rede 'backend-network'
networks: # Definição de redes
backend-network: # Nome da rede
driver: bridge # Tipo de driver de rede
Instalação do Docker e Docker Compose
Pode parecer trivial, mas é importante destacar que Docker Compose e Docker são coisas diferentes! Dito isto, precisamos instalar o Docker e o Docker Compose de forma individual em alguns casos.
Abaixo seguem os detalhes para instalação em cada cenário:
No macOS:
- Docker: Baixe e instale o Docker Desktop para macOS a partir do site oficial do Docker. Abra o arquivo
.dmg
, arraste o ícone para a pasta Applications e siga as instruções para completar a instalação. - Docker Compose: O Docker Desktop inclui o Docker Compose, portanto, após instalar o Docker Desktop, o Docker Compose estará disponível.
No Linux (Ubuntu como exemplo):
Docker
Siga as instruções detalhadas no site oficial do Docker para instalar o Docker Engine no seu sistema Linux ou então siga os passos detalhados abaixo:
Adicionar repositórios
Antes de instalar o Docker Engine pela primeira vez em uma nova máquina host, é necessário configurar o repositório do Docker. Após isto, pode seguir com a instalação ou atualização do Docker com base neste repositório.
# Adicionar a chave GPG oficial do Docker:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Adicionar o repositório na fonte do Apt:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Nota: Se você usar uma distribuição derivada do Ubuntu, como Linux Mint, pode ser necessário usar UBUNTU_CODENAME
em vez de VERSION_CODENAME
.
Instalar os pacotes Docker
Para instalar a versão mais recente do Docker CE, Docker CE CLI, Containerd.io, Docker Buildx plugin e Docker Compose plugin, execute o seguinte comando no terminal: sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Verificar se a instalação do Docker Engine foi bem-sucedida executando a imagem hello-world
sudo docker run hello-world
Esse comando faz o download de uma imagem de teste e a inicia em um container. Ao iniciar, o container exibe uma mensagem de confirmação antes de ser desligado.
Docker Compose
Instale o Docker Compose seguindo as instruções para Linux no site oficial do Docker ou siga os passos abaixo:
Passo 1: Baixar a versão atual do Docker Compose
- Abra um terminal.
- Use o comando curl para baixar a versão atual do Docker Compose. Você pode verificar a versão mais recente na página de releases do Docker Compose no GitHub.
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Certifique-se de substituir 1.29.2 pela versão mais recente disponível, se necessário.
Passo 2: Dar permissão de execução ao Docker Compose
Dê permissão de execução ao arquivo baixado usando o comando chmod.
sudo chmod +x /usr/local/bin/docker-compose
Passo 3: Verificar a instalação
Verifique se a instalação foi bem-sucedida digitando:
docker-compose --version
Isso irá mostrar a versão instalada do Docker Compose, garantindo que a instalação foi realizada com êxito.
No Windows:
- Docker: Baixe e instale o Docker Desktop para Windows a partir do site oficial do Docker. Execute o instalador que foi feito download e siga os passos mostrados na tela.
- Docker Compose: O Docker Desktop para Windows inclui o Docker Compose, portanto, após instalar o Docker Desktop, o Docker Compose estará disponível.
Instalar o Docker e Docker Compose em diferentes sistemas operacionais é relativamente simples, seguindo os passos fornecidos pelos respectivos sites oficiais do Docker para cada plataforma. Essas ferramentas são fundamentais para desenvolvedores e operadores que desejam construir, testar e gerenciar aplicações baseadas em containers de forma eficiente e escalável.
Principais comandos do Docker
Aqui está uma lista dos principais comandos Docker de uso básico e importantes para começar a trabalhar com containers:
Docker Run
O comando docker run é sua porta de entrada para iniciar containers a partir de imagens Docker. Ele permite especificar nomes de imagens, opções e configurações de tempo de execução.
docker run -d -p 8080:80 nginx
-d: Executa o container em modo destacado (em segundo plano).
-p: Mapeia portas do host para o container.
Docker Pull
Antes de executar um container, muitas vezes é necessário baixar a imagem Docker de um registro como o Docker Hub. O comando docker pull realiza essa tarefa.
docker pull ubuntu:latest
Docker PS
Para mostrar uma lista de containers que estão em execução, pode ser utilizado o comando docker ps, que é o comando mais usamos no dia a dia com Docker. Ele fornece informações sobre IDs, nomes, status e portas dos containers. Para ver todos os containers, incluindo os parados, pode-se usar docker ps -a.
docker ps
Docker Stop e Docker Start
Esses dois comandos permitem controlar o estado de um container. docker stop finaliza um container em execução(deixando com status de parado/), enquanto docker start retoma a execução de um container que estava parado.
docker stop {nome_ou_id_do_container}
docker start {nome_ou_id_do_container}
Docker Logs
O comando docker logs é inestimável para solução de problemas e monitoramento. Ele recupera os logs gerados por um container.
docker logs {nome_ou_id_do_container}
Docker Exec
É possível executar comandos dentro de um container em execução usando docker exec. Isso é especialmente útil para depuração ou execução de tarefas administrativas.
docker exec -it {nome_ou_id_do_container} {bash}
-it: Modo interativo com um terminal. bash: O shell que você deseja usar dentro do container.
Docker Build
Quando é necessário criar uma imagem Docker personalizada, o comando docker build é seu aliado. Ele utiliza um Dockerfile para definir as instruções da imagem.
docker build -t nome_imagem_personalizada .
Docker Images
Para listar as imagens Docker disponíveis localmente, use docker images. Esse comando exibe nomes de imagens, tamanhos e tags.
docker images
Docker RMI
Para deletar imagens Docker que não são mais utilizadas e liberar algum espaço em disco. docker rmi permite remover imagens pelo nome ou ID.
docker rmi nome_ou_id_da_imagem
Docker CLI Cheat Sheet
Para obter uma listagem com os principais comandos e seus exemplos, recomendo demais o Cheat Sheet abaixo:
https://docs.docker.com/get-started/docker_cheatsheet.pdf
Conclusão
Exploramos os conceitos fundamentais de Docker, Dockerfile e Docker Compose, que revolucionaram a forma como desenvolvemos, empacotamos e executamos aplicações modernas. O Docker proporciona uma abordagem eficiente e consistente para criar ambientes de desenvolvimento e produção isolados, garantindo portabilidade e escalabilidade para nossas aplicações.
Ao dominar essas ferramentas essenciais, os times de desenvolvedores, DevOps e demais times pertinentes estão preparados para enfrentar os desafios modernos de desenvolvimento de software, aproveitando os benefícios de ambientes isolados, escaláveis e altamente controlados proporcionados pelo ecossistema Docker.
FAQs
1. O que é um container Docker?
Um container Docker é uma porção de software que contém todos os elementos essenciais para executar uma aplicação, como código, ambiente de execução, bibliotecas e dependências.
2. Docker é gratuito?
Sim, o Docker é uma plataforma de código aberto e gratuita, mas também oferece versões pagas com funcionalidades adicionais.
3. Qual é a diferença entre Docker e máquinas virtuais?
Containers Docker compartilham o kernel do sistema operacional host e são mais leves e rápidos para iniciar comparado a máquinas virtuais, que incluem um sistema operacional completo.
4. Posso usar Docker em produção?
Sim, Docker é utilizado em larga escala em ambientes de produção, empresas de grande porte e demais ambientes de alta criticidade, que demandam confiabilidade e eficiência.
5. O que é Docker Compose?
Docker Compose é uma ferramenta que facilita a definição e o gerenciamento multi-container do Docker. É útil para configurar e iniciar aplicações que exigem vários serviços.
Quer aprender mais?
Não deixe de se inscrever na nossa newsletter para receber as últimas novidades e dicas sobre DevOps/SRE diretamente no seu e-mail:
Além disso, leia nossos outros posts sobre Docker, para aprender além de Docker O que é, Dockerfile o que é e continuar aprimorando suas habilidades em DevOps.
Imagem de capa de tawatchai07 no Freepik