Obter uma imagem do Docker existente e implementá-la localmente
O Docker é uma tecnologia que permite implantar aplicativos 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 corporativo que descrevemos anteriormente, você deseja investigar a viabilidade de empacotar e executar um aplicativo 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.
Visã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. Um contêiner do Docker não tem essa sobrecarga, porque o Docker usa o kernel do sistema operacional do computador host para alimentar o contêiner. 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 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. 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 isso.
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 desenvolver e testar imagens do Docker localmente.
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 desejam oferecer funcionalidade semelhante em imagens baseadas em Linux e em Windows podem criar essas imagens separadamente. 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 registros. 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á.
Um registro é organizado como uma série de 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:
- 9.0:
mcr.microsoft.com/dotnet/aspnet:9.0 - 8.0 (Suporte a Longo Prazo):
mcr.microsoft.com/dotnet/aspnet:9.0
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:dotnetappmcr.microsoft.com/dotnet/samples:dotnetapp-chiseledmcr.microsoft.com/dotnet/samples:aspnetappmcr.microsoft.com/dotnet/samples:aspnetapp-chiseled
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. Ao lançar uma nova versão de uma imagem, você pode reatribuir a tag mais recente para fazer referência à 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.
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. Este exemplo busca a imagem com a tag aspnetapp do repositório mcr.microsoft.com/dotnet/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. Você pode visualizar as imagens em seu registro 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
Você pode usar o ID do nome da imagem 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.
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 que um contêiner grava em seu sistema de arquivos não são visíveis para o outro.
É possível adicionar a volumes graváveis a um contentor. Um volume representa um sistema de arquivos que o contêiner pode montar e que é disponibilizado para o aplicativo em execução no contêiner. 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. Use-o apenas para arquivos temporários que você pode perder.
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 PORTS mostra que o contêiner com ID elegant_ramanujan é a imagem em execução com a porta 80 no host do Docker mapeada para a 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 contêiner executou para iniciar o aplicativo 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 ps é um atalho para docker container ls. Esses nomes de comando são baseados nos utilitários Linux ps e ls, que listam processos e arquivos em execução, respectivamente.
Você pode parar um contêiner ativo com o docker stop comando, especificando o ID do contêiner.
docker stop elegant_ramanujan
Se você executar docker ps novamente, verá que o contêiner elegant_ramanujan não está mais presente na saída. 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, uma vez que um contêiner é parado, você também 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 container em execução, mas pode forçar um container a ser interrompido e removido com o sinalizador -f no comando docker rm. Esta é uma maneira rápida de parar e remover um contêiner, mas você só deve usá-lo 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