Docker para iniciantes: tudo o que você precisa saber

Ilustração mostrando o logotipo do Docker

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 nível de software.

Docker Basics

O Docker se tornou uma ferramenta padrão para desenvolvedores de software e administradores de sistema. É uma maneira interessante de iniciar aplicativos rapidamente sem impactar o resto do seu sistema. Você pode ativar um novo serviço com um único docker runcomando.

Os contêineres encapsulam tudo o que é necessário para executar um aplicativo, desde as dependências do pacote do sistema operacional até o seu próprio código-fonte. Você define as etapas de criação de um contêiner como instruções em a Dockerfile. O Docker usa o Dockerfile para construir uma imagem .

As imagens definem o software disponível em 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 contêineres do zero com comandos como chroot. Isso inicia um processo com um diretório raiz especificado em vez da raiz do sistema. Mas usar os recursos do kernel diretamente é complicado, inseguro e sujeito a erros.

Docker é uma solução completa para a produção, distribuição e uso de contêineres. As versões modernas do Docker são compostas por vários componentes independentes . Primeiro, há a Docker CLI , com a qual você interage em seu terminal. A CLI envia comandos para um daemon Docker . Isso pode ser executado localmente ou em um host remoto . O daemon é responsável por gerenciar os contêineres e as imagens a partir 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 seguem a especificação OCI.  Este 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 ao começar. A instalação dockerem seu sistema fornecerá tudo o que você precisa para construir e executar contêineres.

Por que tantas pessoas usam o Docker?

Os contêineres se tornaram muito populares porque resolvem muitos desafios comuns no desenvolvimento de software. A capacidade de contêiner uma vez e executar em qualquer lugar reduz a lacuna entre seu ambiente de desenvolvimento e seus servidores de produção.

Usar 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á docker runconfigurar sua própria instância de desenvolvimento. Ao iniciar seu serviço, você pode usar sua imagem Docker para implantar na produção. O ambiente ao vivo irá corresponder exatamente à sua instância local, evitando cenários de “funciona na minha máquina”.

O Docker é mais conveniente do que uma máquina virtual totalmente desenvolvida. 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, já que você está apenas iniciando processos, não um sistema operacional inteiro.

Recomendado:  Como salvar uma página da web como PDF no Mozilla Firefox

Começando

O Docker está disponível em todas as distribuições populares do Linux. Ele também funciona no Windows e no 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 hello-worldimagem básica . A imagem emite alguma saída explicando como usar o Docker. O contêiner então sai, levando você de volta ao seu terminal.

Criação de imagens

Depois de executar hello-world, você está pronto para criar suas próprias imagens Docker. Um Dockerfile descreve como executar seu serviço instalando o software necessário e copiando em arquivos. Aqui está um exemplo simples usando o servidor da web Apache:

FROM httpd: mais recente
RUN echo "LoadModule headers_module modules / mod_headers.so" >> /usr/local/apache2/conf/httpd.conf
COPIAR .htaccess /var/www/html/.htaccess
COPY index.html /var/www/html/index.html
COPIAR css / / var / www / html / css

A FROMlinha define a imagem de base. Neste caso, estamos começando com a imagem oficial do Apache. O Docker aplica as instruções restantes em seu Dockerfile na parte superior da imagem de base.

O RUNestágio executa um comando dentro do contêiner. Pode ser qualquer comando disponível no ambiente do contêiner. Estamos habilitando o headersmódulo Apache, que pode ser usado pelo .htaccessarquivo 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 que você precisa para executar seu site.

Agora, você pode construir a imagem:

docker build -t my-website: 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 -tno comando marca sua imagem com um determinado nome ( my-website:v1). Isso torna mais fácil consultar 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 alatest versão da tag.

O .no final do comando informa ao Docker para usar o Dockerfile em seu diretório de trabalho local. Isso também define o contexto de construção , permitindo que você use arquivos e pastas em seu diretório de trabalho com COPYinstruções em seu Dockerfile.

Depois de criar sua imagem, você pode iniciar um contêiner usando docker run:

docker run -d -p 8080: 80 meu-site: v1

Estamos usando alguns sinalizadores extras docker runaqui. O -dsinalizador faz com que o Docker CLI se separe do contêiner, permitindo que ele seja executado 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ê deverá ver sua página da web se visitar localhost:8080em seu navegador.

As imagens do Docker são formadas por camadas. Cada instrução em seu Dockerfile cria uma nova camada. Você pode usar recursos de construção avançados para fazer referência a várias imagens de base , descartando camadas intermediárias de imagens anteriores.

Registros de imagens

Assim que tiver 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 é Docker Hub .

Recomendado:  O que é o modo de transparência e como ele funciona nos fones de ouvido?

Quando você executa um comando que faz referência a uma imagem, o Docker primeiro verifica se ele está disponível localmente. Se não for, ele tentará retirá-lo do Docker Hub. Você pode extrair imagens manualmente com o docker pullcomando:

docker pull httpd: mais recente

Se você deseja publicar uma imagem, crie uma conta Docker Hub . Execute docker logine digite seu nome de usuário e senha.

Em seguida, marque sua imagem usando seu nome de usuário do Docker Hub:

