Como funcionam os contentores do Docker
- 10 minutos
Mais cedo, descobriste que o contentor se torna a unidade que usas para distribuir as tuas aplicações. 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. Nesta unidade, analisa um pouco o ciclo de vida de um contentor Docker e como gerir containers. Também aprende a pensar na configuração do armazenamento de dados e nas opções de rede para os seus contentores.
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.
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. Quando reinicia um contentor, este recebe um sinal de terminação para permitir que quaisquer processos em execução se desliguem de forma natural antes do kernel do contentor terminar.
Um contentor é considerado em estado de funcionamento até ser pausado, parado ou desativado. 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 termina após o processo ser encerrado.
Se você precisar encerrar o contêiner, use o kill comando para enviar um sinal de eliminação. O kernel do conteiner captura o sinal de término, 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. Quando remove um contentor, todos os dados armazenados nele 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 IMAGEM . Neste exemplo, tmp-ubuntu: mais recente. Repare como pode criar mais do que um contentor a partir da mesma imagem. Esta funcionalidade é uma poderosa funcionalidade de gestão que pode usar para permitir a escalabilidade nas suas soluções.
- O status do contêiner listado na coluna STATUS . Neste exemplo, tens um contentor a funcionar e outro contentor 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 um nome explícito a um contentor, use o
runcomando com o--nameparâmetro.
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 container
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 lançado desta forma proporciona uma experiência interativa.
Para executar o contentor com o nosso site em segundo plano, adicione o parâmetro -d.
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, então é enviado um sinal de kill.
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 o seu portal de rastreamento crie um arquivo de log numa subpasta da raiz da aplicação; isto é, diretamente no sistema de ficheiros do contêiner. Quando a aplicação grava dados no ficheiro de registo, o sistema escreve esses dados na camada gravável do contentor.
Embora esta abordagem funcione, infelizmente tem várias desvantagens.
O armazenamento em contentores é temporário.
O teu ficheiro de registo não persiste entre instâncias de contentores. Por exemplo, vamos supor que você pare e remova o contentor. Quando lanças uma nova instância de contentor, a nova instância baseia-se na imagem especificada, e todos os teus dados anteriores estão em falta. Lembre-se, quando remove um contentor, todos os dados dentro dele são destruídos juntamente com ele.
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. Depois de montar um volume, ele é isolado da máquina anfitriã.
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 deixa 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. Tens acesso a este ficheiro de registo mesmo que o teu 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 contentores Docker.
O que é um bind mount?
Um suporte de binding é conceptualmente o mesmo que um volume. Mas em vez de usar uma pasta específica, pode montar qualquer ficheiro 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 eficientes, dependem de o sistema anfitrião ter 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. Esta opção permite que contentores em diferentes hosts 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:
- Ponte
- 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 de ponte?
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 de bridge não permite a comunicação entre contentores usando nomes de 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 acompanhamento está acessível aos clientes que navegam para a porta 80. Tens de mapear a porta 80 do contentor para uma porta disponível no host. 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 contentores ligam-se a ela, salvo indicação em contrário.
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. Nos hosts Windows, não existe uma opção para partilhar o mesmo endereço IP (pilha de rede) entre o host e o contentor. 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, tanto o Linux como o Windows oferecem mais opções de rede. 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 de contêineres, use a opção de rede nenhuma. Esta opção pode ser útil se tiveres uma aplicação que não usa a rede. Ou se quiser apenas validar que uma aplicação corre como esperado num contentor.
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.