All the files needed to build the container and compose can be found in the DatingApp repository.
Install Docker CE
Official installation guide
sudo apt update
sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/debian \
  $(lsb_release -cs) \
  stable"
sudo apt update
sudo apt install docker-ceVerify the installation by running the hello-world container
sudo docker run hello-worldConfigure Docker to be run by a non root user
sudo groupadd docker
sudo usermod -aG docker $USERLog out and log back in, then test running hello-world without sudo (on my machine this step required a full restart)
docker run hello-worldExtension
There is a good extension for vscode named Docker from peterjausovec.vscode-docker
Publish the application
cd DatingApp.API
dotnet publish -c Release --output buildDockerfile
The image microsoft/dotnet:runtime is for running an application in production. There is also an image for building and testing using Docker, but I will not use that here.
In the root folder of DatingApp.API create a new file Dockerfile
FROM microsoft/dotnet:2.1-aspnetcore-runtime
WORKDIR /app
COPY ./bin/Release/netcoreapp2.1/publish/. ./
ENTRYPOINT ["dotnet", "DatingApp.API.dll"]Create the image (this will take a few minutes the first time it is run)
docker build -t teo/datingapp:runtime .Run the image (this step will fail because there is no MySql)
docker run -it --rm -p 5001:80 --name datingapp_production teo/datingapp:runtimeInstall Docker Compose
To run DatingApp we need a database.
To orchestrate two Docker containers, one for dotnet and one for MySql, we use Docker Compose.
On Windows and Osx Compose is already installed with Docker.
Official installation guide
Check the latest Compose version on the compose releases
# Download compose (use the latest version)
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-composeTest the installation.
$ docker-compose --versionPrepare the database script
export ASPNETCORE_ENVIRONMENT=Production
dotnet ef migrations script --output "_MySql_Init_Script/generate_datingapp_db.sql"Add Compose to DatingApp
Our compose will use a database container using MySql version 5.7 (I had some problems with version 8)
Then configure the environment of the dotnet container to use a connection string to the new db.
Create a file docker-compose.yml
version: '3.0'
services:
  datingdb:
    image: mysql:5.7
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: 1
      MYSQL_DATABASE: datingappschema
      MYSQL_USER: datingappuser
      MYSQL_PASSWORD: password
    volumes:
      - dbdata:/var/lib/mysql
      - ./_MySql_Init_Script:/docker-entrypoint-initdb.d
  datingapp:
    depends_on:
      - datingdb
    image: teo/datingapp:runtime
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ConnectionStrings__DatingDbConnection=Server=datingdb;Database=datingappschema;Uid=datingappuser;Pwd=password;
    env_file: ./datingapp.env
    build:
      context: .
    ports:
      - '8080:80'
volumes:
  dbdata:Create an evironment file to store secrets parameters
cp datingapp_example.env datingapp.envOpen datingapp.env (it is in gitignore to avoid publishing) and insert the correct values
# JWT toke secret
AppSettings__TokenSecret="tokensecretforproduction"
# Cloudinary
CloudinarySettings__CloudName="name"
CloudinarySettings__ApiKey="key"
CloudinarySettings__ApiSecret="secret"Run compose (the first run is a bit slow)
docker-compose up
# to force rebuild
docker-compose up --buildTest the application.
Stop compose
docker-compose down
# Stop and remove all volumes
docker-compose down -v