Skip to content

Latest commit

 

History

History

docker

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Containers & Docker

This covers the building of the app as Docker images and running as containers, using Docker Compose and and pushing into Azure Container Registry (ACR).

Docker Images for Node.js Implementation

The Dockerfiles for both services are based on Alpine Linux and Node.js v10, the Dockerfiles are in the corresponding node services directories. There are two Docker images, one for each micro service:

The frontend Dockerfile is multi-stage and will also carry out the Vue.js build process and integrate the output with the frontend server, without needing to separately build/bundle the Vue.js app

Azure Container Registry

It is assumed that you will want to store the images in Azure Container Registry (ACR) rather than a public repo (i.e. Dockerhub). Therefore as a pre-req, create and set-up an ACR instance using the guide below, if you have an existing ACR instance, you can simply re-use it.


Option 1 - Build Images Using ACR Tasks

This option does not require you to have Docker installed and running locally or access to any sort of Docker host. Images will be built directly in Azure using a feature of Azure Container Registry called 'ACR Tasks'.

You will require the Azure CLI installed (either in Windows/PowerShell or WSL/Bash), and ensure the version is at least v2.0.50

In the bash command snippet below modify the myAcrName parameter to match the name of ACR instance you have setup or are using, and modify myAcrResGroup to the resource group it resides in

Run from the root of this repo/project:

# Build data API
az acr build --registry myAcrName -g myAcrResGroup --file node/data-api/Dockerfile --image smilr/data-api https://github.com/benc-uk/smilr.git

# Build frontend
az acr build --registry myAcrName -g myAcrResGroup --file node/frontend/Dockerfile --image smilr/frontend https://github.com/benc-uk/smilr.git

Note. If you are working from a local git clone of the repo, you can switch the URL of the GitHub repo for a local file path, such as . if working inside the root of the project


Option 2 - Build Images Using Local Docker

This options require that you have Docker installed and functional on you location machine

Option 2a - Building Manually

If you want to build the images individually with docker build, rather than using Docker Compose, you can do so. When running the command ensure the build context set to the root of the project, and point to the Dockerfile. E.g. from the root of the project run the commands:

docker build . -f /node/data-api/Dockerfile -t changeme
docker build . -f /node/frontend/Dockerfile -t changeme

You can then run or push the images as you see fit

Option 2b - Docker Compose

Docker Compose allows us to simplify the building and running of the two images, so a docker-compose.yml file has been created.
The compose file is relatively simple, so even if you are unfamiliar with Docker Compose, I recommend taking a look at it. Some notes:

  • The compose file is setup to build and tag the images (see the build section)
  • The Smilr frontend, Smilr data API and MonogDB services are defined
  • The Smilr containers will expose their default ports (3000 and 4000), you can map these to something else (with the syntax <external_port>:<container_port>)
  • MongoDB will expose port 27017 externally. Note this is only to allow the demoData helper script to be run against it
  • The Smilr data API and MonogDB containers will internally communicate via a network called smilr-net
  • Volumes will be created to persist the MongoDB data

This might sound quite complex but in most cases you can ignore what the file does and just run docker-compose build and/or docker-compose up

Docker Compose - Building Images

To build both the Smilr images simply run the following:

cd docker
docker-compose build

This will build the images and by default, tag them as:

  • smilr/data-api
  • smilr/frontend

💬 Note. There is no build required for the MongoDB image, as we use the official mongo image from Dockerhub

IMPORTANT! Registry Prefix

In order to help tagging the images with your registry/repo prefix, you can set the DOCKER_REG env variable which prefixed in front of the images. When pushing to ACR this should hold the name of the ACR instance with a trailing slash, e.g. myregistry.azurecr.io/. If not using ACR, you can pick any prefix you like.

It is strongly suggested you set DOCKER_REG using a .env file. There is a sample file provided in the docker folder which can be copied & renamed. A .env file is automatically picked up when you run docker-compose

Fully tagged images with registry prefix:

  • myregistry.azurecr.io/smilr/data-api
  • myregistry.azurecr.io/smilr/frontend

Docker Compose - Running Containers

To run all containers and stand up a complete local running instance of Smilr, simply run:

cd docker
docker-compose up

This will start the containers and the MonogDB database, you will see a bunch of the console output as the services start. To run detached and not tie up your terminal, run with docker-compose up -d

You can then access the Smilr app UI at http://localhost:3000 and the API at http://localhost:4000/api

Docker Compose - Push to ACR

If you've tagged your images with an ACR prefix as described above, simply run

cd docker
docker-compose push

This will push the latest images to the registry.


Windows Containers

💬 Note. It is strongly advised not to use Windows Containers.

Windows Containers are currently in a state of flux and running them locally on Windows 10 is extremely problematic on numerous fronts. The use of Windows Containers has not been fully tested. Proceed at your own risk.

Docker build files for creating Windows containers are provided, with the filename windows.Dockerfile.

These Dockerfiles use the Node on Windows base images from Stefan Scherer. They currently use Windows Server 2019 Nanoserver 1809 (SAC) as the base in order to be compatible with AKS and Azure Container Instances