Como funcionam os contentores do Docker

Concluído

Anteriormente, você descobriu que o contêiner se torna a unidade que você usará para distribuir seus aplicativos. Você também aprendeu que o contêiner está em um formato padronizado que suas equipes de desenvolvimento e operação usam.

No seu exemplo, você está desenvolvendo um portal de rastreamento de pedidos para os vários pontos de venda da sua empresa usarem. Com a imagem do Docker criada, sua equipe de operações agora é responsável pela implantação, implementação de atualizações e gerenciamento do portal de rastreamento de pedidos.

Na unidade anterior, você observou como uma imagem do Docker é construída. Aqui, vai examinar brevemente o ciclo de vida de um contentor do Docker e como gerir contentores. Você também aprenderá a pensar em configurar o armazenamento de dados e as opções de rede para seus contêineres.

Como gerir contentores do Docker

Um contêiner do Docker tem um ciclo de vida que você pode usar para gerenciar e controlar o estado do contêiner.

Diagrama a mostrar o ciclo de vida de um contentor e a transição entre as fases do ciclo de vida.

Para colocar um contêiner no estado de execução, use o comando run . Você também pode reiniciar um contêiner que já esteja em execução. Ao reiniciar um contêiner, o contêiner recebe um sinal de terminação para permitir que todos os processos em execução sejam desligados normalmente antes que o kernel do contêiner seja encerrado.

Considera-se que um contentor está no estado de execução até ser colocado em pausa, parado ou terminado. Um contêiner, no entanto, também pode sair do estado de execução por si só. Um contentor pode sair por si só quando o processo de execução terminar ou se o processo entrar num estado de falha.

Para pausar um contêiner em execução, use o pause comando. Este comando suspende todos os processos no contentor.

Para parar um contêiner em execução, use o stop comando. O stop comando permite que o processo de trabalho seja desligado graciosamente, enviando-lhe um sinal de terminação. O kernel do contentor é terminado quando o processo é encerrado.

Se você precisar encerrar o contêiner, use o kill comando para enviar um sinal de eliminação. O kernel do contêiner captura o sinal de eliminação, mas o processo em execução não. Este comando encerra com força o processo de trabalho no contêiner.

Por fim, para remover contêineres que estão em um estado interrompido, use o remove comando. Depois de remover um contentor, todos os dados armazenados no mesmo são destruídos.

Como visualizar os contentores disponíveis

Utilize o comando docker ps para listar os contentores em execução. Para ver todos os contentores em todos os estados, transmita o argumento -a.

Eis um exemplo:

docker ps -a

Aqui está a saída desse comando:

CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS           PORTS        NAMES
d93d40cc1ce9    tmp-ubuntu:latest  "dotnet website.dll …"  6 seconds ago    Up 5 seconds        8080/tcp      happy_wilbur
33a6cf71f7c1    tmp-ubuntu:latest  "dotnet website.dll …"  2 hours ago     Exited (0) 9 seconds ago            adoring_borg

Há três itens a serem revisados na saída anterior:

  • O nome da imagem listado na coluna IMAGE , neste exemplo, tmp-ubuntu: mais recente. Repare como pode criar mais do que um contentor a partir da mesma imagem. Este é um poderoso recurso de gerenciamento que você pode usar para habilitar o dimensionamento em suas soluções.

  • O status do contêiner listado na coluna STATUS . Neste exemplo, você tem um contêiner em execução e um contêiner que saiu. O estado do contentor é normalmente o seu primeiro indicador da saúde do contentor.

  • O nome do contêiner listado na coluna NOMES . Além do ID do contêiner na primeira coluna, os contêineres também recebem um nome. Neste exemplo, não forneceu explicitamente um nome para cada contentor e, como resultado, o Docker atribuiu um nome aleatório ao contentor. Para dar a um contêiner um nome explícito usando o --name sinalizador, use o run comando.

Porque é que se atribuiu um nome aos contentores?

Esse recurso permite que você execute várias instâncias de contêiner da mesma imagem. Os nomes de contêiner são exclusivos, o que significa que, se você especificar um nome, não poderá reutilizá-lo para criar um novo contêiner. A única forma de reutilizar um nome específico é ao remover o contentor anterior.

Como executar um contentor

Para iniciar um contêiner, use o docker run comando. Só tem de especificar a imagem a ser executada com o respetivo nome ou ID para iniciar o contentor a partir da imagem. Um contentor iniciado desta forma proporciona uma experiência interativa.

Aqui, irá adicionar o sinalizador -d para executar o contentor com o nosso site em segundo plano.

docker run -d tmp-ubuntu

O comando, neste caso, apenas devolve o ID do novo contentor.

Depois de especificar uma imagem a ser executada, o Docker localiza a imagem, carrega o contêiner da imagem e executa o comando especificado como ponto de entrada. É nesta altura que o contentor está disponível para gestão.

Como colocar um contentor em pausa

Execute o comando docker pause para colocar um contentor em pausa. Eis um exemplo:

