Obter uma imagem do Docker existente e implementá-la localmente

Concluído

O Docker é uma tecnologia que permite implementar aplicações e serviços de forma rápida e fácil. As aplicações do Docker são executadas por meio de uma imagem do Docker. As imagens do Docker são ambientes previamente compactados que contêm o código da aplicação, bem como o ambiente no qual o código é executado.

No cenário empresarial descrito anteriormente, quer saber se é exequível compactar e executar uma aplicação com o Docker. Decide criar e implementar uma imagem do Docker através da execução de uma aplicação Web de teste.

Nesta unidade, irá saber mais sobre os principais conceitos e processos envolvidos na execução de uma aplicação em contentores armazenada numa imagem do Docker.

Descrição geral do Docker

O Docker é uma ferramenta que permite executar aplicações em contentores. Uma aplicação em contentor inclui a aplicação e o sistema de ficheiros que compõem o ambiente no qual a aplicação é executada. Por exemplo, uma aplicação em contentor pode ser composta de uma base de dados e de outro software associado, bem como as informações de configuração necessárias para a executar.

Geralmente, as aplicações em contentores têm muito menos requisitos de espaço do que as máquinas virtuais configuradas para executar a mesma aplicação. Este menor requisito de espaço deve-se ao facto de as máquinas virtuais terem de abastecer todo o sistema operativo e ambiente de suporte associado. Os contentores do Docker não têm esta sobrecarga porque o Docker utiliza o kernel do sistema operativo do computador anfitrião para o contentor. Baixar e iniciar uma imagem do Docker é mais rápido e eficiente em termos de espaço do que baixar e executar uma máquina virtual que fornece funcionalidade semelhante.

Você cria um aplicativo em contêiner criando uma imagem que contém um conjunto de arquivos e uma seção de informações de configuração que o Docker usa. Para executar a aplicação, tem de pedir ao Docker para iniciar um contentor com base na imagem. Quando o contentor iniciar, o Docker utiliza a configuração da imagem para determinar a aplicação que será executada dentro do contentor. O Docker fornece os recursos do sistema operacional e a segurança necessária. Ele garante que os contêineres estejam funcionando simultaneamente e permaneçam relativamente isolados.

Importante

O Docker não fornece o nível de isolamento disponível com as máquinas virtuais. As máquinas virtuais implementam o isolamento ao nível do hardware. Os contentores do Docker partilham bibliotecas e recursos do sistema operativo subjacentes. Contudo, o Docker assegura que um contentor não consegue aceder aos recursos de outro, a não ser que os contentores estejam configurados para tal.

Pode executar o Docker no seu computador de secretária ou no seu portátil se estiver a programar e a testar localmente. No caso dos sistemas de produção, o Docker está disponível para ambientes de servidor, incluindo para muitas variantes do Linux e o do Microsoft Windows Server 2016. Muitos fornecedores também suportam o Docker na cloud. Por exemplo, pode armazenar imagens do Docker no Azure Container Registry e executar contentores com o Azure Container Instances.

Neste módulo, você usará o Docker localmente para criar e executar uma imagem. Em seguida, você carregará a imagem no 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 o desenvolvimento e teste local de imagens do Docker.

Imagens do Docker do Linux e do Windows

O Docker foi inicialmente desenvolvido para Linux e desde então expandiu-se para suportar Windows. As imagens do Docker individuais baseiam-se no Windows ou no Linux, mas não podem basear-se nos dois ao mesmo tempo. O sistema operacional da imagem determina que tipo de ambiente de sistema operacional é usado dentro do contêiner.

Os autores de imagens do Docker que pretendam proporcionar uma funcionalidade semelhante em imagens baseadas no Windows e no Linux podem criar essas imagens em separado. Por exemplo, a Microsoft oferece imagens do Docker para Windows e Linux contendo um ambiente ASP.NET Core que você pode usar como base para aplicativos ASP.NET Core em contêineres.

Os computadores Linux que têm o Docker instalado só podem executar contentores do Linux. Os computadores Windows que têm o Docker instalado podem executar os dois tipos de contentor. O Windows executa ambos usando uma máquina virtual para executar um sistema Linux e usa o sistema Linux virtual para executar contêineres Linux.

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

Registos do Docker e Hub do Docker

