Recuperar uma imagem existente do Docker e implantá-la localmente

Concluído

O Docker é uma tecnologia que permite implantar aplicativos e serviços de forma rápida e fácil. Um aplicativo do Docker é executado usando uma imagem do Docker. Uma imagem do Docker é um ambiente pré-empacotado que contém o código do aplicativo e o ambiente em que o código é executado.

No cenário corporativo descrito anteriormente, você deseja investigar a viabilidade de empacotamento e execução de um aplicativo com o Docker. Você decide criar e implantar uma imagem do Docker executando um aplicativo Web de teste.

Nesta unidade, você aprenderá sobre os principais conceitos e processos envolvidos na execução de um aplicativo em contêiner armazenado em uma imagem do Docker.

Visão geral do Docker

O Docker é uma ferramenta para a execução de aplicativos em contêiner. Um aplicativo em contêiner inclui o aplicativo e o sistema de arquivos que compõe o ambiente no qual ele é executado. Por exemplo, um aplicativo em contêiner poderia consistir em um banco de dados e outras informações de software e configuração associadas necessárias para executar o aplicativo.

Normalmente, um aplicativo em contêiner tem um volume muito menor do que uma máquina virtual configurada para executar o mesmo aplicativo. Esse menor volume ocorre porque uma máquina virtual precisa abastecer todo o sistema operacional e o ambiente de suporte associado. Um contêiner do Docker não tem essa sobrecarga, porque o Docker usa o kernel do sistema operacional do computador host para fazer o contêiner funcionar. Baixar e inicializar uma imagem do Docker é mais rápido e mais eficiente em termos de espaço do que baixar e executar uma máquina virtual que fornece uma funcionalidade semelhante.

Crie um aplicativo em contêiner criando uma imagem que contenha um conjunto de arquivos e uma seção de informações de configuração que o Docker usa. Execute o aplicativo solicitando ao Docker que inicie um contêiner com base na imagem. Quando o contêiner for iniciado, o Docker usará a configuração da imagem para determinar qual aplicativo será executado no contêiner. O Docker fornece os recursos de sistema operacional e a segurança necessários. Ele garante que os contêineres sejam executados simultaneamente e permaneçam relativamente isolados.

Importante

O Docker não oferece o nível de isolamento disponível nas máquinas virtuais. Uma máquina virtual implementa isolamento no nível do hardware. Os contêineres do Docker compartilham bibliotecas e recursos subjacentes do sistema operacional. No entanto, o Docker garante que um contêiner não possa acessar os recursos de outro, a menos que os contêineres estejam configurados para fazer isso.

Será possível executar o Docker no desktop ou laptop se você estiver desenvolvendo e testando localmente. Quanto aos sistemas de produção, o Docker está disponível para ambientes de servidor, incluindo diversas variantes do Linux e do Microsoft Windows Server 2016. Muitos fornecedores também são compatíveis com o Docker na nuvem. Por exemplo, você pode armazenar imagens do Docker no Registro de Contêiner do Azure e executar contêineres com as Instâncias de Contêiner do Azure.

Neste módulo, você usará o Docker localmente para criar e executar uma imagem. Depois, você carregará a imagem para um Registro de Contêiner do Azure e a executará em uma Instância de Contêiner do Azure. Esta versão do Docker é adequada para desenvolvimento local e teste de imagens do Docker.

Imagens do Docker no Linux e no Windows

Inicialmente, o Docker foi desenvolvido para o Linux e foi expandido para ser compatível com o Windows. As imagens individuais do Docker são baseadas no Windows ou no Linux, mas não podem se basear nos dois ao mesmo tempo. O sistema operacional da imagem determina o tipo de ambiente de sistema operacional usado no contêiner.

Os autores de imagens do Docker que desejam oferecer funcionalidades semelhantes em imagens baseadas no Windows e no Linux podem criá-las separadamente. Por exemplo, a Microsoft oferece imagens do Docker para Windows e Linux que contêm um ambiente ASP.NET Core que você pode usar como base para aplicativos ASP.NET Core em contêiner.

Os computadores Linux com Docker instalado só podem executar contêineres do Linux. Os computadores Windows com Docker instalado podem executar ambos os tipos de contêineres. O Windows executa as duas usando uma máquina virtual para executar um sistema Linux e emprega o sistema virtual Linux para executar contêineres do Linux.

Neste módulo, você criará e executará uma imagem baseada em Linux.

Registros do Docker e o Hub do Docker

