Using Docker with Orchard Core¶
Our source code repository includes a Dockerfile
which will allow you to create your own Docker images and containers. It can be quite useful for Orchard Core developers when needing to test PR's. It allows them to deploy locally quickly some testing environments. Here my examples will be shown for that context. Docker can also be used for more complex usage (ex: production deployment) but this documentation doesn't aim to explain that in detail. For more advanced examples I strongly suggest reading docker
and docker-compose
documentation.
Alternately, for those using a Nuget package solution ; you can copy directly the Dockerfile and .dockerignore file from the source code to the root folder of your solution to do the same kind of thing. Though, it might get tricky depending if you did not use the same folder structure than the source code solution.
What you will need¶
For Windows users : https://docs.microsoft.com/en-us/windows/wsl/tutorials/wsl-containers
For Ubuntu/Linux users : https://docs.docker.com/engine/install/ubuntu/
What you will build¶
You will build Docker images and containers from command shell using docker
and docker-compose
commands. Images are built from Orchard Core source code targeting a specific OS. Then we can deploy "containers" from them. This allow you to see how Orchard Core respond in different environments or also deploy Orchard Core on a production server eventually.
Dockerfile¶
The Dockerfile that is provided in the Orchard Core source code is using an intermediate image to build Orchard Core in a specific environment which contains the .NET SDK. Then we create the "real" image by using only the ASP.NET core runtime.
# Create an intermediate image using .NET Core SDK
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
LABEL stage=build-env
WORKDIR /app
# Copy and build in the intermediate image
COPY ./src /app
RUN dotnet publish /app/OrchardCore.Cms.Web -c Release -o ./build/release
# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
EXPOSE 80
ENV ASPNETCORE_URLS http://+:80
WORKDIR /app
COPY --from=build-env /app/build/release .
ENTRYPOINT ["dotnet", "OrchardCore.Cms.Web.dll"]
Dockerignore file ".dockerignore"¶
# ignore all
**
# Except src for building
!./src/*
# Ignore any App_Data folder
**/App_Data/
# Ignore all prebuild
**/[b|B]in/
**/[O|o]bj/
Docker¶
First example is a simple one. Use Docker to build an image and run it (inside a container).
REM Folder where the Dockerfile stands
cd /orchardcore
REM Build image from Dockerfile
docker build -t oc .
REM Creates a container, runs it and expose its service on port 80
docker run -p 80:80 oc
Prune intermediate images¶
When using docker
command¶
REM Prunes intermediate containers created while building by using --rm
docker build -t oc --rm .
REM Prunes all intermediate images
docker image prune -f --filter label=stage=build-env
REM Creates a container, runs it and expose its service on port 80
docker run -p 80:80 oc
Using these commands should get you a fully functional Docker container running on port 80 so that you can access it with your browser by simply going to http://localhost. Though, we assume that this will only allow you to use SQLite. In order to avoid needing to install anything directly on your Docker host computer and to get everything running quickly you should use docker-compose
.
Docker compose¶
Docker Compose will allow you to generate multiple containers locally by doing simply docker-compose up
command in the root folder of Orchard Core source code. Of course it requires that you have a docker-compose.yml file standing in that folder first. In the example shown below, we will create services for each of the database providers Orchard Core "officially supports".
docker-compose.yml file example :
version: '3.3'
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "5009:80"
depends_on:
- sqlserver
- mysql
- postgresql
sqlserver:
image: "mcr.microsoft.com/mssql/server"
environment:
SA_PASSWORD: "P@ssw0rd!123456"
ACCEPT_EULA: "Y"
mysql:
image: mysql:latest
restart: always
environment:
MYSQL_DATABASE: 'orchardcore_database'
MYSQL_USER: 'orchardcore_user'
MYSQL_PASSWORD: 'orchardcore_password'
MYSQL_ROOT_PASSWORD: 'root_password'
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- mysql-data:/var/lib/mysql
postgresql:
image: postgres:latest
volumes:
- postgresql-data:/var/lib/postgresql/data
ports:
- 5432:5432
environment:
POSTGRES_USER: orchardcore_user
POSTGRES_PASSWORD: orchardcore_password
POSTGRES_DB: orchardcore_database
volumes:
mysql-data:
postgresql-data:
Prune intermediate images¶
When using docker-compose
command¶
REM Builds images if they are not already built
docker-compose build
REM Prune intermediate remaining images
docker image prune -f --filter label=stage=build-env
REM Start all containers
docker-compose up
We added some commands examples to prune intermediate images because our Dockerfile
uses an intermediate image to do a dotnet publish
of our source code. If you don't prune your intermediate images ; over time it can certainly take some significant amount of disk space. We label those intermediate images with stage=build-env
so that they can be pruned easily.
Create tenants automatically (Autosetup feature)¶
TODO
See :
How can I run my Orchard Core Docker containers over HTTPS?¶
Hosting ASP.NET Core Images with Docker over HTTPS
How can I target my Docker images against a specific environment?¶
Here you can find a list of different environments with a Dockerfile example for each of them.
.NET Core SDK
ASP.NET Core Runtime
Why does Orchard Core source code uses a different Dockerfile?¶
Dockerfile-CI, Dockerfile-CI.gitignore¶
Github Actions is the Continuous Integration tool we use to build and test the different branches we have in our repository. It can allow us to create Docker images and containers but building Orchard Core on them would be slower than on the actual CI. So, for that matter, we don't use an intermediate image for building on the CI. Though, it perfectly makes sense to do this locally for yourself as performance should not be limited at all.
Can I use different Dockerfiles for myself?¶
You need to use at least Docker version 19.03 to be able to use Docker Buildkit so that it can parse your different .dockerignore files.
See :
Build images with BuildKit
What is Docker BuildKit and What can I use it for?
Github Actions currently supports Buildkit under Linux only.
See :
https://github.com/docker/setup-buildx-action#limitation
https://github.com/OrchardCMS/OrchardCore/issues/7651