As imagens do Docker são armazenadas e disponibilizadas em registos. Os registos são serviços Web com os quais o Docker consegue estabelecer ligação para carregar e transferir imagens de contentor. O registo mais conhecido é o Hub do Docker, que é um registo público. Muitas pessoas e organizações publicam imagens no Hub do Docker. Pode transferir e executar essas imagens através do Docker que está em execução no seu ambiente de trabalho, num servidor ou na cloud. Pode criar uma conta do Docker Hub e carregar gratuitamente as suas imagens para lá.

Os registos encontram-se organizados sob a forma de vários repositórios. Cada repositório contém múltiplas imagens do Docker que partilham o mesmo nome e, geralmente, a mesma finalidade e a funcionalidade. Essas imagens normalmente têm versões diferentes, identificadas com uma tag. Este mecanismo permite publicar e reter múltiplas versões de imagens por motivos de compatibilidade. Quando transferir e executar uma imagem, terá de especificar o registo, o repositório e a etiqueta da versão da imagem. As etiquetas são etiquetas de texto. Pode utilizar o seu sistema de numeração de versões (v1.0, v1.1, v1.2, v2.0, etc.).

Imagine que pretende utilizar a imagem do Docker do Runtime de ASP.NET Core. Esta 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 pretende utilizar 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

Nota

É possível atribuir múltiplas etiquetas a uma só imagem. Por convenção, a versão mais recente de uma imagem recebe a tag mais recente , além de uma tag que descreve seu número de versão. Quando lançar uma nova versão de uma imagem, pode reatribuir a etiqueta mais recente para referenciar a nova imagem.

Os repositórios também são a unidade de privacidade de uma imagem. Se não quiser partilhar uma imagem, pode tornar o repositório privado. Pode conceder acesso a outros utilizadores com os quais quer partilhar a imagem.

Navegar no Hub do Docker e solicitar imagens

Nota

Você não precisa completar nenhum dos exemplos ou executar qualquer código nas seções a seguir. Você fará isso na próxima unidade.

Muitas vezes, você verá que há uma imagem no Docker Hub que corresponde ao tipo de aplicativo que você deseja colocar em contêineres. Pode transferir essa imagem e expandi-la com o seu código de aplicação.

O Hub do Docker contém muitos milhares de imagens. Pode pesquisar e procurar um registo com o Docker a partir da linha de comandos ou do site do Docker Hub. O site permite-lhe pesquisar, filtrar e selecionar imagens por tipo e publicador. A imagem abaixo mostra um exemplo da página de pesquisa.

Captura de ecrã a mostrar a página de pesquisa do Docker Hub, que lista várias imagens de contentor.

Para obter uma imagem, utilize o comando docker pull com o nome da imagem. Por predefinição, se especificar apenas o nome do repositório, o Docker irá transferir a imagem com a etiqueta latest desse repositório no Docker Hub. Tenha em atenção que pode modificar o comando para solicitar etiquetas diferentes e de repositórios diferentes. Neste exemplo, a imagem com a etiqueta aspnetapp é obtida a partir do repositório mcr.microsoft.com/dotnet/core/samples:aspnetapp. Esta imagem contém uma simples aplicação Web ASP.NET Core.

Nota

Os exemplos presentes nesta unidade destinam-se a mostrar a sintaxe dos vários comandos do Docker. Não precisa de executar estes comandos quando estiver a ler esta unidade. Os exercícios que se seguem a esta unidade irão fornecer-lhe orientações para trabalhar diretamente com o Docker.

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

Quando obtiver uma imagem, o Docker irá armazená-la localmente e disponibilizá-la aos contentores em execução. Pode ver as imagens no seu registo local com o comando docker image list.

docker image list

A saída se parece com o exemplo a seguir:

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

O ID do nome da imagem é utilizado para fazer referência à imagem em muitos outros comandos do Docker.

Executar um contentor do Docker

Utilize o comando docker run para iniciar um contentor. Especifique a imagem que será executada com o nome ou ID da mesma. Se ainda não tiver executado o comando docker pull para solicitar a imagem, o Docker irá fazê-lo automaticamente.

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

Neste exemplo, o comando responde 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 uma aplicação Web, pelo que está agora a escutar a chegada de pedidos à porta HTTP 80. No entanto, se abrir um browser e navegar para http://localhost:80, não verá a aplicação.

Por predefinição, o Docker não permite que os pedidos de rede de entrada alcancem o seu contentor. Tem de dizer ao Docker para atribuir um número de porta específico do seu computador a um número de porta específico no contentor ao adicionar a opção -p a docker run. Esta instrução ativa os pedidos de rede para o contentor na porta especificada.