As imagens do Docker são armazenadas e disponibilizadas nos registros. Um registro é um serviço Web em que o Docker pode se conectar para fazer upload e download de imagens de contêiner. O registro mais conhecido é o Hub do Docker, um registro público. Muitas pessoas e organizações publicam imagens no Docker Hub. É possível baixar e executar essas imagens usando o Docker em execução no desktop, em um servidor ou na nuvem. É possível criar uma conta no Docker Hub e carregar imagens lá gratuitamente.

Um Registro é organizado como uma série de repositórios. Cada repositório contém várias imagens do Docker que compartilham um nome comum e, geralmente, a mesma finalidade e funcionalidade. Essas imagens normalmente têm versões diferentes identificadas com uma tag. Esse mecanismo permite publicar e manter várias versões das imagens por razões de compatibilidade. Quando você baixar e executar uma imagem, precisará especificar o Registro, o repositório e a tag de versão da imagem. As tags são rótulos de texto e você pode usar o seu sistema de numeração de versão (v1.0, v1.1, v1.2, v2.0 e assim por diante).

Suponha que você queira usar a imagem do Docker do Runtime do ASP.NET Core. Essa imagem está disponível em duas versões:

  • mcr.microsoft.com/dotnet/core/aspnet:2.2
  • mcr.microsoft.com/dotnet/core/aspnet:2.1

Agora, vamos supor que você queira usar as imagens do Docker dos exemplos do .NET Core. Aqui temos quatro versões disponíveis para escolher:

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp

Observação

Uma única imagem pode ter várias tags atribuídas a ela. Por convenção, a versão mais recente de uma imagem terá a tag mais recente, além de uma tag que descreve seu número de versão. Ao lançar uma nova versão de uma imagem, você pode atribuir a tag mais recente mais uma vez para fazer referência à nova imagem.

Um repositório também é a unidade de privacidade de uma imagem. Se você não quiser compartilhar uma imagem, poderá definir o repositório como privado. Você pode permitir acesso a outros usuários com quem você deseja compartilhar a imagem.

Navegar no Hub do Docker e efetuar pull de uma imagem

Observação

Você não precisa concluir nenhum dos exemplos ou executar qualquer um dos códigos nas seções a seguir. Você vai fazer isso na próxima unidade.

Com frequência, você verá que há uma imagem no Docker Hub que se aproxima do tipo de aplicativo que você quer colocar em contêineres. É possível baixar essa imagem e estendê-la com seu código de aplicativo.

O Docker Hub contém vários milhares de imagens. Você pode pesquisar e procurar um Registro usando o Docker na linha de comando ou no site do Docker Hub. O site permite pesquisar, filtrar e selecionar imagens por tipo e editor. A figura abaixo mostra um exemplo da página de pesquisa.

Captura de tela da página de pesquisa do Docker Hub que lista várias imagens de contêiner.

Use o comando docker pull com o nome da imagem para recuperar uma imagem. Por padrão, o Docker baixará a imagem com a marca latest desse repositório no Docker Hub se você especificar apenas o nome do repositório. Tenha em mente que você pode modificar o comando para efetuar pull de diferentes tags e de diferentes repositórios. Este exemplo busca a imagem com a marca aspnetapp do repositório mcr.microsoft.com/dotnet/core/samples:aspnetapp. Essa imagem contém um aplicativo Web simples do ASP.NET Core.

Observação

Os exemplos desta unidade mostram a sintaxe dos vários comandos do Docker. Não é necessário executar esses comandos ao ler esta unidade. Os exercícios a seguir orientarão você ao trabalhar diretamente com o Docker.

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

Quando você busca uma imagem, o Docker a armazena localmente e a disponibiliza para os contêineres em execução. É possível exibir as imagens no registro local com o comando docker image list.

docker image list

A saída se parece com o seguinte exemplo:

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

Use a ID do nome da imagem para fazer referência à imagem em vários outros comandos do Docker.

Executar um contêiner do Docker

Use o comando docker run para iniciar um contêiner. Especifique a imagem a ser executada com seu nome ou ID. Se você ainda não tiver efetuado o docker pull da imagem, o Docker fará isso para você.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

No exemplo, o comando responderá com a seguinte mensagem:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

Esta imagem contém um aplicativo Web. Por isso, agora está escutando solicitações que chegam na porta HTTP 80. No entanto, se você abrir um navegador da Web e navegar até http://localhost:80, não verá o aplicativo.

Por padrão, o Docker não permite que as solicitações de rede de entrada cheguem ao seu contêiner. Você precisa configurar o Docker para atribuir o número da porta específico do seu computador ao número da porta no contêiner, adicionando a opção -p a docker run. Essa instrução habilita as solicitações de rede para o contêiner na porta especificada.

Além disso, o aplicativo Web desta imagem não se destina a ser usado interativamente na linha de comando. Quando o iniciamos, queremos que o Docker o inicie em segundo plano e apenas o deixe executar. Use o sinalizador -d para instruir o Docker a iniciar o aplicativo Web em segundo plano.

