Personalizar uma imagem do Docker para executar seu aplicativo Web

Concluído

O Hub do Docker é uma excelente fonte de imagens para começar a criar aplicativos em contêiner. É possível baixar uma imagem que oferece a funcionalidade básica que você precisa e acrescentar camadas ao aplicativo para criar uma imagem personalizada. Você pode automatizar as etapas desse processo gravando um Dockerfile.

No cenário da loja de roupas online, a empresa decidiu que o Docker é a melhor opção. A próxima etapa é determinar a melhor maneira de colocar os aplicativos Web em contêineres. A empresa planeja criar muitos dos aplicativos usando o ASP.NET Core. Você observou que o Docker Hub contém uma imagem base que inclui essa estrutura. Como uma prova de conceito, você quer usar essa imagem base e adicionar o código de um dos aplicativos Web para criar uma imagem personalizada. Você também quer que esse processo seja repetido com facilidade, para que possa ser automatizado sempre que você lançar uma nova versão do aplicativo Web.

Nesta unidade, você aprenderá a criar uma imagem personalizada do Docker e a automatizar o processo gravando um Dockerfile.

Criar uma imagem personalizada com um Dockerfile

A fim de criar uma imagem do Docker que contenha o aplicativo, você normalmente começa identificando uma imagem base para adicionar os arquivos e a configuração. O processo de identificação de uma imagem base adequada geralmente começa com uma pesquisa de imagem no Docker Hub. Você quer uma imagem que já contenha uma estrutura do aplicativo e todos os utilitários e ferramentas de uma distribuição Linux, como Ubuntu ou Alpine. Por exemplo, se você tiver um aplicativo ASP.NET Core que deseja empacotar em um contêiner, a Microsoft publicará uma imagem chamada mcr.microsoft.com/dotnet/core/aspnet que já contém o runtime do ASP.NET Core.

Você pode personalizar uma imagem iniciando um contêiner com a imagem base e fazendo alterações nela. Normalmente, as alterações envolvem atividades como copiar arquivos do sistema de arquivos local para o contêiner e executar várias ferramentas e utilitários para compilar códigos. Ao terminar, você usará o comando docker commit para salvar as alterações em uma nova imagem.

Completar manualmente o processo acima é demorado e há grande probabilidade de erro. Você pode criar um script com uma linguagem como Bash, mas o Docker oferece uma maneira mais eficiente de automatizar a criação de imagens por meio do Dockerfile.

Um Dockerfile é um arquivo de texto sem formatação que contém todos os comandos necessários para criar uma imagem. Os Dockerfiles são gravados em uma linguagem de scripts mínima projetada para criar e configurar imagens. Eles documentam as operações necessárias para criar uma imagem começando com uma imagem base.

O exemplo a seguir mostra um Dockerfile que cria um aplicativo do .NET Core 2.2 e o empacota em uma nova imagem.

FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /app
COPY myapp_code .
RUN dotnet build -c Release -o /rel
EXPOSE 80
WORKDIR /rel
ENTRYPOINT ["dotnet", "myapp.dll"]

Neste arquivo, ocorrem as seguintes operações:

Comando Ação
FROM Baixa a imagem especificada e cria um contêiner com base nela.
WORKDIR Define o diretório de trabalho atual no contêiner, usado pelos comandos subsequentes.
COPIAR Copia os arquivos do computador host para o contêiner. O primeiro argumento (myapp_code) é um arquivo ou pasta no computador host. O segundo argumento (.) especifica o nome do arquivo ou da pasta para atuar como destino no contêiner. Nesse caso, o destino será o diretório de trabalho atual (/app).
EXECUTAR Executa um comando no contêiner. Os argumentos para o comando RUN são comandos da linha de comandos.
EXPOSE Cria uma configuração na nova imagem que especifica quais portas abrir quando o contêiner é executado. Se o contêiner estiver executando um aplicativo Web, será comum executar EXPOSE para a porta 80.
ENTRYPOINT Especifica a operação que o contêiner deve executar ao ser iniciado. Neste exemplo, ele executa o aplicativo recém-criado. Especifique o comando que deseja executar e cada um dos seus argumentos como uma matriz de cadeia de caracteres.

Por convenção, os aplicativos que devem ser empacotados como imagens do Docker normalmente têm um Dockerfile localizado na raiz do seu código-fonte, que quase sempre é denominada Dockerfile.

O comando docker build cria uma nova imagem ao executar um Dockerfile. A sintaxe desse comando tem vários parâmetros:

  • O sinalizador -f indica o nome do Dockerfile a ser usado.
  • O sinalizador -t especifica o nome da imagem a ser criada, que neste exemplo, é myapp:v1.
  • O parâmetro final, ., fornece contexto de criação para os arquivos de origem do comando COPY: o conjunto de arquivos no computador host necessário durante o processo de criação.
docker build -t myapp:v1 .

Nos bastidores, o comando docker build cria um contêiner, executa comandos nele e, depois, faz commit das alterações em uma nova imagem.