Além disso, a aplicação Web nesta imagem não se destina a ser utilizada interativamente a partir da linha de comandos. Quando a iniciamos, queremos que o Docker a inicie em segundo plano e apenas a deixe em execução. Utilize o sinalizador -d para instruir o Docker a criar a aplicação Web em segundo plano.

Pressione Ctrl+C para parar a imagem e reiniciá-la, conforme mostrado no exemplo a seguir:

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

O comando mapeia a porta 80 no contentor para a porta 8080 no seu computador. Se aceder à página http://localhost:8080 num browser, verá a aplicação Web de exemplo.

Captura de ecrã a mostrar a aplicação Web de exemplo em execução num browser.

Contentores e ficheiros

Se um contentor em execução alterar os ficheiros na respetiva imagem, essas alterações só existem no contentor onde as alterações são feitas. A menos que você tome medidas específicas para preservar o estado de um contêiner, essas alterações são perdidas quando o contêiner é 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 contentor tem a sua própria cópia independente. Todos os dados gravados por um contêiner em seu sistema de arquivos não são visíveis para o outro.

É possível adicionar a volumes graváveis a um contentor. Cada volume representa um sistema de ficheiros que pode ser montado pelo contentor e que é disponibilizado à aplicação em execução no contentor. Os dados contidos num volume persistem quando o contentor é interrompido e o mesmo volume pode ser partilhado por múltiplos contentores. Os detalhes relativos à criação e utilização de volumes estão fora do âmbito deste módulo.

É uma prática recomendada evitar a necessidade de fazer alterações no sistema de arquivos de imagem para aplicativos implantados com o Docker. Utilize-o apenas para ficheiros temporários que podem ser perdidos.

Gerir contentores do Docker

Pode ver os contentores ativos com o comando docker ps.

docker ps

A saída inclui o status do contêiner — Ativo se estiver em execução, Encerrado se for encerrado — entre outros valores, como os sinalizadores de linha de comando especificados quando a imagem foi iniciada e informações adicionais. O Docker permite executar vários contêineres da mesma imagem simultaneamente, para que cada contêiner receba um ID exclusivo e um nome exclusivo legível por humanos. A maioria dos comandos do Docker utilizados para gerir contentores individuais pode utilizar o ID ou o nome para fazer referência a um contentor específico.

Na saída a seguir, você pode ver dois contêineres. O campo PORTAS mostra que o contentor com o ID elegant_ramanujan é a imagem em execução com a porta 80 no anfitrião do Docker mapeado à porta 8080 no seu computador. A instância youthful_heisenberg é o contentor da execução anterior da imagem. O campo COMMAND mostra o comando que o contentor executou para iniciar a aplicação na imagem. Neste caso, para ambos os recipientes, é dotnet aspnetapp.dll. O ID da imagem para os contêineres também é o mesmo porque ambos os 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

Nota

docker container ls é um atalho para docker ps. Os nomes destes comandos baseiam-se nos utilitários do Linux ps e ls, que listam, respetivamente, os processos e os ficheiros em execução.

Você pode parar um contêiner ativo com o docker stop comando, especificando o ID do contêiner.

docker stop elegant_ramanujan

Se executar novamente docker ps, verá que o contentor elegant_ramanujan já não está presente no resultado. O contêiner ainda existe, mas não está mais hospedando um processo em execução. Pode incluir contentores parados no resultado de docker ps ao incluir 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

Pode reiniciar um contentor parado com o comando docker start. O processo principal do contentor é reiniciado.

docker start elegant_ramanujan

Normalmente, depois de parar um contentor, também se deve removê-lo. A remoção de um contentor limpa todos os recursos que este deixa para trás. Após a remoção de um contentor, todas as alterações feitas no sistema de ficheiros da respetiva imagem são perdidas para sempre.

docker rm elegant_ramanujan

Você não pode remover um contêiner em execução, mas pode forçar um contêiner a ser interrompido e removido com o sinalizador -f para o docker rm comando. Essa é uma maneira rápida de parar e remover um contêiner, mas só deve ser usada se o aplicativo dentro do contêiner não precisar executar um desligamento normal.

docker container rm -f elegant_ramanujan

Remover imagens do Docker

Pode remover uma imagem do computador local com o comando docker image rm. Especifique o ID da imagem a remover. O exemplo a seguir remove a imagem do aplicativo Web de exemplo.

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

É necessário terminar os contentores que executam a imagem antes de esta poder ser removida. Se a imagem ainda estiver em uso por um contêiner, você receberá uma mensagem de erro como a que se segue. 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