DEV Community

Cover image for Documentation on my success to deploy web application to a featured Kubernetes environment.
Mokhutso Manaswe
Mokhutso Manaswe

Posted on

Documentation on my success to deploy web application to a featured Kubernetes environment.

Prerequisites

  • Download and Install Docker
  • Download and install Docker desktop
  • IDE (Visual Studio Code)
  • Sign-up to Docker Hub
  • Install compose plugin

Get app

  • Cloned node.js todo wep app github

Build the app’s container image

  • In the app directory created a Dockerfile
  • Added the folowing content to the Dockerfile [image]
  • Build the container image docker build -t sca-project
  • Started the app container docker run -dp 3000:3000 sa-project
  • Opened web browser to localhost to see the app

localhost3000

Share application

  • Created docker repository [image] on Docker Hub docker-repo
  • Docker login -u my_username
  • docker tag sca-project my_username/sca-project
  • docker push my_username/sca-project

Persist the database

  • docker volume create todo-db
  • docker run -dp 3000:3000 –mount type-volume, src=todo-db,target=/etc/todos sa-project
  • Got to see my list being stored
  • docker volume inspect todo-db

Run app in a development container with a bind mount

docker run -dp 3000:3000 \
    -w /app --mount type=bind,src="$(pwd)",target=/app \
    node:18-alpine \
    sh -c "yarn install && yarn run dev"
Enter fullscreen mode Exit fullscreen mode
docker run -dp 3000:3000 `
    -w /app --mount "type=bind,src=$pwd,target=/app" `
    node:18-alpine `
    sh -c "yarn install && yarn run dev"
Enter fullscreen mode Exit fullscreen mode
  • docker logs -f <container-id>
  • Make changes to app.js , save file (restarts the app inside the container automatically)
  • Refresh the pages and saw my changes being reflected almost immediately

Multi container apps

- docker network create todo-app

docker run -d \
     --network todo-app --network-alias mysql \
     -v todo-mysql-data:/var/lib/mysql \
     -e MYSQL_ROOT_PASSWORD=secret \
     -e MYSQL_DATABASE=todos \
     mysql:8.0
Enter fullscreen mode Exit fullscreen mode
  • docker exec -it <my-sql-container-id> myqsl -u root -p
  • Into mysql shell -> show databases; (don’t forget the semi-colons or else nothing will be displayed)
  • Exit the mysql shell

Connect mysql

- docker network create todo-app

docker run -d `
     --network todo-app --network-alias mysql `
     -v todo-mysql-data:/var/lib/mysql `
     -e MYSQL_ROOT_PASSWORD=secret `
     -e MYSQL_DATABASE=todos `
     mysql:8.0
Enter fullscreen mode Exit fullscreen mode
  • Docker logs -f <container-id>
  • docker exec -it <my-sql-container-id> myqsl -p todos

mysql

  • Into mysql shell -> select * from todos_items
  • Exit the mysql shell

    Docker compose

  • docker compose version

  • In the root folder created docker-compose.yml

  • Insert into docker-compose.yml file

services:
Enter fullscreen mode Exit fullscreen mode

Define the app service

  • docker-compose.yml file should look like:
services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:
Enter fullscreen mode Exit fullscreen mode

Run the application stack

  • docker compose up -d
  • See the app stack in docker desktop dashboard

    Describe apps using kubernetes yaml

  • Create deployment.yaml in the app root folder

  • Fill deploment.yaml with this code

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bb-demo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      bb: web
  template:
    metadata:
      labels:
        bb: web
    spec:
      containers:
      - name: bb-site
        image: getting-started
        imagePullPolicy: Never
---
apiVersion: v1
kind: Service
metadata:
  name: bb-entrypoint
  namespace: default
spec:
  type: NodePort
  selector:
    bb: web
  ports:
  - port: 3000
    targetPort: 3000
    nodePort: 30002
Enter fullscreen mode Exit fullscreen mode

Create and monitor deployment

  • Enabled Kubernetes on Docker Desktop setting
  • Kubectl apply -f deplyment.yaml
  • Kubectl rollout status deployment/app-deployment

deploy

  • Now can access the app with the yaml configuration nodePort :30002

30002

  • Kubectl get deployments -> view pods configured by yaml file]
  • Kubectl get pods
  • Kubectl get services
  • Kubectl describe deploments

monitor

Scale deployment

  • Kubectl scale deployment/app-deployment –replicas=3
  • Horizontal pod autoscaling
  • Kubectl autoscale deployment/app-deployment –min=3 –max–10 –cpu-percentage=80

scaling

Top comments (0)