Como Criar uma Imagem do Windows Docker Com a Tag de Construção do Docker

Você é novo em Imagens do Docker para Windows? Está trabalhando atualmente em um ambiente Windows e curioso para aprender sobre a construção de imagens de contêineres com o Docker? Você veio ao lugar certo. A melhor maneira de aprender algo novo é praticando com os comandos docker build e docker build "tag"!

Neste artigo, você aprenderá como criar sua primeira imagem do Docker para Windows a partir de um Dockerfile usando o comando docker build.

Vamos começar!

Entendendo Imagens de Contêineres do Docker

Por anos, a única maneira de testar ou realizar desenvolvimento em vários sistemas operacionais (SO) era ter várias máquinas físicas ou virtuais dedicadas com a imagem da versão do SO de sua escolha. Essa metodologia exigia mais hardware e sobrecarga para provisionar novas máquinas para cada especificação de software e SO.

No entanto, nos dias de hoje, o uso de imagens de contêineres do Docker tem crescido em parte devido à popularidade da arquitetura de microsserviços. Em resposta ao aumento da popularidade do Docker, a Microsoft começou a apoiar publicamente imagens do Docker para vários produtos principais em sua página do Docker Hub. Eles até adicionaram suporte nativo para imagens do Windows como uma característica do produto no Windows 10 e no Windows Server 2016!

A Docker image is run on a container by using the Docker Engine. Docker images have many benefits such as portability (applicable to multiple environments and platforms), customizable, and highly scalable.  As you can see below, unlike traditional virtual machines, the Docker engine runs on a layer between the host OS kernel and the isolated application services that are being containerized.

Source: Docker

Compreendendo Construção e Imagens do Docker

O comando docker build pode ser aproveitado para automatizar a criação de imagens de contêiner, adotar uma prática de DevOps de contêiner como código e integrar a contenerização ao ciclo de desenvolvimento de seus projetos. Os Dockerfiles são simplesmente arquivos de texto que contêm instruções de construção usadas pelo Docker para criar uma nova imagem de contêiner baseada em uma imagem existente.

O usuário pode especificar a imagem base e a lista de comandos a serem executados quando uma imagem de contêiner é implantada ou iniciada pela primeira vez. Neste artigo, você aprenderá como criar uma imagem docker baseada no Windows a partir de um Dockerfile usando um contêiner do Windows.

Esse processo tem várias vantagens em relação ao uso de uma imagem de contêiner pré-construída:

  1. Você pode reconstruir uma imagem de contêiner para várias versões do Windows – o que é ótimo para testar alterações de código em várias plataformas.
  2. Você terá mais controle sobre o que é instalado no contêiner. Isso permitirá manter o tamanho do contêiner ao mínimo.
  3. Por motivos de segurança, você pode querer verificar o contêiner em busca de vulnerabilidades e aplicar endurecimento de segurança à imagem base

Pré-requisitos/Requisitos

Este artigo é um guia sobre como aprender a construir uma imagem Docker usando um Dockerfile. Se você deseja acompanhar, certifique-se de ter os seguintes pré-requisitos no local.

Nota: Certifique-se de habilitar a Configuração de Contêineres do Windows ao instalar o Docker.

Preparação

Primeiro, você precisará de uma pasta para armazenar todas as imagens e contêineres do Docker que serão criados a partir dessas imagens. Para fazer isso, abra um terminal PowerShell ou cmd (você usará o PowerShell ao longo deste artigo) e crie um novo diretório chamado C:\Containers.

Depois que a pasta for criada, altere para esse diretório. Isso define o diretório de trabalho atual do console para C:\Containers para que todos os downloads sejam padrão para este diretório.

PS51> mkdir C:\Containers
PS51> cd C:\Containers

Neste artigo, você terá uma vantagem inicial. A maioria dos arquivos para trabalhar neste projeto já está disponível. Depois que a pasta for criada, execute um Git pull para copiar os arquivos necessários para este artigo do repositório do Github da TechSnips para a pasta C:\Containers. Uma vez concluído, verifique se a pasta C:\Containers parece como abaixo.

Tutorial files

Baixando a Imagem do Docker do Windows IIS

A primeira tarefa a ser realizada é baixar uma “template” ou imagem base. Mais tarde, você construirá sua própria imagem do Docker, mas primeiro, precisa de uma imagem para começar. Você estará baixando as últimas imagens do Windows Server Core e do IIS que são necessárias para este tutorial. A lista atualizada de imagens pode ser encontrada na página oficial de imagens do Docker da Microsoft.