docker pause happy_wilbur

Pausar um contêiner suspende todos os processos. Este comando permite que o contentor continue os processos numa fase posterior. O docker unpause comando dessuspende todos os processos nos contêineres especificados.

Como reiniciar um contentor

Execute o comando docker restart para reiniciar contentores. Eis um exemplo:

docker restart happy_wilbur

O contêiner recebe um comando stop seguido por um comando start. Se o contentor não responder ao comando stop, é enviado um sinal de terminação.

Como parar um contentor

Execute o comando docker stop para parar um contentor em execução. Eis um exemplo:

docker stop happy_wilbur

O comando stop envia um sinal de terminação para o contêiner e os processos em execução no contêiner.

Como remover um contentor

Execute o comando docker rm para remover um contentor. Eis um exemplo:

docker rm happy_wilbur

Todos os dados no contentor são destruídos quando tiver removido o contentor. É essencial considerar sempre os contentores como temporários quando pensar no armazenamento dos dados.

Configuração do armazenamento dos contentores do Docker

Como descrevemos anteriormente, sempre considere os contêineres como temporários quando o aplicativo em um contêiner precisar armazenar dados.

Vamos supor que seu portal de rastreamento crie um arquivo de log em uma subpasta para a raiz do aplicativo; ou seja, diretamente para o sistema de arquivos do contêiner. Quando a aplicação gravar dados no ficheiro de registo, o sistema grava os dados na camada gravável do contentor.

Embora esta abordagem funcione, infelizmente tem várias desvantagens.

  • O armazenamento em contentores é temporário.

    O seu ficheiro de registo não persiste entre instâncias de contentores. Por exemplo, vamos supor que parou e removeu o contentor. Quando você executa uma nova instância de contêiner, a nova instância se baseia na imagem especificada e todos os dados anteriores estarão ausentes. Lembre-se de que, quando remove um contentor, todos os dados do contentor são destruídos com o mesmo.

  • O armazenamento de contêiner é acoplado à máquina host subjacente.

    Acessar ou mover o arquivo de log do contêiner é difícil, porque o contêiner está acoplado à máquina host subjacente. Você precisa se conectar à instância do contêiner para acessar o arquivo.

  • As unidades de armazenamento de contêiner têm menos desempenho.

    Os contentores implementam um controlador de armazenamento para permitir que as aplicações gravem dados. Este driver introduz uma abstração extra para se comunicar com o kernel do sistema operacional host e tem menos desempenho do que gravar diretamente em um sistema de arquivos host.

Os contentores podem utilizar duas opções para manter os dados. A primeira opção é a utilização de volumes e a segunda é a montagem de enlaces.

O que é um volume?

Um volume é armazenado no sistema de ficheiros do sistema anfitrião numa localização de pasta específica. Escolha uma pasta onde você saiba que os dados não serão modificados por processos que não sejam do Docker.

O Docker cria e gere o novo volume ao executar o comando docker volume create. Esse comando pode fazer parte de nossa definição do Dockerfile, o que significa que você pode criar volumes como parte do processo de criação de contêineres. O Docker cria o volume se ele não existir quando você tenta montar o volume em um contêiner pela primeira vez.

Os volumes são armazenados em diretórios no sistema de ficheiros do sistema anfitrião. O Docker monta e gerencia os volumes no contêiner. Uma vez montados, estes volumes são isolados do computador anfitrião.

Vários contentores podem utilizar os mesmos volumes ao mesmo tempo. Além disso, os volumes não são removidos automaticamente quando um contentor deixar de utilizar o volume.

Neste exemplo, você pode criar um diretório em nosso host de contêiner e montar esse volume no contêiner ao criar o contêiner do portal de rastreamento. Quando o seu portal de controlo registar dados, pode aceder a essas informações através do sistema de ficheiros do sistema anfitrião do contentor. Terá acesso a esse ficheiro de registo, mesmo que o contentor seja removido.

O Docker também fornece uma maneira para empresas terceirizadas criarem complementos para serem usados como volumes. Por exemplo, o Armazenamento do Azure fornece um plug-in para montar o Armazenamento do Azure como volumes em contêineres do Docker.

O que é uma montagem de enlace?

Um suporte de ligação é conceitualmente o mesmo que um volume; No entanto, em vez de usar uma pasta específica, você pode montar qualquer arquivo ou pasta no host. Você também espera que o host possa alterar o conteúdo dessas montagens. Assim como os volumes, a montagem de ligação é criada se você montá-la e ela ainda não existe no host.

As montagens de enlaces têm uma funcionalidade limitada em comparação com os volumes e, embora sejam mais eficazes, dependem de o sistema anfitrião ter ou não uma determinada estrutura de pastas.

Os volumes são considerados a estratégia preferida de armazenamento de dados para uso com contêineres.

Para contêineres do Windows, outra opção está disponível: você pode montar um caminho SMB como um volume e apresentá-lo aos contêineres. Isso permite que contêineres em hosts diferentes usem o mesmo armazenamento persistente.