docker tag my-image: últimas docker-hub-username / my-image: últimas

Agora, você pode empurrar sua imagem:

docker push docker-hub-username / my-image: mais recente

Outros usuários poderão puxar sua imagem e iniciar contêineres com ela.

Você pode executar seu próprio registro se precisar de armazenamento privado de imagens. Vários serviços de terceiros também  oferecem registros Docker como alternativas ao Docker Hub.

Gerenciando seus contêineres

A Docker CLI tem vários comandos para permitir que você gerencie seus contêineres em execução. Aqui estão alguns dos mais úteis para saber:

Recipientes de listagem

docker psmostra todos os seus contêineres em execução. Adicionar o -asinalizador também mostrará os contêineres parados.

Parando e Iniciando Containers

Para parar um contêiner, execute docker stop my-container. Substitua my-containerpelo nome ou ID do contêiner. Você pode obter essas informações a partir do pscomando. Um contêiner interrompido é reiniciado com docker start my-container.

Os contêineres geralmente funcionam enquanto seu processo principal permanece ativo. As políticas de reinicialização controlam o que acontece quando um contêiner é interrompido ou o host é reiniciado. Passe --restart alwayspara docker runpara fazer um contêiner reiniciar imediatamente após parar.

Obtendo um Shell

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 a -itbandeira se precisar de acesso interativo. Isso permite que você entre em um shell executando docker exec -it my-container sh.

Logs 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 docker logs my-containercomando mostrará os logs de um contêiner dentro do seu terminal. O --followsinalizador configura um fluxo contínuo para que você possa visualizar os logs em tempo real.

Recursos de limpeza

Contêineres e imagens antigos podem se acumular rapidamente em seu sistema. Use docker rm my-containerpara 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 docker prunecomando . Isso fornece uma maneira fácil de remover todos os contêineres parados e imagens redundantes.

Gestão Gráfica

Se o terminal não é 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 a controlar remotamente seus contêineres.

Ilustração de Portainer em um laptop

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 depois que o contêiner parar. Não é seguro executar qualquer forma de sistema de armazenamento de arquivos em um contêiner iniciado com um docker runcomando básico .

Recomendado:  Confusão de termo técnico: "Memória" significa RAM, não armazenamento

Existem algumas abordagens diferentes para gerenciar dados persistentes . O mais comum é usar um Volume Docker. Volumes são unidades de armazenamento montadas em sistemas de arquivos de contêiner. Todos os dados em um volume permanecerão intactos depois que seu contêiner vinculado for interrompido, permitindo que você conecte outro contêiner no futuro.

Mantendo a Segurança

Cargas de trabalho dockerized podem ser mais seguras do que suas contrapartes bare metal, como Docker fornece alguma separação entre o sistema operacional e seus serviços. No entanto, o Docker é um problema de segurança em potencial, pois normalmente funciona comoroot 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. Os servidores de produção e máquinas com um soquete daemon exposto à rede devem ser fortalecidos antes de entrar em operação.

Audite a 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 digitalizar imagens de contêineres individuais em busca de problemas que possam ser explorados internamente.

Trabalhando com vários contêineres

O dockercomando funciona apenas com um contêiner de cada vez. Freqüentemente, você desejará usar contêineres de forma agregada. Docker Compose é uma ferramenta que permite definir seus contêineres declarativamente 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 os dois contêineres em seu docker-compose.ymle se beneficiar do gerenciamento simplificado com rede automática .

Aqui está um docker-compose.ymlarquivo simples :

versão: "3"
Serviços:
  aplicativo:
    imagem: app-server: mais recente
    portas:
      - 8.000: 80
  base de dados:
    imagem: servidor de banco de dados: mais recente
    volumes:
        - banco de dados: / dados
volumes:
    banco de dados:

Isso define dois contêineres ( appe database). Um volume é criado para o banco de dados. Isso é montado /datano contêiner. A porta 80 do servidor de aplicativos é exposta como 8000 no host. Execute docker-compose up -dpara 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 comprometer um docker-compose.ymlem seu controle de versão em vez de fazer com que os desenvolvedores memorizem docker runcomandos.

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 outra parte do ecossistema, o Podman é uma alternativa ao Docker que permite criar “pods” de contêineres em seu terminal.

Orquestração de contêineres

O Docker normalmente não é executado no estado em que se encontra na produção. Agora é mais comum usar uma plataforma de orquestração, como o modo Kubernetes ou Docker Swarm. Essas ferramentas são projetadas para lidar com várias réplicas de contêineres, o que melhora a escalabilidade e a confiabilidade.

Ilustração mostrando os logotipos Docker e Kubernetes

Docker é apenas um componente no movimento mais amplo de conteinerização. Os orquestradores utilizam as mesmas tecnologias de tempo de execução do contêiner para fornecer um ambiente mais adequado para a 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 dockerCLI regular tem como alvo um host e funciona com contêineres individuais.

Uma plataforma poderosa para contêineres

O Docker oferece tudo que você precisa para trabalhar com contêineres. Tornou-se uma ferramenta fundamental para o desenvolvimento de software e administração de sistema. 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 armazenam suas cargas de trabalho em contêineres.