Revisando as Imagens Base do Docker Atuais

Antes de baixar a imagem do repositório de imagens, vamos primeiro revisar as imagens base do Docker que você possui atualmente em seu sistema local. Para fazer isso, execute um console do PowerShell como Administrador e então digite docker images. Este comando retorna todas as imagens em seu sistema local.

Como você pode ver abaixo, as imagens disponíveis estão inicialmente vazias.

PS51> docker images
Docker Build Tag : Listing available Docker images

Baixando a Imagem Base

Agora é hora de baixar a imagem base do IIS do Docker Hub. Para fazer isso, execute docker pull conforme mostrado abaixo. Esse processo pode levar algum tempo para ser concluído, dependendo da velocidade da sua internet.

PS51> docker pull mcr.microsoft.com/windows/servercore/iis
Downloading an image from the Docker Hub

Agora execute docker images e você deverá ter a imagem mais recente do Microsoft Windows Core IIS disponível para este tutorial.

PS51> docker images
Viewing available Docker images

Inspeção do Dockerfile

Em um passo anterior, você baixou um Dockerfile existente para este tutorial. Vamos agora dar uma olhada exatamente no que isso implica.

Abra o arquivo C:\Containers\Container1\Dockerfile no seu editor favorito. O conteúdo deste Dockerfile é usado para definir como a imagem do contêiner será configurada no momento da construção.

Você pode ver uma explicação do que cada parte deste arquivo faz nos comentários internos.

# Especifica que a imagem mais recente do microsoft/iis será usada como imagem base
# Usado para especificar qual imagem de contêiner base será usada no processo de construção.

# Observe que a convenção de nomenclatura é "**nome do proprietário/nome da aplicação : nome da tag**"
# (mostrado como microsoft/iis:latest); então, em nosso caso, o proprietário da imagem é
# Microsoft e a aplicação é o IIS com o nome da tag "latest" sendo usado
# para especificar que você irá puxar a versão mais recente da imagem disponível.
FROM microsoft/iis:latest

# Copia o conteúdo da pasta wwwroot para a pasta inetpub/wwwroot na nova imagem do contêiner
# Usado para especificar que você deseja copiar a pasta WWWroot para a pasta IIS inetpub WWWroot
# no contêiner. Você não precisa especificar o caminho completo para seus arquivos locais
# porque o Docker já possui a lógica integrada para referenciar arquivos e pastas
# em relação à localização do arquivo docker em seu sistema. Além disso, observe que
# o Docker reconhecerá apenas barras invertidas para caminhos de arquivos - como este é um
# contêiner baseado no Windows em vez de Linux.
COPY wwwroot c:/inetpub/wwwroot

# Executar alguns comandos do PowerShell dentro do novo contêiner para configurar a imagem

# Execute os comandos do PowerShell para remover os arquivos padrão do IIS e criar um novo
# pool de aplicativos chamado TestPool
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.htm -force
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.png -force
RUN powershell Import-Module WebAdministration
RUN powershell New-WebAppPool -Name 'TestPool'

# Expõe a porta 80 na nova imagem do contêiner
# Usado para abrir a porta TCP 80 para permitir uma conexão http ao site.
# No entanto, esta linha está comentada, porque o contêiner do IIS possui esta porta
# já aberta por padrão.
#EXPOSE 80

# Define o comando principal da imagem do contêiner
# Isso diz à imagem para executar um monitor de serviço para o serviço w3svc.
# Quando isso é especificado, o contêiner será automaticamente interrompido
# se o serviço w3svc parar. Esta linha está comentada por causa do
# contêiner do IIS já ter este ponto de entrada em vigor por padrão.
#ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

Construindo uma Nova Imagem Docker

Você já tem o Dockerfile pronto para usar e uma imagem base do IIS baixada. Agora é hora de construir sua nova imagem Docker usando o Dockerfile.

Para construir uma nova imagem, use o comando docker build "tag". Este comando cria a imagem. Para este artigo, você também pode ver abaixo que está usando a opção -t ** que substitui a parte “tag”. Esta opção permite que você dê um nome de tag amigável para sua nova imagem e também faça referência ao Dockerfile especificando o caminho da pasta onde ele está localizado.

Abaixo você pode ver um exemplo de garantir que o console esteja no diretório C:\Containers e então construir uma nova imagem a partir do Dockerfile no diretório C:\Containers\Container1.

