diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..0ae0591 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +** +!/ConversaoPeso.sln +!/ConversaoPeso.Web/** \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3b412cf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# image build +FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build + +LABEL vendor=Rogerio\ dos\ Santos\ Silva \ + email=roger7331@gmail.com \ + version="1.0" \ + release-date="2021-11-03" + +WORKDIR /src + +COPY *.sln . +COPY ConversaoPeso.Web/*.csproj ./ConversaoPeso.Web/ +RUN dotnet restore + +COPY ConversaoPeso.Web/. ./ConversaoPeso.Web/ +WORKDIR /src/ConversaoPeso.Web +RUN dotnet publish -c release -o /app --no-restore + +# image production +FROM mcr.microsoft.com/dotnet/aspnet:5.0 as production +WORKDIR /app +COPY --from=build /app ./ +ENTRYPOINT ["dotnet", "ConversaoPeso.Web.dll"] \ No newline at end of file diff --git a/README.md b/README.md index 9cdeec2..585cefe 100644 --- a/README.md +++ b/README.md @@ -1 +1,115 @@ -# conversao-peso \ No newline at end of file +# Docker + ASP.Net + + +Claro, porque não? Neste exemplo vamos conteirizar uma aplicação ASP.Net. +Para testar esta aplicação dentro de um contêiner, vocẽ precisa ter o Docker instalado em sua máquina. +Caso não deseje saber sobre o arquivo de conteinerização **Dockerfile**, vá direto para a sessão Testando a aplicação. + +## Dockerfile + +A grosso modo, entenda o Dockerfile como uma receita que será utilizada para gerar o contêiner. + +Como as linguagens suportadas pela plataforma “_.net_” são compiladas, vamos usar uma imagem intermediária para compilar e finalizar nossa imagem com apenas o necessário para executar a aplicação. + +Então, vamos à imagem de compilação. Vamos indicar a imagem que utilizaremos para compilar nossa aplicação. Para isto utilizaremos o comando ``` FROM ``` e o nome da imagem, vamos atribuir o alias build a esta imagem. +```docker +FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build +``` +Vamos definir o diretório de trabalho. O comando abaixo, cria a pasta "_src_", caso ela não exista e nos move para dentro da pasta. +```docker +WORKDIR /src +``` +Copie os arquivos da aplicação para o nosso diretório de trabalho. + +```docker +COPY *.sln . +COPY ConversaoPeso.Web/*.csproj ./ConversaoPeso.Web/ +``` +Restaurando as dependências e as ferramentas do projeto. + +```docker +RUN dotnet restore +``` +Agora vamos copiar os scripts da aplicação para a pasta _“/src/ConversaoPeso.Web”_, alterar o diretório de trabalho para o diretório da aplicação e compilar todo o projeto. + +```docker +COPY ConversaoPeso.Web/. ./ConversaoPeso.Web/ +WORKDIR /src/ConversaoPeso.Web +RUN dotnet publish -c release -o /app --no-restore +``` +Note que o resultado da compilação será salvo na pasta “_/app_” + +Ok, a primeira fase foi concluída. Agora vamos a imagem de produção. Vamos utilizar a imagem “**aspnet:5.0**” que é mais leve e é o suficiente para executar nossa aplicação. +```docker +FROM mcr.microsoft.com/dotnet/aspnet:5.0 as production +``` +Definir o diretório de trabalho e copiar a aplicação compilada na imagem “_build_” para a imagem “_production_”. +```docker +WORKDIR /app +COPY --from=build /app ./ +``` +Para finalizar, vamos incluir o start imutável. + +```docker +ENTRYPOINT ["dotnet", "ConversaoPeso.Web.dll"] +``` +O arquivo final será este: +```docker +# image build +FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build +WORKDIR /src +COPY *.sln . +COPY ConversaoPeso.Web/*.csproj ./ConversaoPeso.Web/ +RUN dotnet restore + +COPY ConversaoPeso.Web/. ./ConversaoPeso.Web/ +WORKDIR /src/ConversaoPeso.Web +RUN dotnet publish -c release -o /app --no-restore + +# image production +FROM mcr.microsoft.com/dotnet/aspnet:5.0 as production +WORKDIR /app +COPY --from=build /app ./ +ENTRYPOINT ["dotnet", "ConversaoPeso.Web.dll"] +``` +Ótimo, com a “receita” pronta, vamos criar nossa imagem. +``` +docker build -t conversao-peso:v1 . +``` +Para visualizar a imagem criada, utilize o comando abaixo +``` +docker image ls +``` +``` +REPOSITORY TAG IMAGE ID CREATED SIZE +conversao-peso v1 d6ba851cae82 3 days ago 210MB + 22e4b12a9e52 3 days ago 647MB +mcr.microsoft.com/dotnet/sdk 5.0 3d9edf094595 3 weeks ago 631MB +mcr.microsoft.com/dotnet/aspnet 5.0 8102e4dcab1c 3 weeks ago 205MB +``` +Note o tamanho das imagens, a imagem que utilizamos para compilar, a _skd:5.0_ tem 631Mb mas nossa aplicação tem apenas 210Mb, isto porque a imagem que utilizamos para executar a aplicação foi a _aspnet:5.0_ que possui 1/3 do tamanho da imagem de compilação. +Durante o processo uma imagem sem nome foi criada, a imagem ``````, esta imagem é a imagem de compilação. Esta imagem já cumpriu o seu papel e já não é mais necessária, para eliminá-la use o comando abaixo. +``` +docker image prune +``` +## Criando o contêiner +Já criamos nossa imagem, então estamos prontos para executarmos o contêiner, para isto, utilize o comando abaixo: +``` +docker container run -d --rm --name app-aspnet -p 80:80 conversao-peso:v1 +``` +Podemos verificar se o contêiner está em sendo executado com o comando +``` +docker container ls -a +``` +  +## Testando a aplicação + +Se você seguiu as instruções acima, a aplicação pode ser acessada no em http://localhost. Caso contrário, baixe o arquivo start.sh e de permissão de execução em sua máquina com o comando +``` +sudo chmod +x start.sh +``` +E execute com o comando +``` +./start.sh +``` +Isto irá baixar a imagem da aplicação para sua máquina e executar o contêiner. Agora é só testar a aplicação em http://localhost \ No newline at end of file diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..5bf091b --- /dev/null +++ b/start.sh @@ -0,0 +1,13 @@ +#!/bin/sh +[ -n "$(docker images -q rogeriostos/conversao-peso:v1)" ] || echo docker pull rogeriostos/conversao-peso:v1 + +if [ ! "$(docker ps -q -f name=myappasp)" ]; then + if [ "$(docker ps -aq -f status=exited -f name=myappasp)" ]; then + # cleanup + docker rm -f myappasp + fi + # run your container + docker container run -d --rm --name myappasp -p 80:80 rogeriostos/conversao-peso:v1 +fi +[ -z "$(docker ps -q -f name=myappasp)" ] || echo "\nAcesse a aplicação em http://localhost/" +echo "\n" \ No newline at end of file