<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edoardo Inamo</title>
    <description>The latest articles on DEV Community by Edoardo Inamo (@kingsor).</description>
    <link>https://dev.to/kingsor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F61767%2Fb632d240-87cd-47cb-adf2-dd4a93dda64a.jpg</url>
      <title>DEV Community: Edoardo Inamo</title>
      <link>https://dev.to/kingsor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kingsor"/>
    <language>en</language>
    <item>
      <title>Deploy ASP.NET Core 2 apps with Docker</title>
      <dc:creator>Edoardo Inamo</dc:creator>
      <pubDate>Thu, 03 May 2018 19:37:59 +0000</pubDate>
      <link>https://dev.to/kingsor/deploy-aspnet-core-2-apps-withdocker-598n</link>
      <guid>https://dev.to/kingsor/deploy-aspnet-core-2-apps-withdocker-598n</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kingsor.github.io/2018/04/30/deploy-asp-net-2-apps-with-docker/" rel="noopener noreferrer"&gt;https://kingsor.github.io/&lt;/a&gt; on Apr 30, 2018&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post is a note to self about my first steps in the path for learning to use Docker. I started deploying an asp.net core web api in a container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker (&lt;a href="https://docs.docker.com/docker-for-windows/install/" rel="noopener noreferrer"&gt;Windows&lt;/a&gt;, &lt;a href="https://docs.docker.com/docker-for-mac/install/" rel="noopener noreferrer"&gt;Mac&lt;/a&gt;, &lt;a href="https://docs.docker.com/toolbox/overview/" rel="noopener noreferrer"&gt;Docker Toolbox&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;ASP.NET Core 2.0 SDK (&lt;a href="https://www.microsoft.com/net/download/windows" rel="noopener noreferrer"&gt;Here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building a web api with asp.net 2.0
&lt;/h2&gt;

&lt;p&gt;I created a simple todo list web api following this tutorial: &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.1" rel="noopener noreferrer"&gt;Create a Web API with ASP.NET Core and Visual Studio for Windows&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In order to be able to test the web api without any specific client I added the &lt;a href="https://swagger.io/" rel="noopener noreferrer"&gt;Swagger&lt;/a&gt; support to the project using &lt;a href="https://github.com/RSuter/NSwag" rel="noopener noreferrer"&gt;NSwag&lt;/a&gt; package.&lt;/p&gt;

&lt;p&gt;I accomplished this task following this tutorial: &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-nswag?view=aspnetcore-2.1" rel="noopener noreferrer"&gt;Get started with NSwag and ASP.NET Core&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The NSwag project provides tools to generate Swagger specifications from existing ASP.NET Web API controllers and provide an embedded &lt;a href="https://swagger.io/swagger-ui/" rel="noopener noreferrer"&gt;Swagger UI&lt;/a&gt; to interact with the web api. &lt;/p&gt;

&lt;p&gt;The resulting project is &lt;a href="https://github.com/kingsor/TodoCoreWebApi" rel="noopener noreferrer"&gt;TodoCoreWebApi&lt;/a&gt; hosted on GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a Dockerfile
&lt;/h2&gt;

&lt;p&gt;The following is the Dockerfile for building the docker image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;microsoft/dotnet:2.0-sdk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build-env&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# copy csproj and restore as distinct layers&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; ./TodoCoreWebApi/*.csproj ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;dotnet restore

&lt;span class="c"&gt;# copy everything else and build&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; ./TodoCoreWebApi/. ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;dotnet publish &lt;span class="nt"&gt;-c&lt;/span&gt; Release &lt;span class="nt"&gt;-o&lt;/span&gt; out /p:PublishWithAspNetCoreTargetManifest&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;

