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.
Índice
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 run
comando.
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 docker
em 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 run
configurar 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.
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-world
imagem 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 FROM
linha 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 RUN
estágio executa um comando dentro do contêiner. Pode ser qualquer comando disponível no ambiente do contêiner. Estamos habilitando o headers
módulo Apache, que pode ser usado pelo .htaccess
arquivo 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 -t
no 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 COPY
instruçõ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 run
aqui. O -d
sinalizador 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:8080
em 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 .
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 pull
comando:
docker pull httpd: mais recente
Se você deseja publicar uma imagem, crie uma conta 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:
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 ps
mostra todos os seus contêineres em execução. Adicionar o -a
sinalizador também mostrará os contêineres parados.
Parando e Iniciando Containers
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 a partir do ps
comando. 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 always
para docker run
para 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 -it
bandeira 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-container
comando mostrará os logs de um contêiner dentro do seu terminal. O --follow
sinalizador 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-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 docker prune
comando . 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.
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 run
comando básico .
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 docker
comando 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.yml
e se beneficiar do gerenciamento simplificado com rede automática .
Aqui está um docker-compose.yml
arquivo 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 ( 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 comprometer um docker-compose.yml
em seu controle de versão em vez de fazer com que os desenvolvedores memorizem docker run
comandos.
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.
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 docker
CLI 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.