This tutorial shows how to run an ASP.NET Core app in Docker containers.
In this tutorial, you:
> [!div class="checklist"]
> * Learn about Microsoft .NET Core Docker images
> * Download an ASP.NET Core sample app
> * Run the sample app locally
> * Run the sample app in Linux containers
> * Run the sample app in Windows containers
> * Build and deploy manually
## ASP.NET Core Docker images
For this tutorial, you download an ASP.NET Core sample app and run it in Docker containers. The sample works with both Linux and Windows containers.
The sample Dockerfile uses the [Docker multi-stage build feature](https://docs.docker.com/engine/userguide/eng-image/multistage-build/) to build and run in different containers. The build and run containers are created from images that are provided in Docker Hub by Microsoft:
*`dotnet/core/sdk`
The sample uses this image for building the app. The image contains the .NET Core SDK, which includes the Command Line Tools (CLI). The image is optimized for local development, debugging, and unit testing. The tools installed for development and compilation make this a relatively large image.
*`dotnet/core/aspnet`
The sample uses this image for running the app. The image contains the ASP.NET Core runtime and libraries and is optimized for running apps in production. Designed for speed of deployment and app startup, the image is relatively small, so network performance from Docker Registry to Docker host is optimized. Only the binaries and content needed to run an app are copied to the container. The contents are ready to run, enabling the fastest time from `Docker run` to app startup. Dynamic code compilation isn't needed in the Docker model.
* Copy the container IPv4 address (for example, 172.29.245.43) and paste into the browser address bar to test the app.
## Build and deploy manually
In some scenarios, you might want to deploy an app to a container by copying to it the application files that are needed at run time. This section shows how to deploy manually.
* Navigate to the project folder at *dotnet-docker/samples/aspnetapp/aspnetapp*.
* Run the [dotnet publish](https://docs.microsoft.com/dotnet/core/tools/dotnet-publish.md) command:
```console
dotnet publish -c Release -o published
```
The command arguments:
* Build the application in release mode (the default is debug mode).
* Create the files in the *published* folder.
* Run the application.
* Windows:
```console
dotnet published\aspnetapp.dll
```
* Linux:
```bash
dotnet published/aspnetapp.dll
```
* Browse to `http://localhost:5000` to see the home page.
### The Dockerfile
Here's the Dockerfile used by the `docker build` command you ran earlier. It uses `dotnet publish` the same way you did in this section to build and deploy.
```console
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
The Git repository that contains the sample app also includes documentation. For an overview of the resources available in the repository, see [the README file](https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/README.md). In particular, learn how to implement HTTPS:
> [Developing ASP.NET Core Applications with Docker over HTTPS](https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/aspnetcore-docker-https-development.md)