PS51> cd C:\Containers
PS51> docker build -t container1 .\Container1

Uma vez iniciado, você pode ver o progresso do comando enquanto ele percorre cada instrução no arquivo docker linha por linha:

Building a progress of the command as it traverses each instruction in the docker filenew Docker image

Quando terminar, você deverá ter uma nova imagem Docker!

Agora execute o comando docker images para ver as imagens disponíveis. Você pode ver abaixo um exemplo da imagem container1 criada.

Viewing available Docker images

Nota: O comando docker build —help é um parâmetro útil para exibir informações detalhadas sobre o comando docker sendo executado.

Executando o Contêiner Docker

Neste ponto, você deve ter uma nova imagem criada. É hora de iniciar um contêiner usando essa imagem. Para iniciar um novo contêiner, use o comando docker run.

O comando docker run irá criar um novo contêiner Docker com base na imagem container1 que você criou anteriormente. Você pode ver um exemplo disso abaixo.

Observe que o parâmetro -d é utilizado. Isso indica ao tempo de execução do docker para iniciar a imagem no modo destacado e depois sair quando o processo raiz usado para executar o contêiner sair.

Quando o docker run é concluído, ele retorna o ID do contêiner criado. O exemplo abaixo está capturando esse ID em uma variável $containerID para que possamos facilmente referenciá-lo posteriormente.

PS51> $containerID = docker run -d container1
PS51> $containerID
Running a Docker container

Assim que o contêiner estiver criado, execute o comando docker ps. Este comando permite ver quais contêineres estão atualmente em execução usando cada imagem. Observe abaixo que a imagem em execução é automaticamente gerada um apelido (busy_habit neste caso). Este apelido às vezes é usado em vez do ID do contêiner para gerenciar o contêiner.

Listing running Docker containers

Executando Código Dentro de um Contêiner Docker

A new container is built from a new image you just created. Let’s now start actually using that container to run code. Running code inside of a Docker container is done using the docker exec command.

Neste exemplo, execute docker exec para ver a saída do PowerShell para o comando Get-ChildItem no contêiner usando a sintaxe de comando abaixo. Isso garantirá que as instruções no Dockerfile para remover os arquivos padrão do IIS tenham sucesso.

PS51> docker exec $containerID powershell Get-ChildItem c:\inetpub\wwwroot

Você pode ver abaixo que o único arquivo que existe é index.html o que significa que os arquivos padrão foram removidos.

Running PowerShell commands in a Docker container

Agora execute o comando ipconfig no contêiner para obter o endereço IP local da imagem do contêiner para que você possa tentar se conectar ao site do IIS.

PS51> docker exec $containerID ipconfig

Você pode ver abaixo que o comando ipconfig foi executado no contêiner, assim como se estivesse sendo executado no seu computador local, e retornou todas as informações de IP.

Running ipconfig in a Docker container

Inspectando o Site do IIS

Agora é hora de revelar os frutos do seu trabalho! É hora de verificar se o servidor IIS em execução no contêiner Docker está servindo corretamente a página index.html.

Abra um navegador e cole o Endereço IP4 encontrado via ipconfig na barra de endereços. Se tudo estiver correto, você deverá ver uma mensagem Hello World!! como abaixo.

IIS webpage running in a Docker container

Revisando o Histórico do Docker

Um comando útil ao trabalhar com contêineres Docker é o comando docker history. Embora não esteja necessariamente relacionado à criação de uma imagem ou contêiner em si, o comando docker history é útil para revisar as alterações feitas na imagem do contêiner.

PS51> docker history container1

Você pode ver abaixo que o comando docker history retorna toda a atividade do Dockerfile e do PowerShell realizada no contêiner container1 com o qual você esteve trabalhando.

Inspecting container changes with docker history

Limpeza das Imagens Docker em Execução

Os passos abaixo são usados para limpar todos os contêineres parados em execução em sua máquina. Isso liberará espaço em disco e recursos do sistema.

Execute o comando docker ps para ver uma lista dos contêineres em execução no seu sistema:

PS51> docker ps
Viewing available Docker containers

Agora pare os contêineres em execução usando o comando docker stop:

PS51> docker stop <image nick name: busy_haibt in my case>
PS51> docker stop <image nick name: unruffled_driscoll in my case>
Stopping Docker containers

Finalmente, você pode remover permanentemente os contêineres parados usando o comando docker system prune.

PS51> docker system prune
Removing Docker images

Leitura Adicional

Source:
https://adamtheautomator.com/docker-build-tag/