Docker with CodingSoldier
First way:
FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "CodingSoldier.dll"]
bjohns@671201519NB001 MINGW64 /c/users/bjohns/source/repos/CodingSoldier/CodingSoldier
$ docker build -t codingsoldierwebapp .
bjohns@671201519NB001 MINGW64 /c/users/bjohns/source/repos/CodingSoldier/CodingSoldier
$ docker run -d -p 8080:2350 --name myapp codingsoldierwebapp
Second Way
FROM microsoft/aspnetcore
COPY ./bin/Debug/netcoreapp2.0/publish .
ENTRYPOINT ["dotnet", "CodingSoldier.dll"]
$ docker build -t myapp .
$ docker run -d -p 8000:80 myapp
Docker with CodingSoldier and Nginx in the same container
Reference:https://www.sep.com/sep-blog/2017/02/24/nginx-reverse-proxy-to-asp-net-core-same-container/
DockerFile content:
#aspnet core build image
FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
#aspnet core runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
#nginx install
RUN apt-get update
RUN apt-get install -y nginx
#copy startup.sh with correct permissions
COPY ./startup.sh .
RUN chmod 755 /app/startup.sh
#copy nginx.conf
RUN rm /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx
#expose 2350 - aspnet core site will listen on this port
#expose 80 - nginx will listen on this port.
#Both ports are internal to the container.
#While running the image, port mapping need to be mentioned: $ docker run -p 8080:80 codingsoldier-with-nginx
EXPOSE 2350 80
#copying output of "build-env" from "/app/out" to "."
COPY --from=build-env /app/out .
CMD ["sh", "/app/startup.sh"]
#Docker Commands:
#$ docker build -t codingsoldier-with-nginx .
#$ docker run -p 8080:80 codingsoldier-with-nginx
nginx.conf content:
worker_processes 4;
events { worker_connections 1024; }
http {
sendfile on;
upstream app_servers {
server 127.0.0.1:2350;
}
server {
listen 80;
location / {
proxy_pass http://app_servers;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}
startup.sh content:
#!/bin/bash
service nginx start
dotnet /app/CodingSoldier.dll
Beware of CRLF issues in startup.sh and nginx.conf files. Better to create them using vim in Linux itself instead of copy pasting from Windows environment.
After creating the image, we can publish it to docker repository:
$ export DOCKER_ID_USER="bnyjohns"
$ docker login
$ docker tag codingsoldier-with-nginx $DOCKER_ID_USER/codingsoldier-with-nginx
$ docker push $DOCKER_ID_USER/codingsoldier-with-nginx
The image gets pushed to docker repository. Then we can pull and run in any machine.
$ docker pull bnyjohns/codingsoldier-with-nginx:latest
$ docker run -p 8080:80 codingsoldier-with-nginx
Docker with CodingSoldier and Nginx in the different containers using Docker Compose
Reference: https://www.sep.com/sep-blog/2017/02/27/nginx-reverse-proxy-to-asp-net-core-separate-docker-containers/
docker-compose.yml content:
version: '3'
services:
website:
build:
context: .
dockerfile: Dockerfile
environment:
- ASPNETCORE_ENVIRONMENT=Production
expose:
- "2350"
reverseproxy:
build:
context: .
dockerfile: NginxDockerfile
links:
- website
ports:
- "8080:80"
DockerFile content
#aspnet core build image
FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app
#Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
#Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
#aspnet core runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
EXPOSE 2350
#copying output of "build-env" from "/app/out" to "."
COPY --from=build-env /app/out .
CMD ["dotnet", "/app/CodingSoldier.dll"]
Nginx.conf content:
worker_processes 4;
events { worker_connections 1024; }
http {
sendfile on;
upstream app_servers {
server website:2350;
}
server {
listen 80;
location / {
proxy_pass http://app_servers;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}
$ docker-compose build
$ docker-compose up
bjohns@671201519NB001 MINGW64 /c/GitRepositories/codingsoldier_aspnetcore_versio
n2/CodingSoldier (master)
$ docker-compose up
Starting codingsoldier_website_1 ...
Starting codingsoldier_website_1 ... done
Starting codingsoldier_reverseproxy_1 ...
Starting codingsoldier_reverseproxy_1 ... done
Attaching to codingsoldier_website_1, codingsoldier_reverseproxy_1
Now 2 containers are running. We can connect to those containers if we want to.
It is easy: $ docker exec -it codingsoldier_reverseproxy_1 bash
Now we are inside the container.