Como Criar uma Imagem Docker do Windows com a Tag de Compilação do Docker

Você é novo em imagens Docker do Windows? Você está trabalhando atualmente em um ambiente Windows e tem curiosidade de aprender sobre construções Docker para imagens de contêiner? Você veio ao lugar certo. A melhor maneira de aprender algo novo é fazendo com os comandos docker build e docker build "tag"!

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

Vamos começar!

Entendendo Imagens de Contêiner Docker

Por anos, a única maneira de testar ou desenvolver 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. Esta 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êiner Docker cresceu em parte devido à popularidade da arquitetura de microsserviços. Em resposta ao aumento da popularidade do Docker, a Microsoft começou a oferecer suporte público para imagens Docker de vários produtos principais em sua página do Docker Hub. Eles até adicionaram suporte nativo para imagens para Windows como um recurso 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

Entendendo Construção e Imagens 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 no 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ários benefícios em relação ao uso de uma imagem de contêiner pré-construída:

  1. É possível 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 seu 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 criar uma imagem Docker usando um Dockerfile. Se desejar acompanhar, certifique-se de ter os seguintes pré-requisitos em vigor.

  • Docker for Windows instalado. Estarei utilizando a versão 2.1.0.4 da Docker Community Edition (CE) em meu ambiente.
  • O acesso à Internet é necessário para baixar as imagens do Docker
  • Sistema Operacional Windows 10+ (a versão 1709 está sendo usada para este tutorial)
  • Virtualização aninhada ativada
  • 5 GB de espaço livre no disco em sua máquina local
  • PowerShell 5.0+
  • Este tutorial utiliza o IDE Visual Studio Code. No entanto, sinta-se à vontade para usar o IDE que preferir.

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

Preparando-se

Primeiro, você precisará de uma pasta para armazenar todas as imagens e contêineres do Docker que irá construir 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, mude para esse diretório. Isso coloca o diretório de trabalho atual do console em C:\Containers para definir todos os downloads para este diretório por padrão.

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. Uma vez criada a pasta, execute um Git pull para copiar os arquivos necessários para este artigo do repositório Github do TechSnips para a pasta C:\Containers. Depois de concluído, verifique se a pasta C:\Containers está como abaixo.

Tutorial files

Baixando a Imagem Docker do Windows IIS

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

Revisando as Imagens Base Docker Atuais

Antes de baixar a imagem do repositório de imagens, vamos primeiro revisar as imagens base Docker atuais que você tem em seu sistema local. Para fazer isso, execute um console 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 IIS Core do Microsoft Windows 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 inline.

# 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 é "**dono/nome do aplicativo : nome da tag**"
# (mostrado como microsoft/iis:latest); então, em nosso caso, o dono da imagem é
# Microsoft e o aplicativo é o IIS, com o nome da tag "latest" sendo usado
# para especificar que você vai baixar 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 o WWWroot do IIS inetpub
# no contêiner. Você não precisa especificar o caminho completo para seus arquivos locais
# porque o Docker já tem a lógica embutida para referenciar arquivos e pastas
# relativos à localização do arquivo Docker em seu sistema. Além disso, observe que
# o Docker só reconhecerá barras inclinadas para caminhos de arquivos - já que este é um
# contêiner baseado no Windows em vez de Linux.
COPY wwwroot c:/inetpub/wwwroot

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

# Executa os comandos 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 IIS já tem esta porta
# aberta por padrão.
#EXPOSE 80

# Define o comando principal da imagem do contêiner
# Isso indica que a imagem 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 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 e baixou uma imagem base do IIS. Agora é hora de construir sua nova imagem Docker usando o Dockerfile.

Para construir uma nova imagem, utilize o comando docker build "tag". Este comando cria a imagem. Para este artigo, você pode observar abaixo que também está usando a opção -t **, que substitui a parte “tag”. Essa opção permite que você dê um nome amigável à sua nova imagem e também referencie o Dockerfile especificando o caminho da pasta onde ele está localizado.

Abaixo, você pode ver um exemplo garantindo que o console esteja no diretório C:\Containers e, em seguida, construindo uma nova imagem a partir do Dockerfile no diretório C:\Containers\Container1.

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

Assim que iniciado, você pode acompanhar o progresso do comando conforme 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

Feito isso, agora você deve ter uma nova imagem Docker!

Agora execute o comando docker images para visualizar as imagens disponíveis. Abaixo, você pode ver 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 em execução.

Executando o Contêiner Docker

Neste ponto, você deveria 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 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 sair quando o processo raiz usado para executar o contêiner encerrar.

Ao concluir o docker run, ele retornará o ID do contêiner criado. O exemplo abaixo está capturando esse ID em uma variável $containerID, para que possamos fazer referência a ele facilmente posteriormente.

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

Depois de iniciar o contêiner, execute o comando docker ps. Esse comando permite visualizar quais contêineres estão em execução usando cada imagem. Observe abaixo que a imagem em execução é gerada automaticamente com um apelido (busy_habit, neste caso). Esse 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 visualizar a saída do PowerShell para o comando Get-ChildItem no contêiner, usando a sintaxe abaixo. Isso garantirá que as instruções no Dockerfile para remover os arquivos padrão do IIS foram bem-sucedidas.

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 com sucesso.

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 ipconfig foi executado no contêiner como se estivesse sendo executado em seu computador local e retornou todas as informações de IP.

Running ipconfig in a Docker container

Inspecting the IIS Website

Agora é hora de revelar os frutos do seu trabalho! É hora de ver 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 bem, 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 a ser usado ao trabalhar com contêineres Docker é o comando docker history. Embora não necessariamente relacionado à criação de uma imagem ou contêiner em si, o comando docker history é um comando útil que permite revisar as alterações feitas na imagem do contêiner.

PS51> docker history container1

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

Inspecting container changes with docker history

Limpando as Imagens do 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 em 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/