Configuração de rede dos contentores do Docker

A configuração de rede padrão do Docker permite isolar contêineres no host do Docker. Esse recurso permite que você crie e configure aplicativos que podem se comunicar com segurança uns com os outros.

O Docker fornece diferentes configurações de rede para Linux e Windows.

Para Linux, existem seis opções de rede pré-configuradas:

  • Bridge
  • Host
  • Sobreposição
  • IPvLan
  • MACvLan
  • Nenhuma

Para Windows, há seis opções de rede pré-configuradas:

  • NAT (Tradução de Endereço de Rede)
  • Transparente
  • Sobreposição
  • L2Bridge [en]
  • Túnel L2
  • Nenhuma

Você pode escolher qual dessas configurações de rede aplicar ao seu contêiner, dependendo de seus requisitos de rede.

O que é a rede bridge?

A rede bridge é a configuração padrão aplicada a contêineres quando iniciados sem especificar qualquer outra configuração de rede. Essa rede é uma rede interna e privada usada pelo contêiner e isola a rede de contêiner da rede host do Docker.

A cada contêiner na rede ponte é atribuído um endereço IP e uma máscara de sub-rede, com o nome do host sendo padronizado para o nome do contêiner. Os contêineres conectados à rede de ponte padrão têm permissão para acessar outros contêineres conectados por ponte por endereço IP. A rede bridge não permite a comunicação entre contentores que utilizem o nome de um sistema anfitrião.

Por predefinição, o Docker não publica qualquer porta de contentor. Utilize o sinalizador --publish das portas do Docker para ativar o mapeamento de portas entre as portas do contentor e as portas do sistema anfitrião do Docker.

O sinalizador publish configura eficazmente uma regra da firewall que mapeia as portas.

Neste exemplo, o portal de controlo está acessível aos clientes que navegam para a porta 80. Tem de mapear a porta 80 do contentor a uma porta disponível no sistema anfitrião. Você tem a porta 8080 aberta no host, o que permite que você defina o sinalizador assim:

--publish 8080:80

Qualquer cliente que navegue para o IP do sistema anfitrião do Docker e para a porta 8080 pode aceder ao portal de controlo.

Além das configurações específicas do Linux, a rede NAT em hosts Windows funciona da mesma forma que uma rede bridge. Além disso, o NAT é a rede padrão no Windows e todos os contêineres se conectarão a ela, a menos que especificado de outra forma.

O que é a rede do sistema anfitrião?

A rede do sistema anfitrião permite executar o contentor diretamente na rede do sistema anfitrião. Esta configuração remove eficazmente o isolamento entre o sistema anfitrião e o contentor ao nível da rede.

Neste exemplo, vamos supor que decidiu alterar a configuração de rede para a opção de rede do sistema anfitrião. O seu portal de controlo continua a ser acessível através do IP do sistema anfitrião. Agora você pode usar a conhecida porta 80 em vez de uma porta mapeada.

Lembre-se de que o contêiner pode usar apenas portas que o host ainda não está usando.

No Windows, a rede host não está disponível. Em hosts Windows, não há opção para compartilhar o mesmo endereço IP (pilha de rede) entre o host e o contêiner. A rede NAT funciona como uma rede bridge e a opção Overlay fornece um endereço IP para o contêiner da mesma rede que o host, mas não o mesmo endereço IP.

Sobreposição e outras opções de rede

Para cenários mais avançados, o Linux e o Windows fornecem opções de rede adicionais. Por exemplo, a opção de sobreposição cria um comutador virtual da rede host, para que os contêineres nessa rede possam obter endereços IP de servidores DHCP ou operar com endereços IP desse segmento de rede. Além disso, o Docker permite que fornecedores terceirizados criem plug-ins de rede.

O que é a rede nenhuma?

Para desativar a rede para contêineres, use a opção nenhuma rede. Isso pode ser útil se você tiver um aplicativo que não usa a rede ou se quiser apenas validar que um aplicativo é executado conforme o esperado em um contêiner.

Considerações sobre o sistema operativo

Lembre-se de que há diferenças entre os sistemas operacionais de desktop para as opções de configuração de rede do Docker. Por exemplo, a interface de rede Docker0 não está disponível no macOS ao usar a rede bridge e o uso da configuração de rede host não é suportado para desktops Windows e macOS.

Estas diferenças podem afetar a forma como os programadores configuram seu o fluxo de trabalho para gerir a programação de contentores. Além disso, os orquestradores de contêineres também podem fornecer outras configurações de rede além da configuração do Docker.

Verifique o seu conhecimento

1.

Um contêiner é iniciado usando o sinalizador --publish 8080:80. Qual das seguintes opções é a configuração de rede mais provável usada para o contêiner?

2.

Qual opção de armazenamento é a melhor opção que permite que o host e o contêiner compartilhem um arquivo para gerenciar a resolução do servidor de nomes; por exemplo, o arquivo resolve.conf no Linux?