&lt;span class="c"&gt;# build runtime image&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; microsoft/dotnet:2.0-runtime&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build-env /app/out .&lt;/span&gt;
&lt;span class="c"&gt;# not valid for Heroku&lt;/span&gt;
&lt;span class="c"&gt;# ENTRYPOINT ["dotnet", "TodoCoreWebApi.dll"]&lt;/span&gt;
&lt;span class="c"&gt;# this is working&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ASPNETCORE_URLS="http://*:$PORT" dotnet TodoCoreWebApi.dll&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To understand the ins and out of building a Docker image I followed this tutorial: &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images" rel="noopener noreferrer"&gt;Building Docker Images for .NET Core Applications&lt;/a&gt;. I used the &lt;a href="https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/Dockerfile" rel="noopener noreferrer"&gt;Dockerfile&lt;/a&gt; from the &lt;a href="https://github.com/dotnet/dotnet-docker/tree/master/samples/aspnetapp" rel="noopener noreferrer"&gt;aspnetsample&lt;/a&gt; project available on the &lt;a href="https://github.com/dotnet/dotnet-docker/tree/master/samples" rel="noopener noreferrer"&gt;.NET Core Docker Samples&lt;/a&gt; repository on GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Docker image
&lt;/h2&gt;

&lt;p&gt;In the root of the project (where the Dockerfile is located) run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; todo-core-webapi &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the build process is completed you can run the image with this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;--name&lt;/span&gt; TodoCoreWebApi todo-core-webapi

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And test the web api at &lt;code&gt;http://localhost:8080&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pushing the image to DockerHub
&lt;/h2&gt;

&lt;p&gt;First, you need to &lt;a href="https://docs.docker.com/docker-id/#register-for-a-docker-id" rel="noopener noreferrer"&gt;register for a Docker ID&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After that you can &lt;a href="https://docs.docker.com/docker-hub/repos/#creating-a-new-repository-on-docker-hub" rel="noopener noreferrer"&gt;create a new repository on DockerHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My Docker ID is &lt;a href="https://hub.docker.com/u/neetpiq/" rel="noopener noreferrer"&gt;neetpiq&lt;/a&gt; and the repository for the image I generated is &lt;a href="https://hub.docker.com/r/neetpiq/todo-core-webapi/" rel="noopener noreferrer"&gt;neetpiq/todo-core-webapi&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, I need to tag my image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag todo-core-webapi neetpiq/todo-core-webapi:1.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag todo-core-webapi neetpiq/todo-core-webapi:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, I can push the new version of my image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push neetpiq/todo-core-webapi:1.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push neetpiq/todo-core-webapi:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you may test this web api application image (latest) running this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;--name&lt;/span&gt; TodoCoreWebApi neetpiq/todo-core-webapi

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or if you want a specific version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;--name&lt;/span&gt; TodoCoreWebApi neetpiq/todo-core-webapi:1.2

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Windows Users
&lt;/h3&gt;

&lt;p&gt;If you are using boot2docker on Windows (&lt;a href="https://docs.docker.com/toolbox/overview/" rel="noopener noreferrer"&gt;Docker Toolbox&lt;/a&gt;), please note the following:&lt;/p&gt;

&lt;p&gt;The Linux VM in the boot2docker VirtualBox maps the c/Users directory in the VM instance to the C:\Users folder in Windows. So be sure your source code for your worker is in a folder under C:\Users, then cd to that folder in the context of the VM (in Boot2Docker terminal) and run it from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images" rel="noopener noreferrer"&gt;Building Docker Images for .NET Core Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/dotnet-docker/blob/master/samples/dotnetapp/push-image-to-dockerhub.md" rel="noopener noreferrer"&gt;Push Docker Images to Docker Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/dotnet-docker/tree/master/samples/aspnetapp" rel="noopener noreferrer"&gt;ASP.NET Core Docker Production Sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.devcenter.co/deploy-asp-net-core-2-0-apps-on-heroku-eea8efd918b6" rel="noopener noreferrer"&gt;Deploy asp.net core 2.0 apps on Heroku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/docker-hub/repos/#pushing-a-repository-image-to-docker-hub" rel="noopener noreferrer"&gt;Pushing a repository image to Docker Hub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aspnetcore</category>
      <category>csharp</category>
      <category>docker</category>
      <category>webapi</category>
    </item>
  </channel>
</rss>