Pressione Ctrl+C para interromper a imagem, depois reinicie-a conforme mostrado no seguinte exemplo:

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

O comando mapeia a porta 80 no contêiner para a porta 8080 no seu computador. Se você acessar a página http://localhost:8080 em um navegador, verá o aplicativo Web de exemplo.

Captura de tela do aplicativo Web de exemplo em execução em um navegador.

Contêineres e arquivos

Se um contêiner em execução fizer alterações nos arquivos da imagem, essas alterações só existirão no contêiner em que as alterações foram feitas. A menos que você siga etapas específicas para preservar o estado de um contêiner, essas alterações serão perdidas quando o contêiner for removido. Da mesma forma, vários contêineres baseados na mesma imagem que são executados simultaneamente não compartilham os arquivos na imagem. Cada contêiner tem sua própria cópia independente. Todos os dados gravados por um contêiner no sistema de arquivos não são visíveis para os outros contêineres.

É possível adicionar volumes graváveis a um contêiner. Um volume representa um sistema de arquivos que pode ser montado pelo contêiner e é disponibilizado para o aplicativo em execução no contêiner. Os dados em um volume persistem quando o contêiner é interrompido e vários contêineres podem compartilhar o mesmo volume. Os detalhes para criar e usar volumes estão fora do escopo deste módulo.

Evitar a necessidade de fazer alterações no sistema de arquivos da imagem para aplicativos implantados com o Docker é uma prática recomendada. Use isso apenas para arquivos temporários que você possa perder.

Gerenciar contêineres do Docker

Você pode exibir os contêineres ativos com o comando docker ps.

docker ps

A saída inclui o status do contêiner, Em execução se estiver em execução, Encerrado se tiver terminado, entre outros valores, tais como os sinalizadores da linha de comando especificados quando a imagem foi iniciada e informações adicionais. O Docker permite executar vários contêineres na mesma imagem simultaneamente. Dessa maneira, uma ID exclusiva é atribuída a cada contêiner, bem como um nome exclusivo legível por humanos. A maioria dos comandos do Docker usados para gerenciar contêineres individuais pode usar a ID ou o nome para fazer referência a um contêiner específico.

Na saída a seguir, você pode ver dois contêineres. O campo PORTAS mostra que o contêiner com a ID elegant_ramanujan é a imagem em execução com a porta 80 no host do Docker mapeado para a porta 8080 no computador. A instância youthful_heisenberg é o contêiner da execução anterior da imagem. O campo COMANDO mostra o comando que o contêiner executou para iniciar o aplicativo na imagem. Nesse caso, para ambos os contêineres, é dotnet aspnetapp.dll. A ID da imagem dos contêineres também é a mesma, porque os dois contêineres estão executando a mesma imagem.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Observação

docker ps é um atalho para docker container ls. Os nomes desses comandos são baseados nos utilitários ps e ls do Linux, que listam os processos de execução e os arquivos, respectivamente.

É possível interromper um contêiner ativo com o comando docker stop especificando a ID do contêiner.

docker stop elegant_ramanujan

Se você executar docker ps novamente, verá que o contêiner elegant_ramanujan já não está presente na saída. O contêiner ainda existe, mas não hospeda mais um processo de execução. Você pode incluir os contêineres interrompidos na saída de docker ps incluindo o sinalizador -a:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

É possível reiniciar um contêiner interrompido com o comando docker start. O processo principal do contêiner será iniciado novamente.

docker start elegant_ramanujan

Normalmente, após a interrupção de um contêiner, ele também deve ser removido. Remover um contêiner limpa todos os recursos que ele deixa para trás. Após a remoção de um contêiner, todas as alterações feitas no sistema de arquivos da imagem serão permanentemente perdidas.

docker rm elegant_ramanujan

Não é possível remover um contêiner em execução, mas você pode forçar a interrupção e a remoção de um contêiner com o sinalizador -f no comando docker rm. É uma maneira rápida de interromper e remover um contêiner, mas só deverá ser usada se o aplicativo dentro do contêiner não precisar realizar um desligamento normal.

docker container rm -f elegant_ramanujan

Remover imagens do Docker

É possível remover uma imagem do computador local com o comando docker image rm. Especifique a ID da imagem a ser removida. O exemplo a seguir remove a imagem do aplicativo Web de amostra.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

Os contêineres que executam a imagem precisam ser encerrados antes da remoção da imagem. Se um contêiner ainda estiver usando a imagem, você receberá uma mensagem de erro como esta. Neste exemplo, o erro ocorre porque o contêiner youthful_heisenberg ainda está usando a imagem.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe