/CodeWithDanDockerServices

Demonstration of using Docker and/or Kubernetes to orchestrate multiple services

Primary LanguageJavaScriptMIT LicenseMIT

Docker Services Orchestration Demonstration (Kubernetes Orchestration demo also available)

This is a demo application from the Docker for Web Developers course on Pluralsight that demonstrates how multiple services can be integrated and orchestrated using Docker and Docker Compose.

  1. Install Docker Desktop for Mac or Docker CE for Windows from https://docker.com and the lastest LTS version of Node.js from https://nodejs.org.

  2. Set the environment variables in your command window.

    export APP_ENV=development

    export DOCKER_ACCT=codewithdan

    NOTE: For the Windows DOS command shell use set instead of export. For Windows Powershell use $env:APP_ENV = "value".

  3. Run npm install to install the Node.js dependencies for the project (when running containers in development mode since a volume is defined docker-compose.yml file)

  4. Run docker-compose build

  5. Run docker-compose up

  6. Visit http://localhost in a browser

  7. Live long and prosper

Note for Docker Toolbox Users

If you're on Docker Toolbox rather than Docker CE you may get an nginx gateway error when going to http://localhost. This is due to "localhost" being used as the server name in .docker/config/nginx.development.conf (that works for Docker Desktop - the latest version - but not for Docker Toolbox). Comment out the existing "server_name" property and uncomment the one mentioned for Docker Toolbox in the .docker/config/nginx.development.conf file.

To run in Kubernetes with Docker Desktop

  1. Enable Kubernetes in Docker Desktop.

    Note: You MUST have Docker Desktop for this particular demo to work or another local Kubernetes option such as Minikube.

  2. Do a production Docker Compose build (see docker-compose.yml for instructions on doing the build) to create the local images. Ensure that you set APP_ENV=production as mentioned in the compose file.

  3. Open a command-prompt at the root of the project

  4. Run the following to add the database passwords as secrets (yes - these are simple passwords for the demo :-)):

    kubectl create secret generic db-passwords --from-literal=db-password='password' --from-literal=db-root-password='password'

    Note: password is being used here purely to keep things very simple for the demo. Use strong passwords for a "real" setup!!!!

  5. Run kubectl create -f .k8s to create the Kubernetes Services, Deployments, Pods, etc.

  6. Once the deployments are applied several pods will be created.

  7. Open the browser and go to http://localhost. Read note below.

NOTE: You'll need to wait since it'll take a little bit for the DB to start up. Once the Pods are ready you should see data in the app (hit refresh if needed).

  1. When you're done run kubectl delete -f .k8s to delete the Kubernetes resources.

Local Storage Hostname Volume

NOTE: The local storage hostname volume is commented out in the .k8s/mongo.deployment.yml StatefulSet because MongoDB doesn't support that type of volume correctly on Docker for Windows. It does work on Mac/Linux. You'd need to create a /tmp/data/db directory and then uncomment the volumes and volumeMounts properties (and sub-properties) in the StatefulSet to actually use the volume on Mac/Linux.

Load Balancer versus Port Forwarding

This demo includes a LoadBalancer service for the nginx Pod which is why you can hit http://localhost. To expose a specific port for localhost for the nginx Pod, get the name of the nginx pod by running kubectl get pods and use the pod name in the following command:

sudo kubectl port-forward [name-of-nginx-pod] 8080:80

Note that sudo is needed to enable port 80 in this case on Mac. You can choose a different port as well such as 8081:80.