O Docker cria aplicativos empacotados chamados contêineres. Cada contêiner fornece um ambiente isolado semelhante a uma máquina virtual (VM). Ao contrário das VMs, os contêineres do Docker não executam um sistema operacional completo. Eles compartilham o kernel do seu host e virtualizam em um nível de software.
Noções básicas do Docker
O Docker se tornou uma ferramenta padrão para desenvolvedores de software e administradores de sistema. É uma maneira elegante de iniciar aplicativos rapidamente sem afetar o restante do sistema. Você pode ativar um novo serviço com um único docker run
comando.
Os contêineres encapsulam tudo o que é necessário para executar um aplicativo, desde as dependências do pacote do SO até seu próprio código-fonte.
Você define as etapas de criação de um contêiner como instruções em um arquivo Dockerfile
. O Docker usa o Dockerfile para construir uma imagem.
As imagens definem o software disponível nos containers. Isso é vagamente equivalente a iniciar uma VM com um sistema operacional ISO.
Se você criar uma imagem, qualquer usuário do Docker poderá iniciar seu aplicativo com docker run
.
Como o Docker funciona?
Os contêineres utilizam recursos do kernel do sistema operacional para fornecer ambientes parcialmente virtualizados. É possível criar containers do zero com comandos como chroot
. Isso inicia um processo com um diretório raiz especificado em vez da raiz do sistema. Mas usar recursos do kernel diretamente é complicado, inseguro e propenso a erros.PROPAGANDA
O Docker é uma solução completa para produção, distribuição e uso de containers. As versões modernas do Docker são compostas por vários componentes independentes . Primeiro, há a CLI do Docker, que é com a qual você interage em seu terminal.
A CLI envia comandos para um daemon do Docker. Isso pode ser executado localmente ou em um host remoto. O daemon é responsável por gerenciar os contêineres e as imagens das quais eles são criados.
O componente final é chamado de tempo de execução do contêiner . O tempo de execução invoca recursos do kernel para realmente iniciar contêineres.
O Docker é compatível com tempos de execução que aderem à especificação OCI. Esse padrão aberto permite a interoperabilidade entre diferentes ferramentas de conteinerização.
Você não precisa se preocupar muito com o funcionamento interno do Docker quando estiver começando. A instalação docker
em seu sistema fornecerá tudo o que você precisa para criar e executar contêineres.
Por que tantas pessoas usam o Docker?
Os contêineres se tornaram tão populares porque resolvem muitos desafios comuns no desenvolvimento de software. A capacidade de conteinerizar uma vez e executar em qualquer lugar reduz a lacuna entre seu ambiente de desenvolvimento e seus servidores de produção.
O uso de contêineres dá a você a confiança de que todos os ambientes são idênticos. Se você tiver um novo membro da equipe, ele só precisará configurar sua própria instância de desenvolvimento. Ao iniciar seu serviço, você pode usar sua imagem do Docker para implantar na produção.
O ambiente ao vivo corresponderá exatamente à sua instância local, evitando cenários “funciona na minha máquina”.
O Docker é mais conveniente do que uma máquina virtual completa. As VMs são ferramentas de uso geral projetadas para oferecer suporte a todas as cargas de trabalho possíveis. Por outro lado, os contêineres são leves, autossuficientes e mais adequados para casos de uso descartáveis.
Como o Docker compartilha o kernel do host, os contêineres têm um impacto insignificante no desempenho do sistema. O tempo de inicialização do contêiner é quase instantâneo, pois você está apenas iniciando processos, não um sistema operacional inteiro.
Começando no Docker
O Docker está disponível em todas as distribuições Linux populares. Ele também roda em Windows e macOS. Siga as instruções de configuração do Docker para sua plataforma para colocá-lo em funcionamento.
Você pode verificar se sua instalação está funcionando iniciando um contêiner simples:
docker run hello-world
Isso iniciará um novo contêiner com a imagem básica hello-world. A imagem emite alguma saída explicando como usar o Docker. O contêiner então sai, levando você de volta ao seu terminal.
Criando Imagens
Depois de executar hello-world
, você estará pronto para criar suas próprias imagens do Docker. Um Dockerfile descreve como executar seu serviço instalando o software necessário e copiando os arquivos.
Aqui está um exemplo simples usando o servidor web Apache:
FROM httpd:latest RUN echo "LoadModule headers_module modules/mod_headers.so" >> /usr/local/apache2/conf/httpd.conf COPY .htaccess /var/www/html/.htaccess COPY index.html /var/www/html/index.html COPY css/ /var/www/html/css
A linha FROM
define a imagem base. Neste caso, estamos a partir da imagem oficial do Apache. O Docker aplica as instruções restantes em seu Dockerfile na parte superior da imagem base.
O estagio RUN
executa um comando dentro do contêiner. Pode ser qualquer comando disponível no ambiente do contêiner. Estamos habilitando o módulo Apache headers, que pode ser usado pelo arquivo .htaccess
para configurar regras de roteamento.
As linhas finais copiam os arquivos HTML e CSS em seu diretório de trabalho para a imagem do contêiner. Sua imagem agora contém tudo o que você precisa para executar seu site.
Agora, você pode construir a imagem:
docker build -t meu-site:v1 .
O Docker usará seu Dockerfile para construir a imagem. Você verá a saída em seu terminal conforme o Docker executa cada uma de suas instruções.
O -t
no comando marca sua imagem com um determinado nome ( my-website:v1). Isso facilita a consulta no futuro. As tags têm dois componentes, separados por dois pontos.
A primeira parte define o nome da imagem, enquanto a segunda geralmente denota sua versão. Se você omitir os dois pontos, o Docker usará como padrão a versão da tag latest.
O .
no final do comando diz ao Docker para usar o Dockerfile em seu diretório de trabalho local. Isso também define o contexto de compilação, permitindo que você use arquivos e pastas em seu diretório de trabalho com instruções COPY em seu Dockerfile.
Depois de criar sua imagem, você pode iniciar um contêiner usando docker run
:
docker run -d -p 8080:80 my-website:v1
Estamos usando alguns sinalizadores extras docker run
aqui. O sinalizador -d
faz com que a CLI do Docker se desconecte do contêiner, permitindo que ela seja executada em segundo plano. Um mapeamento de porta é definido com -p
, portanto, a porta 8080 em seu host mapeia para a porta 80 no contêiner. Você deve ver sua página da web se visitar localhost:8080
em seu navegador.
As imagens do Docker são formadas a partir de camadas. Cada instrução em seu Dockerfile cria uma nova camada. Você pode usar recursos avançados de construção para fazer referência a várias imagens de base, descartando camadas intermediárias de imagens anteriores.
Registros de imagem
Depois de ter uma imagem, você pode enviá-la para um registro. Os registros fornecem armazenamento centralizado para que você possa compartilhar contêineres com outras pessoas. O registro padrão é o Docker Hub.
Quando você executa um comando que faz referência a uma imagem, o Docker primeiro verifica se ela está disponível localmente. Se não estiver, ele tentará puxá-lo do Docker Hub. Você pode extrair imagens manualmente com o comando docker pull
:
docker pull httpd:latest
Se você quiser publicar uma imagem, crie uma conta do Docker Hub. Execute docker login
e digite seu nome de usuário e senha.
Em seguida, marque sua imagem usando seu nome de usuário do Docker Hub:
tag docker my-image:latest docker-hub-username/my-image:latest
Agora, você pode enviar sua imagem:
docker push docker-hub-username/my-image:latest
Outros usuários poderão extrair sua imagem e iniciar contêineres com ela.
Você pode executar seu próprio registro se precisar de armazenamento de imagem privado. Vários serviços de terceiros também oferecem registros do Docker como alternativas ao Docker Hub.
Docker: Gerenciando seus contêineres
A CLI do Docker tem vários comandos para permitir que você gerencie seus contêineres em execução. Aqui estão alguns dos mais úteis para saber:
Listando contêineres
docker ps
mostra todos os seus contêineres em execução. Adicionar o sinalizador -a
também mostrará os contêineres parados.
Parando e Iniciando Contêineres
Para parar um contêiner, execute docker stop my-container
. Substitua my-container
pelo nome ou ID do contêiner. Você pode obter essas informações do ps
comando. Um contêiner parado é reiniciado com docker start my-container
.
Os contêineres geralmente são executados enquanto seu processo principal permanece ativo. As políticas de reinicialização controlam o que acontece quando um contêiner é interrompido ou seu host é reiniciado. Passe --restart always
para docker run
para fazer um contêiner reiniciar imediatamente após ele parar.
Obtendo um escudo
Você pode executar um comando em um contêiner usando docker exec my-container my-command
. Isso é útil quando você deseja invocar manualmente um executável separado do processo principal do contêiner.
Adicione o sinalizador -it
se precisar de acesso interativo. Isso permite que você entre em um shell executando docker exec -it my-container sh
.
Registros de monitoramento
O Docker coleta automaticamente a saída emitida para os fluxos de entrada e saída padrão de um contêiner. O comando docker logs my-container
mostrará os logs de um contêiner dentro do seu terminal. O sinalizador --follow
configura um fluxo contínuo para que você possa visualizar os logs em tempo real.
Limpando recursos
Recipientes e imagens antigos podem se acumular rapidamente em seu sistema. Use docker rm my-container
para excluir um contêiner por seu ID ou nome.
O comando para imagens é docker rmi my-image:latest
. Passe o ID da imagem ou o nome completo da tag. Se você especificar uma tag, a imagem não será excluída até que não tenha mais tags atribuídas. Caso contrário, a tag fornecida será removida, mas as outras tags da imagem permanecerão utilizáveis.
As limpezas em massa são possíveis usando o comando docker prune
. Isso oferece uma maneira fácil de remover todos os contêineres parados e imagens redundantes.
Gestão Gráfica
Se o terminal não for sua praia, você pode usar ferramentas de terceiros para configurar uma interface gráfica para o Docker. Os painéis da Web permitem que você monitore e gerencie rapidamente sua instalação. Eles também ajudam você a controlar remotamente seus contêineres.
Armazenamento de dados persistente
Os contêineres do Docker são efêmeros por padrão. As alterações feitas no sistema de arquivos de um contêiner não persistirão após a interrupção do contêiner. Não é seguro executar qualquer forma de sistema de armazenamento de arquivos em um contêiner iniciado com um comando básico docker run
.
Existem algumas abordagens diferentes para gerenciar dados persistentes . O mais comum é usar um Volume Docker. Volumes são unidades de armazenamento que são montadas em sistemas de arquivos de contêiner.
Todos os dados em um volume permanecerão intactos após a interrupção do contêiner vinculado, permitindo que você conecte outro contêiner no futuro.
Mantendo a Segurança
As cargas de trabalho dockerizadas podem ser mais seguras do que suas contrapartes bare metal, pois o Docker fornece alguma separação entre o sistema operacional e seus serviços. No entanto, o Docker é um possível problema de segurança, pois normalmente é executado com root
e pode ser explorado para executar software malicioso.
Se você estiver executando o Docker apenas como uma ferramenta de desenvolvimento, a instalação padrão geralmente é segura de usar. Servidores e máquinas de produção com um soquete de daemon exposto à rede devem ser protegidos antes de você entrar em operação.
Audite sua instalação do Docker para identificar possíveis problemas de segurança. Existem ferramentas automatizadas disponíveis que podem ajudá-lo a encontrar pontos fracos e sugerir soluções.
Você também pode verificar imagens de contêiner individuais em busca de problemas que possam ser explorados internamente.
Trabalhando com vários contêineres
O comando docker
só funciona com um contêiner por vez. Muitas vezes, você desejará usar contêineres de forma agregada. O Docker Compose é uma ferramenta que permite definir seus contêineres de forma declarativa em um arquivo YAML. Você pode iniciá-los todos com um único comando.
Isso é útil quando seu projeto depende de outros serviços, como um back-end da Web que depende de um servidor de banco de dados.
Você pode definir ambos os contêineres em seu docker-compose.yml
e se beneficiar do gerenciamento simplificado com rede automática.
Aqui está um arquivo simples docker-compose.yml:
version: "3" services: app: image: app-server:latest ports: - 8000:80 database: image: database-server:latest volumes: - database-data:/data volumes: database-data:
Isso define dois contêineres ( app
e database
). Um volume é criado para o banco de dados. Isso é montado /data
no contêiner. A porta 80 do servidor de aplicativos é exposta como 8000 no host. Execute docker-compose up -d
para ativar os dois serviços, incluindo a rede e o volume.
O uso do Docker Compose permite escrever definições de contêiner reutilizáveis que você pode compartilhar com outras pessoas. Você pode confirmar docker-compose.yml
em seu controle de versão em vez de ter os desenvolvedores memorizando comandos docker run
.
Existem outras abordagens para executar vários contêineres também. O Docker App é uma solução emergente que fornece outro nível de abstração. Em outras partes do ecossistema, o Podman é uma alternativa ao Docker que permite criar “pods” de contêineres dentro do seu terminal.
Orquestração de contêiner
O Docker normalmente não é executado como está em produção. Agora é mais comum usar uma plataforma de orquestração como Kubernetes ou o modo Docker Swarm. Essas ferramentas são projetadas para lidar com várias réplicas de contêiner, o que melhora a escalabilidade e a confiabilidade.
O Docker é apenas um componente no movimento mais amplo de conteinerização. Os orquestradores utilizam as mesmas tecnologias de tempo de execução de contêiner para fornecer um ambiente mais adequado à produção.
O uso de várias instâncias de contêiner permite atualizações contínuas , bem como distribuição entre máquinas, tornando sua implantação mais resiliente a mudanças e interrupções. A CLI regular docker
tem como alvo um host e funciona com contêineres individuais.
Docker: Uma plataforma poderosa para contêineres
O Docker oferece tudo o que você precisa para trabalhar com contêineres. Tornou-se uma ferramenta chave para o desenvolvimento de software e administração de sistemas. Os principais benefícios são maior isolamento e portabilidade para serviços individuais.
Familiarizar-se com o Docker requer uma compreensão dos conceitos básicos de contêiner e imagem. Você pode aplicá-los para criar suas imagens e ambientes especializados que conteinerizam suas cargas de trabalho.