{"id":828,"date":"2024-07-23T10:03:08","date_gmt":"2024-07-23T10:03:08","guid":{"rendered":"https:\/\/blog.200oksolutions.com\/?p=828"},"modified":"2026-10-23T07:01:12","modified_gmt":"2026-10-23T07:01:12","slug":"containerization-with-docker-and-kubernetes","status":"publish","type":"post","link":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes\/","title":{"rendered":"Containerization with Docker and Kubernetes"},"content":{"rendered":"\n<figure class=\"wp-block-video\"><video height=\"1080\" style=\"aspect-ratio: 1920 \/ 1080;\" width=\"1920\" controls src=\"https:\/\/200oksolutions.com\/blog\/wp-content\/uploads\/2024\/07\/Mastering-Containerization_-Docker-and-Kubernetes-Explained-in-60-Seconds-landscape.mp4\"><\/video><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Docker packages an application and everything it needs into a container. Kubernetes runs and manages many of those containers across machines.<\/strong> In this tutorial you will build a small Node.js app, package it with Docker, deploy it to a local Kubernetes cluster, scale it, update it and roll it back. No cloud account is needed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you need:<\/strong> Docker Desktop (or Docker Engine), Node.js (current LTS), kubectl, and kind (or minikube). Allow about 30 minutes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What Is Containerization?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Containerization packages an application with its code, runtime, libraries and configuration into one isolated unit called a container. Because the container carries its own dependencies, it behaves the same on a laptop, a CI server or a cloud VM. That removes the classic \u201cit works on my machine\u201d problem and makes builds, tests and releases more predictable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Containers are not virtual machines. A virtual machine includes a full guest operating system. A container shares the host\u2019s kernel, so it is much smaller, starts in seconds and lets you run more workloads on the same hardware.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th><\/th><th>Virtual machine<\/th><th>Container<\/th><\/tr><tr><td>Includes<\/td><td>Full guest OS<\/td><td>App and its dependencies only<\/td><\/tr><tr><td>Size<\/td><td>Gigabytes<\/td><td>Usually tens to hundreds of MB<\/td><\/tr><tr><td>Startup<\/td><td>Minutes<\/td><td>Seconds<\/td><\/tr><tr><td>Isolation<\/td><td>Strong (hardware level)<\/td><td>Process level, shares host kernel<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Docker vs Kubernetes: What Is the Difference?<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Docker and Kubernetes solve different problems, and most teams use both.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th><\/th><th>Docker<\/th><th>Kubernetes<\/th><\/tr><tr><td>Main job<\/td><td>Build images and run containers<\/td><td>Run and manage containers across a cluster<\/td><\/tr><tr><td>Scope<\/td><td>One machine<\/td><td>Many machines (nodes)<\/td><\/tr><tr><td>Scaling<\/td><td>Manual, or Compose on one host<\/td><td>Built in: replicas, autoscaling<\/td><\/tr><tr><td>Self-healing<\/td><td>Restart policies only<\/td><td>Replaces failed containers, reschedules on healthy nodes<\/td><\/tr><tr><td>Updates<\/td><td>Stop and start<\/td><td>Rolling updates and rollbacks<\/td><\/tr><tr><td>Typical use<\/td><td>Local development, CI builds<\/td><td>Production workloads<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In short, Docker builds and runs the container, and Kubernetes decides where containers run and keeps them healthy. One detail often confuses beginners: Kubernetes no longer uses Docker Engine as its runtime (it uses containerd or CRI-O), but images you build with Docker follow the OCI standard and run on Kubernetes unchanged.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 1: Create a Simple Node.js App<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a project folder and initialize it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir my-docker-app\ncd my-docker-app\nnpm init -y\nnpm install express<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create <code>app.js<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const express = require('express');\nconst app = express();\nconst port = process.env.PORT || 3000;\n\napp.get('\/', (req, res) =&gt; {\n  res.send('Hello, Docker and Kubernetes!');\n});\n\n\/\/ Used later by Kubernetes to check the app is ready\napp.get('\/health', (req, res) =&gt; {\n  res.status(200).send('ok');\n});\n\napp.listen(port, () =&gt; {\n  console.log(`App running on port ${port}`);\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In <code>package.json<\/code>, make sure the scripts section contains a start command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"scripts\": {\n  \"start\": \"node app.js\"\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run <code>npm start<\/code> and open <code>http:\/\/localhost:3000<\/code> to confirm it works, then stop it with Ctrl+C.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 2: Dockerize the App<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a file named <code>Dockerfile<\/code> (capital D, no extension):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Use a current LTS Node.js image. Check nodejs.org for the supported LTS line.\nFROM node:24-alpine\n\nWORKDIR \/app\n\n# Copy dependency files first so Docker can cache this layer\nCOPY package*.json .\/\nRUN npm ci --omit=dev\n\n# Copy the rest of the source code\nCOPY . .\n\nENV NODE_ENV=production\nEXPOSE 3000\n\n# Run as the unprivileged user that ships with the Node image\nUSER node\n\nCMD &#91;\"node\", \"app.js\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Why it is written this way:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>node:24-alpine<\/code><\/strong> is a small, maintained base image. Old tutorials use <code>node:14<\/code>, which reached end of life in 2023 and no longer receives security fixes.<\/li>\n\n\n\n<li><strong>Copying <code>package*.json<\/code> first<\/strong> lets Docker reuse the cached dependency layer when only your source code changes, which makes rebuilds much faster.<\/li>\n\n\n\n<li><strong><code>npm ci --omit=dev<\/code><\/strong> installs exact versions from <code>package-lock.json<\/code> and skips development packages.<\/li>\n\n\n\n<li><strong><code>USER node<\/code><\/strong> avoids running your app as root inside the container.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Create a <code>.dockerignore<\/code> file so you do not copy unnecessary files into the image:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node_modules\nnpm-debug.log\n.git\nDockerfile\n.dockerignore<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Build and run the image:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build -t my-node-app:1.0 .\ndocker run -d --name my-node-app -p 3000:3000 my-node-app:1.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Note the space and dot at the end of the build command: the dot tells Docker to use the current folder as the build context. Open <code>http:\/\/localhost:3000<\/code> and you should see the greeting from inside the container.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Useful commands while you work:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps                    # list running containers\ndocker logs my-node-app      # view app output\ndocker stop my-node-app      # stop the container\ndocker rm my-node-app        # remove it<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Stop and remove the container before moving on so port 3000 stays free.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Kubernetes Concepts You Need<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You only need four terms for this tutorial:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cluster:<\/strong> a set of machines (nodes) managed by Kubernetes.<\/li>\n\n\n\n<li><strong>Pod:<\/strong> the smallest deployable unit. It wraps one or more containers. Pods are disposable.<\/li>\n\n\n\n<li><strong>Deployment:<\/strong> declares how many copies (replicas) of a Pod should run and handles rolling updates.<\/li>\n\n\n\n<li><strong>Service:<\/strong> gives a group of Pods one stable address, because individual Pod IPs change.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You describe the state you want in YAML files, and Kubernetes works continuously to make reality match it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 3: Create a Local Kubernetes Cluster<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Install kind (Kubernetes in Docker) and kubectl, then create a cluster:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kind create cluster --name demo\nkubectl cluster-info --context kind-demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A kind cluster cannot see images in your local Docker, so load the image into it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kind load docker-image my-node-app:1.0 --name demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Using minikube instead? Run <code>minikube start<\/code>, then <code>minikube image load my-node-app:1.0<\/code>. Docker Desktop\u2019s built-in Kubernetes also works.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 4: Write the Deployment and Service<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create <code>deployment.yaml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: my-node-app\n  labels:\n    app: my-node-app\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: my-node-app\n  template:\n    metadata:\n      labels:\n        app: my-node-app\n    spec:\n      containers:\n        - name: my-node-app\n          image: my-node-app:1.0\n          imagePullPolicy: IfNotPresent\n          ports:\n            - containerPort: 3000\n          readinessProbe:\n            httpGet:\n              path: \/health\n              port: 3000\n            initialDelaySeconds: 3\n            periodSeconds: 5\n          resources:\n            requests:\n              cpu: 50m\n              memory: 64Mi\n            limits:\n              cpu: 250m\n              memory: 128Mi<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This asks Kubernetes for two replicas of your image. The readiness probe stops traffic from reaching a Pod until <code>\/health<\/code> responds, and the resource settings stop one container from starving the others.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create <code>service.yaml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: v1\nkind: Service\nmetadata:\n  name: my-node-app\nspec:\n  type: ClusterIP\n  selector:\n    app: my-node-app\n  ports:\n    - port: 80\n      targetPort: 3000<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The Service listens on port 80 and forwards to port 3000 on any Pod labeled <code>app: my-node-app<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 5: Deploy and Access the App<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Apply both files and check the result:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl apply -f deployment.yaml -f service.yaml\nkubectl get pods\nkubectl get service my-node-app<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wait until both Pods show <code>Running<\/code> and <code>READY 1\/1<\/code>. To reach the app from your machine, use <code>kubectl port-forward<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl port-forward service\/my-node-app 8080:80<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In a second terminal (or your browser), open <code>http:\/\/localhost:8080<\/code>. You are now reaching your containerized app through Kubernetes. Port-forwarding is a development convenience; in production you would expose the app through an Ingress or a LoadBalancer Service.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Step 6: Scale, Update and Roll Back<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scale up<\/strong> to four replicas and watch the new Pods appear:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl scale deployment my-node-app --replicas=4\nkubectl get pods<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Self-healing:<\/strong> delete a Pod with <code>kubectl delete pod &lt;pod-name&gt;<\/code> and run <code>kubectl get pods<\/code> again. The Deployment creates a replacement immediately.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Roll out an update:<\/strong> change the greeting in <code>app.js<\/code>, then build and load version 1.1 and switch the Deployment to it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build -t my-node-app:1.1 .\nkind load docker-image my-node-app:1.1 --name demo\nkubectl set image deployment\/my-node-app my-node-app=my-node-app:1.1\nkubectl rollout status deployment\/my-node-app<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes replaces Pods gradually, so the app stays available during the update.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Roll back<\/strong> if something is wrong:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl rollout undo deployment\/my-node-app<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Troubleshooting Common Problems<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Symptom<\/th><th>Likely cause<\/th><th>Fix<\/th><\/tr><tr><td><code>ImagePullBackOff<\/code> or <code>ErrImagePull<\/code><\/td><td>The cluster cannot find the image<\/td><td>Run <code>kind load docker-image<\/code> (or <code>minikube image load<\/code>) and check the tag matches the YAML<\/td><\/tr><tr><td><code>CrashLoopBackOff<\/code><\/td><td>The app exits on start<\/td><td>Run <code>kubectl logs &lt;pod-name&gt;<\/code> and fix the error shown<\/td><\/tr><tr><td>Pod stuck at <code>0\/1 Ready<\/code><\/td><td>Readiness probe failing<\/td><td>Confirm <code>\/health<\/code> returns 200 and the port matches <code>containerPort<\/code><\/td><\/tr><tr><td><code>port-forward<\/code> fails or drops<\/td><td>Port already in use, or Pod restarted<\/td><td>Pick another local port, then re-run the command<\/td><\/tr><tr><td>Page does not load on port 3000 in Docker<\/td><td>Port not published<\/td><td>Use <code>-p 3000:3000<\/code> and make sure the app listens on <code>0.0.0.0<\/code> or the default<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For anything else, <code>kubectl describe pod &lt;pod-name&gt;<\/code> shows events that usually explain the problem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Clean Up<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl delete -f deployment.yaml -f service.yaml\nkind delete cluster --name demo<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Best Practices Before You Go to Production<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pin image versions and avoid the <code>latest<\/code> tag.<\/li>\n\n\n\n<li>Keep images small with slim or alpine bases and multi-stage builds.<\/li>\n\n\n\n<li>Never bake secrets into images. Use Kubernetes Secrets or a secrets manager.<\/li>\n\n\n\n<li>Always set resource requests and limits, and add readiness and liveness probes.<\/li>\n\n\n\n<li>Scan images for vulnerabilities in CI and run containers as a non-root user.<\/li>\n\n\n\n<li>Store manifests in Git and deploy through a CI\/CD pipeline.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Frequently Asked Questions<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Q. Do I need Docker to use Kubernetes? <\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A.<\/strong> You need a way to build container images, and Docker is the most common choice. Kubernetes itself runs containers through containerd or CRI-O, not Docker Engine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Q. Is Kubernetes better than Docker? <\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A.<\/strong> They are not alternatives. Docker builds and runs containers; Kubernetes orchestrates them at scale. A single app on one server often needs only Docker (with Compose), while many services across several servers benefit from Kubernetes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Q. What is the difference between a container and a Pod? <\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A. <\/strong>A container is one running image. A Pod is the Kubernetes wrapper around one or more containers that share networking and storage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Q. Should I learn Docker or Kubernetes first? <\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A.<\/strong> Learn Docker first. Kubernetes assumes you already understand images, containers and ports.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Q. Why use <code>kubectl port-forward<\/code>? <\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A.<\/strong> It creates a temporary tunnel from your machine to a Pod or Service so you can test an app without exposing it publicly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Next Steps<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You have containerized an app and run it on Kubernetes with scaling, rolling updates and rollbacks. To go further, continue with <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes-2\/\">Part 2: Taking Your Docker Skills to the Next Level<\/a>, and browse our other <a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/www.200oksolutions.com\/blog\/category\/kubernetes\/\">Kubernetes articles<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your team needs help moving workloads to containers, designing a Kubernetes platform or setting up CI\/CD, see our <a href=\"https:\/\/www.200oksolutions.com\/services\/platform-engineering\" target=\"_blank\" rel=\"noreferrer noopener\">platform engineering and enterprise integration services<\/a> or <a href=\"https:\/\/www.200oksolutions.com\/contact\/\" target=\"_blank\" rel=\"noopener\">get in touch<\/a>.<\/p>\n\n\n<div class=\"is-default-size wp-block-site-logo\"><a href=\"https:\/\/www.200oksolutions.com\/blog\/\" class=\"custom-logo-link light-mode-logo\" rel=\"home\"><img fetchpriority=\"high\" decoding=\"async\" width=\"484\" height=\"191\" src=\"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2026\/01\/cropped-200ok_logo.png\" class=\"custom-logo\" alt=\"200OK Solutions Blog\" srcset=\"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2026\/01\/cropped-200ok_logo.png 484w, https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2026\/01\/cropped-200ok_logo-300x118.png 300w\" sizes=\"(max-width: 484px) 100vw, 484px\" \/><\/a><\/div>","protected":false},"excerpt":{"rendered":"<p>Docker packages an application and everything it needs into a container. Kubernetes runs and manages&hellip;<\/p>\n","protected":false},"author":5,"featured_media":5312,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[158],"tags":[162,36,166,159,168,161,160,169,165,167,164,163],"class_list":["post-828","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-backend","tag-application-deployment","tag-backend-development","tag-container-technology","tag-containerization","tag-containerization-with-docker-and-kubernetes","tag-devops","tag-docker","tag-docker-and-kubernetes","tag-docker-containers","tag-docker-tutorial","tag-node-js","tag-software-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Containerization with Docker and Kubernetes<\/title>\n<meta name=\"description\" content=\"Learn Docker and Kubernetes step by step. Containerize a Node.js app, deploy it to a local Kubernetes cluster, then scale and roll back.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Containerization with Docker and Kubernetes\" \/>\n<meta property=\"og:description\" content=\"Learn Docker and Kubernetes step by step. Containerize a Node.js app, deploy it to a local Kubernetes cluster, then scale and roll back.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes\/\" \/>\n<meta property=\"og:site_name\" content=\"200OK Solutions Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-23T10:03:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-23T07:01:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2024\/07\/How-to-Migrate-to-Cloud-Native-Architectures-Using-Microservices-1-2026-10-23T121945.092.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2240\" \/>\n\t<meta property=\"og:image:height\" content=\"1260\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Piyush Solanki\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Piyush Solanki\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Containerization with Docker and Kubernetes","description":"Learn Docker and Kubernetes step by step. Containerize a Node.js app, deploy it to a local Kubernetes cluster, then scale and roll back.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes\/","og_locale":"en_US","og_type":"article","og_title":"Containerization with Docker and Kubernetes","og_description":"Learn Docker and Kubernetes step by step. Containerize a Node.js app, deploy it to a local Kubernetes cluster, then scale and roll back.","og_url":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes\/","og_site_name":"200OK Solutions Blog","article_published_time":"2024-07-23T10:03:08+00:00","article_modified_time":"2026-10-23T07:01:12+00:00","og_image":[{"width":2240,"height":1260,"url":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2024\/07\/How-to-Migrate-to-Cloud-Native-Architectures-Using-Microservices-1-2026-10-23T121945.092.png","type":"image\/png"}],"author":"Piyush Solanki","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Piyush Solanki","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes#article","isPartOf":{"@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes\/"},"author":{"name":"Piyush Solanki","@id":"https:\/\/www.200oksolutions.com\/blog\/#\/schema\/person\/e07f6b8e3c9a90ce7b3b09427d26155e"},"headline":"Containerization with Docker and Kubernetes","datePublished":"2024-07-23T10:03:08+00:00","dateModified":"2026-10-23T07:01:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes\/"},"wordCount":1238,"publisher":{"@id":"https:\/\/www.200oksolutions.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes#primaryimage"},"thumbnailUrl":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2024\/07\/How-to-Migrate-to-Cloud-Native-Architectures-Using-Microservices-1-2026-10-23T121945.092.png","keywords":["Application Deployment","Backend Development","Container Technology","Containerization","Containerization with Docker and Kubernetes","DevOps","Docker","Docker and Kubernetes","Docker Containers","Docker Tutorial","Node.js","Software Development"],"articleSection":["Backend"],"inLanguage":"en-US"},{"@type":["WebPage","SearchResultsPage"],"@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes\/","url":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes","name":"Containerization with Docker and Kubernetes","isPartOf":{"@id":"https:\/\/www.200oksolutions.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes#primaryimage"},"image":{"@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes#primaryimage"},"thumbnailUrl":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2024\/07\/How-to-Migrate-to-Cloud-Native-Architectures-Using-Microservices-1-2026-10-23T121945.092.png","datePublished":"2024-07-23T10:03:08+00:00","dateModified":"2026-10-23T07:01:12+00:00","description":"Learn Docker and Kubernetes step by step. Containerize a Node.js app, deploy it to a local Kubernetes cluster, then scale and roll back.","breadcrumb":{"@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes#primaryimage","url":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2024\/07\/How-to-Migrate-to-Cloud-Native-Architectures-Using-Microservices-1-2026-10-23T121945.092.png","contentUrl":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2024\/07\/How-to-Migrate-to-Cloud-Native-Architectures-Using-Microservices-1-2026-10-23T121945.092.png","width":2240,"height":1260,"caption":"Containerization with Docker and Kubernetes for cloud native application development by 200OK Solutions."},{"@type":"BreadcrumbList","@id":"https:\/\/www.200oksolutions.com\/blog\/containerization-with-docker-and-kubernetes#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.200oksolutions.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Blog > Backend > Containerization with Docker and Kubernetes"}]},{"@type":"WebSite","@id":"https:\/\/www.200oksolutions.com\/blog\/#website","url":"https:\/\/www.200oksolutions.com\/blog\/","name":"Web Development, Software, and App Blog | 200OK Solutions","description":"","publisher":{"@id":"https:\/\/www.200oksolutions.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.200oksolutions.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.200oksolutions.com\/blog\/#organization","name":"200OK Solutions","url":"https:\/\/www.200oksolutions.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.200oksolutions.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2025\/09\/200ok_logo-CGzMrWDu.png","contentUrl":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2025\/09\/200ok_logo-CGzMrWDu.png","width":500,"height":191,"caption":"200OK Solutions"},"image":{"@id":"https:\/\/www.200oksolutions.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.instagram.com\/200ok_solutions\/"]},{"@type":"Person","@id":"https:\/\/www.200oksolutions.com\/blog\/#\/schema\/person\/e07f6b8e3c9a90ce7b3b09427d26155e","name":"Piyush Solanki","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.200oksolutions.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2026\/05\/cropped-piyush-solanki-96x96.jpg","contentUrl":"https:\/\/www.200oksolutions.com\/blog\/wp-content\/uploads\/2026\/05\/cropped-piyush-solanki-96x96.jpg","caption":"Piyush Solanki"},"description":"Piyush is a seasoned PHP Tech Lead with 10+ years of experience architecting and delivering scalable web and mobile backend solutions for global brands and fast-growing SMEs. He specializes in PHP, MySQL, CodeIgniter, WordPress, and custom API development, helping businesses modernize legacy systems and launch secure, high-performance digital products. He collaborates closely with mobile teams building Android &amp; iOS apps , developing RESTful APIs, cloud integrations, and secure payment systems using platforms like Stripe, AWS S3, and OTP\/SMS gateways. His work extends across CMS customization, microservices-ready backend architectures, and smooth product deployments across Linux and cloud-based environments. Piyush also has a strong understanding of modern front-end technologies such as React and TypeScript, enabling him to contribute to full-stack development workflows and advanced admin panels. With a successful delivery track record in the UK market and experience building digital products for sectors like finance, hospitality, retail, consulting, and food services, Piyush is passionate about helping SMEs scale technology teams, improve operational efficiency, and accelerate innovation through backend excellence and digital tools.","url":"https:\/\/www.200oksolutions.com\/blog\/author\/piyush\/"}]}},"_links":{"self":[{"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/posts\/828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=828"}],"version-history":[{"count":9,"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/posts\/828\/revisions"}],"predecessor-version":[{"id":5313,"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/posts\/828\/revisions\/5313"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/media\/5312"}],"wp:attachment":[{"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.200oksolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}