DEV Community

Mohamed_Yahya
Mohamed_Yahya

Posted on

Docker for Backend Developers: From "It Works on My Machine" to Production

๐ˆ๐ง๐ญ๐ซ๐จ๐๐ฎ๐œ๐ญ๐ข๐จ๐ง

Imagine you've spent several days building a backend application. Everything works perfectly on your local machine. Your APIs respond correctly, the database connection is stable, and every feature behaves exactly as expected.

Confident in your work, you deploy the application to a server or ask a teammate to run it on their machine. Suddenly, nothing works.

The application fails to start.

Dependencies are missing.

The Node.js version is different.

Environment variables are not configured correctly.

The database connection fails.

Then comes the most common sentence in software development:

"But it works on my machine."

If you've ever encountered this problem, you're not alone. Every backend developer faces this challenge at some point. As applications grow and teams expand, maintaining a consistent development environment becomes increasingly difficult.

This is exactly the problem Docker was designed to solve.

Docker allows developers to package an application along with all of its dependencies, libraries, runtime, and configuration into a lightweight, portable container. Whether the application runs on your laptop, your teammate's computer, a testing server, or a production environment, Docker helps ensure that it behaves consistently across all environments.

In this article, we'll explore Docker from a backend developer's perspective. We'll understand why Docker was created, how it works, the difference between images and containers, how to write your first Dockerfile, how Docker Compose simplifies multi-container applications, and how Docker helps us deploy backend applications reliably in production.

By the end of this guide, you'll have a solid understanding of Docker's core concepts and learn how it solves one of the most common problems in modern backend development.


๐“๐ก๐ž "๐ˆ๐ญ ๐–๐จ๐ซ๐ค๐ฌ ๐จ๐ง ๐Œ๐ฒ ๐Œ๐š๐œ๐ก๐ข๐ง๐ž" ๐๐ซ๐จ๐›๐ฅ๐ž๐ฆ

Before learning Docker, let's understand the problem it was designed to solve.

Imagine you've built a backend application using Node.js, Express.js, and PostgreSQL. Everything works perfectly on your laptop, so you push the code to GitHub and ask your teammate to run it.

A few minutes later, they reply:

"The project isn't working."

You answer:

"But it works on my machine."

This happens because the code is the same, but the environment isn't.

Small differences such as:

  • Different Node.js versions
  • Missing dependencies
  • Missing environment variables
  • Different operating systems
  • Different database versions

can cause the exact same application to behave differently.

As projects grow and teams become larger, managing these differences manually becomes difficult.

Docker solves this problem by packaging the application, its dependencies, runtime, and configuration into a portable container. As long as Docker is installed, the application behaves consistentlyโ€”whether it's running on your laptop, a teammate's computer, or a production server.

๐Ÿ’ก๐Š๐ž๐ฒ ๐“๐š๐ค๐ž๐š๐ฐ๐š๐ฒ: Docker eliminates environment-related issues by ensuring your application runs the same way everywhere.


๐–๐ก๐š๐ญ ๐ข๐ฌ ๐ƒ๐จ๐œ๐ค๐ž๐ซ?

Now that we understand the problem, let's understand the solution.

๐ƒ๐จ๐œ๐ค๐ž๐ซ is an open-source platform that allows developers to package an application along with everything it needs to runโ€”such as the runtime, libraries, dependencies, configuration files, and environment variablesโ€”into a lightweight, portable unit called a ๐œ๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ

Instead of manually configuring every machine, Docker ensures that the same application runs consistently across different environments.

Think of Docker as a ๐ฌ๐ญ๐š๐ง๐๐š๐ซ๐๐ข๐ณ๐ž๐ ๐ฉ๐š๐œ๐ค๐š๐ ๐ž for your application.

No matter where you run itโ€”your laptop, your teammate's computer, a testing server, or a production serverโ€”the application behaves the same way because everything it needs is already included inside the container.

This consistency is one of the biggest reasons Docker has become an essential tool in modern backend development.

๐Ÿ’ก๐Š๐ž๐ฒ ๐“๐š๐ค๐ž๐š๐ฐ๐š๐ฒ: Docker packages your application and everything it depends on into a portable container, allowing it to run consistently across different environments.

๐ƒ๐ข๐ ๐˜๐จ๐ฎ ๐Š๐ง๐จ๐ฐ? : Companies like ๐€๐ฆ๐š๐ณ๐จ๐ง, ๐†๐จ๐จ๐ ๐ฅ๐ž, ๐Œ๐ข๐œ๐ซ๐จ๐ฌ๐จ๐Ÿ๐ญ, ๐๐ž๐ญ๐Ÿ๐ฅ๐ข๐ฑ, and many startups use Docker as part of their software development and deployment workflows.


๐–๐ก๐ฒ ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐–๐š๐ฌ ๐‚๐ซ๐ž๐š๐ญ๐ž๐

Before Docker, setting up a development environment was often a time-consuming and frustrating process.

Developers had to manually install programming languages, databases, libraries, and other dependencies on every machine. Even a small difference in software versions or system configuration could cause an application to behave differently.

As projects became larger and development teams grew, these environment-related issues became more frequent. Developers were spending valuable time fixing setup problems instead of building new features.

Docker was created to solve this challenge.

Its goal was simple: ๐›๐ฎ๐ข๐ฅ๐ ๐จ๐ง๐œ๐ž, ๐ซ๐ฎ๐ง ๐š๐ง๐ฒ๐ฐ๐ก๐ž๐ซ๐ž.

Instead of asking every developer to recreate the same environment manually, Docker packages the application and everything it needs into a ๐œ๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ. This container can then be shared and run consistently across development, testing, and production environments.

By standardizing the application's environment, Docker makes development faster, deployment more reliable, and collaboration much easier.

๐Ÿ’ก๐Š๐ž๐ฒ ๐“๐š๐ค๐ž๐š๐ฐ๐š๐ฒ: Docker was created to eliminate environment inconsistencies, making applications easier to build, share, and deploy across different machines.


๐Ÿš€ ๐–๐ก๐š๐ญ'๐ฌ ๐๐ž๐ฑ๐ญ?

We've explored why Docker was created to solve environment-related problems.

But another important question remains:

๐ˆ๐Ÿ ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐š๐ง๐ ๐•๐ข๐ซ๐ญ๐ฎ๐š๐ฅ ๐Œ๐š๐œ๐ก๐ข๐ง๐ž๐ฌ ๐›๐จ๐ญ๐ก ๐ฉ๐ซ๐จ๐ฏ๐ข๐๐ž ๐ข๐ฌ๐จ๐ฅ๐š๐ญ๐ž๐ ๐ž๐ง๐ฏ๐ข๐ซ๐จ๐ง๐ฆ๐ž๐ง๐ญ๐ฌ, ๐ฐ๐ก๐š๐ญ ๐ฆ๐š๐ค๐ž๐ฌ ๐ญ๐ก๐ž๐ฆ ๐๐ข๐Ÿ๐Ÿ๐ž๐ซ๐ž๐ง๐ญ?

Let's find out.


๐•๐ข๐ซ๐ญ๐ฎ๐š๐ฅ ๐Œ๐š๐œ๐ก๐ข๐ง๐ž๐ฌ ๐ฏ๐ฌ ๐ƒ๐จ๐œ๐ค๐ž๐ซ

At first glance, ๐•๐ข๐ซ๐ญ๐ฎ๐š๐ฅ ๐Œ๐š๐œ๐ก๐ข๐ง๐ž๐ฌ (๐•๐Œ๐ฌ) and ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐‚๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ๐ฌ may seem similar because both provide isolated environments for running applications. However, they work in fundamentally different ways.

A ๐•๐ข๐ซ๐ญ๐ฎ๐š๐ฅ ๐Œ๐š๐œ๐ก๐ข๐ง๐ž virtualizes the entire hardware and runs a complete ๐†๐ฎ๐ž๐ฌ๐ญ ๐Ž๐ฉ๐ž๐ซ๐š๐ญ๐ข๐ง๐  ๐’๐ฒ๐ฌ๐ญ๐ž๐ฆ for each virtual machine. Every VM has its own operating system, required libraries, dependencies, and application.

In contrast, ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐‚๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ๐ฌ share the ๐‡๐จ๐ฌ๐ญ ๐Ž๐ฉ๐ž๐ซ๐š๐ญ๐ข๐ง๐  ๐’๐ฒ๐ฌ๐ญ๐ž๐ฆ'๐ฌ ๐Š๐ž๐ซ๐ง๐ž๐ฅ. Instead of running a separate operating system for every application, Docker packages only the application and its required dependencies into a container.

Because containers don't need a full operating system, they are significantly lighter, consume fewer resources, and start much faster than Virtual Machines.

Although both technologies have their own advantages, the right choice depends on your requirements.

๐Ÿ’ก๐Š๐ž๐ฒ ๐“๐š๐ค๐ž๐š๐ฐ๐š๐ฒ : Virtual Machines virtualize an entire operating system, whereas Docker containers share the host operating system's kernel. This makes Docker lightweight, portable, and an excellent choice for modern application development.


๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐€๐ซ๐œ๐ก๐ข๐ญ๐ž๐œ๐ญ๐ฎ๐ซ๐ž

Understanding Docker becomes much easier once you know how its core components work together.

Instead of thinking of Docker as a single tool, think of it as a collection of components that communicate with each other to build, manage, and run containers.

The following diagram provides a high-level overview of how Docker's core components work together.

Docker Architecture Diagram

High-level overview of Docker Architecture and the interaction between Docker CLI, Docker Engine, Docker Objects, and Containers.

As shown in the diagram, a developer interacts with Docker through the ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐‚๐‹๐ˆ, which communicates with the ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐„๐ง๐ ๐ข๐ง๐ž. The Docker Engine manages ๐ˆ๐ฆ๐š๐ ๐ž๐ฌ, ๐œ๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ๐ฌ, ๐ง๐ž๐ญ๐ฐ๐จ๐ซ๐ค๐ฌ, and ๐ฏ๐จ๐ฅ๐ฎ๐ฆ๐ž๐ฌ, allowing applications to run consistently across different environments.

Don't worry if every component isn't completely clear yet. In the next sections, we'll explore each one individually, starting with one of Docker's most fundamental building blocks: ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐ˆ๐ฆ๐š๐ ๐ž๐ฌ.


๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐ˆ๐ฆ๐š๐ ๐ž

A Docker Image is a read-only template that contains everything needed to run an application, including the code, runtime, dependencies, libraries, and configuration.

Docker Image Workflow Diagram

The diagram above illustrates the structure of a ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐ˆ๐ฆ๐š๐ ๐ž and how it fits into the Docker workflow.

A Docker Image is a ๐ซ๐ž๐š๐-๐จ๐ง๐ฅ๐ฒ ๐ญ๐ž๐ฆ๐ฉ๐ฅ๐š๐ญ๐ž that contains everything an application needs to run, including the application code, runtime, dependencies, libraries, and configuration files.

Instead of configuring each environment manually, developers build a Docker Image once and use it to create one or more Docker Containers. Because every container starts from the same image, the application behaves consistently across different machines.

In simple terms, a Docker Image acts as the ๐›๐ฅ๐ฎ๐ž๐ฉ๐ซ๐ข๐ง๐ญ for creating Docker Containers.

๐€ ๐‘๐ž๐š๐ฅ-๐–๐จ๐ซ๐ฅ๐ ๐€๐ง๐š๐ฅ๐จ๐ ๐ฒ

Think of a ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐ˆ๐ฆ๐š๐ ๐ž as a recipe for baking a cake.

The recipe contains all the ingredients and instructions needed to bake the cake, but it isn't the cake itself.

Every time you follow the recipe, you create a new cake.

Similarly, a Docker Image is the blueprint, and every Docker Container created from it is a running instance of that blueprint.


๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐‚๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ๐ฌ

A Docker Image by itself cannot execute an application. To actually run your application, Docker creates a ๐‚๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ from that image.

A Docker Container is an isolated runtime environment that packages your application along with everything it needs to run consistently, regardless of where it is deployed.

The following diagram illustrates how Docker Images are transformed into running Docker Containers.

Docker Container Workflow Diagram

The diagram above shows the complete lifecycle of a Docker Container.

Everything starts with a ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐ˆ๐ฆ๐š๐ ๐ž, which acts as a read-only blueprint containing the application code, runtime, dependencies, libraries, and configuration.

When the docker run command is executed, Docker creates a new ๐‚๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ from that image. Unlike the image, a container is a ๐ซ๐ฎ๐ง๐ง๐ข๐ง๐  ๐ข๐ง๐ฌ๐ญ๐š๐ง๐œ๐ž with its own isolated environment, processes, memory, network configuration, and writable layer.

One of Docker's biggest advantages is that a single Docker Image can be used to create multiple independent containers. Although these containers share the same image and host operating system kernel, each one runs in isolation, ensuring that changes inside one container do not affect the others.

This lightweight architecture allows applications to start quickly while maintaining consistency across development, testing, and production environments.


๐ƒ๐จ๐œ๐ค๐ž๐ซ๐Ÿ๐ข๐ฅ๐ž

Creating Docker Images manually would be time-consuming and error-prone. Instead, Docker uses a special text file called a ๐ƒ๐จ๐œ๐ค๐ž๐ซ๐Ÿ๐ข๐ฅ๐ž that defines every step required to build an image.

A Dockerfile allows developers to package their application, dependencies, runtime, configuration, and startup commands into a single, repeatable process.

Some of the most commonly used Dockerfile instructions are:

  • ๐…๐‘๐Ž๐Œ โ€“ Specifies the base image.
  • ๐–๐Ž๐‘๐Š๐ƒ๐ˆ๐‘ โ€“ Sets the working directory inside the container.
  • ๐‚๐Ž๐๐˜ โ€“ Copies application files into the image.
  • ๐‘๐”๐ โ€“ Executes commands while building the image.
  • ๐„๐—๐๐Ž๐’๐„ โ€“ Specifies the port used by the application.
  • ๐‚๐Œ๐ƒ โ€“ Defines the command that starts the application.

Using Dockerfiles offers several advantages:

  • Automates image creation.
  • Eliminates manual setup.
  • Ensures consistent builds.
  • Makes applications portable.
  • Supports version control.
  • Simplifies deployment.

๐Ÿ’ก๐Š๐ž๐ฒ ๐“๐š๐ค๐ž๐š๐ฐ๐š๐ฒ : A Dockerfile is a blueprint for building Docker Images. By defining every step in a single file, developers can create consistent, portable, and reproducible images with minimal effort.


๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐‚๐จ๐ฆ๐ฉ๐จ๐ฌ๐ž

Docker Compose is a tool that helps you define and manage multi-container Docker applications.

Instead of running several docker run commands, you describe all your application's services in a single ๐๐จ๐œ๐ค๐ž๐ซ-๐œ๐จ๐ฆ๐ฉ๐จ๐ฌ๐ž.๐ฒ๐ฆ๐ฅ file.

Docker Compose then creates the required containers, networks, and other resources automatically.

๐–๐ก๐ฒ ๐ƒ๐จ ๐–๐ž ๐๐ž๐ž๐ ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐‚๐จ๐ฆ๐ฉ๐จ๐ฌ๐ž?

Imagine you're developing a backend application that requires:

  • A Node.js API
  • A PostgreSQL database
  • A Redis cache

Without Docker Compose, you would need to start each container separately and manually configure their networking and dependencies.

Docker Compose simplifies this entire process by managing everything from one configuration file.

๐‚๐จ๐ฆ๐ฆ๐จ๐ง ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐‚๐จ๐ฆ๐ฉ๐จ๐ฌ๐ž ๐‚๐จ๐ฆ๐ฆ๐š๐ง๐๐ฌ:

Here are some commonly used Docker Compose commands:

# Start all services
docker compose up

# Start services in the background
docker compose up -d

# Stop all services
docker compose down

# View running containers
docker compose ps

# View logs
docker compose logs
Enter fullscreen mode Exit fullscreen mode

๐Ÿ’ก ๐Š๐ž๐ฒ ๐“๐š๐ค๐ž๐š๐ฐ๐š๐ฒ : Docker Compose makes it easy to manage multi-container applications. By defining all services in a single ๐๐จ๐œ๐ค๐ž๐ซ-๐œ๐จ๐ฆ๐ฉ๐จ๐ฌ๐ž.๐ฒ๐ฆ๐ฅ file, developers can start, stop, and manage their entire application stack using just a few simple commands.


๐ƒ๐จ๐œ๐ค๐ž๐ซ๐ข๐ณ๐ข๐ง๐  ๐š ๐๐จ๐๐ž.๐ฃ๐ฌ ๐๐š๐œ๐ค๐ž๐ง๐

Understanding Docker concepts is important, but the real value comes from applying them to an actual project.

In this section, we'll see how a Node.js backend application can be packaged into a Docker Image and executed inside a Docker Container. This is the same workflow used by many modern development teams to ensure applications run consistently across different environments.

The following diagram illustrates the complete Dockerization process.

Dockerizing a Node.js Backend Workflow

The diagram above shows the complete journey of a Node.js backend application.

Everything begins with the application source code, which includes the project files, dependencies, and a Dockerfile. When the ๐๐จ๐œ๐ค๐ž๐ซ ๐›๐ฎ๐ข๐ฅ๐ command is executed, Docker reads the Dockerfile and creates a reusable Docker Image.

Next, the ๐๐จ๐œ๐ค๐ž๐ซ ๐ซ๐ฎ๐ง command starts a new Docker Container from that image. The container provides an isolated environment where the Node.js application runs independently of the host system.

Finally, users can access the running application through the mapped port, just as they would with a locally running server. Because the application and its dependencies are packaged together, it behaves consistently on any machine with Docker installed.

๐Ÿ’ก๐Š๐ž๐ฒ ๐“๐š๐ค๐ž๐š๐ฐ๐š๐ฒ : Dockerizing a Node.js backend transforms your application into a portable, reproducible, and production-ready package. By combining a Dockerfile, Docker Image, and Docker Container, you can build once and run consistently across development, testing, and production environments.


๐‚๐จ๐ฆ๐ฆ๐จ๐ง ๐๐ž๐ ๐ข๐ง๐ง๐ž๐ซ ๐Œ๐ข๐ฌ๐ญ๐š๐ค๐ž๐ฌ

Learning Docker is an exciting step, but it's common for beginners to make a few mistakes along the way. Understanding these mistakes early will help you build cleaner, more secure, and more efficient Docker applications.

๐Ÿ. ๐…๐จ๐ซ๐ ๐ž๐ญ๐ญ๐ข๐ง๐  ๐ญ๐จ ๐‚๐ซ๐ž๐š๐ญ๐ž ๐š .๐๐จ๐œ๐ค๐ž๐ซ๐ข๐ ๐ง๐จ๐ซ๐ž ๐…๐ข๐ฅ๐ž

Without a .dockerignore file, unnecessary files such as node_modules, logs, and Git metadata may be copied into the Docker Image.

โœ… ๐๐ž๐ฌ๐ญ ๐๐ซ๐š๐œ๐ญ๐ข๐œ๐ž: Always create a .dockerignore file to keep your images clean and lightweight.


๐Ÿ. ๐”๐ฌ๐ข๐ง๐  ๐‹๐š๐ซ๐ ๐ž ๐๐š๐ฌ๐ž ๐ˆ๐ฆ๐š๐ ๐ž๐ฌ

Large base images increase build time, consume more storage, and make deployments slower.

โœ… ๐๐ž๐ฌ๐ญ ๐๐ซ๐š๐œ๐ญ๐ข๐œ๐ž: Use lightweight base images whenever possible, such as Alpine-based images.


๐Ÿ‘. ๐‡๐š๐ซ๐๐œ๐จ๐๐ข๐ง๐  ๐’๐ž๐œ๐ซ๐ž๐ญ๐ฌ

Never store passwords, API keys, or database credentials directly in your Dockerfile or source code.

โœ… ๐๐ž๐ฌ๐ญ ๐๐ซ๐š๐œ๐ญ๐ข๐œ๐ž: Store sensitive information using environment variables or a .env file.


๐Ÿ’. ๐‘๐ฎ๐ง๐ง๐ข๐ง๐  ๐‚๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ๐ฌ ๐š๐ฌ ๐ญ๐ก๐ž ๐‘๐จ๐จ๐ญ ๐”๐ฌ๐ž๐ซ

Running containers with root privileges can introduce unnecessary security risks.

โœ… ๐๐ž๐ฌ๐ญ ๐๐ซ๐š๐œ๐ญ๐ข๐œ๐ž: Create and use a non-root user whenever possible.


๐Ÿ“. ๐ˆ๐ ๐ง๐จ๐ซ๐ข๐ง๐  ๐‚๐จ๐ง๐ญ๐š๐ข๐ง๐ž๐ซ ๐‹๐จ๐ ๐ฌ

Many beginners restart containers immediately when something goes wrong instead of checking the logs.

โœ… ๐๐ž๐ฌ๐ญ ๐๐ซ๐š๐œ๐ญ๐ข๐œ๐ž: Use the docker logs command to identify and troubleshoot issues.


๐Ÿ”. ๐‚๐ซ๐ž๐š๐ญ๐ข๐ง๐  ๐‹๐š๐ซ๐ ๐ž ๐ƒ๐จ๐œ๐ค๐ž๐ซ ๐ˆ๐ฆ๐š๐ ๐ž๐ฌ

Installing unnecessary packages or copying unnecessary files results in larger images that are slower to build and deploy.

โœ… ๐๐ž๐ฌ๐ญ ๐๐ซ๐š๐œ๐ญ๐ข๐œ๐ž: Keep your Docker Images as small as possible by including only what your application needs.


๐Ÿ’ก ๐Š๐ž๐ฒ ๐“๐š๐ค๐ž๐š๐ฐ๐š๐ฒ : Most Docker problems beginners face are caused by small configuration mistakes rather than Docker itself. By following these best practices, you'll build cleaner, more secure, and more reliable containerized applications from the very beginning.


๐‚๐จ๐ง๐œ๐ฅ๐ฎ๐ฌ๐ข๐จ๐ง

Docker has transformed the way modern applications are developed, tested, and deployed. By packaging an application along with its dependencies into a lightweight container, Docker eliminates environment-related issues and ensures consistent behavior across different systems.

In this guide, we explored the core concepts of Docker, including Docker Images, Containers, Dockerfiles, Docker Compose, and the process of Dockerizing a real Node.js backend application. We also covered essential Docker commands and common beginner mistakes to help you build a strong foundation.

Learning Docker is an important step for every backend developer, but it's only the beginning. As you continue your journey, you'll discover more advanced topics such as container orchestration with Kubernetes, CI/CD pipelines, cloud deployments, and production monitoring.

The best way to master Docker is through practice. Build small projects, experiment with different Docker features, and gradually apply what you've learned to real-world applications. With consistent practice, Docker will become an essential part of your daily development workflow.

Thank you for reading! I hope this guide has helped you understand Docker more clearly and given you the confidence to start containerizing your own applications.

Happy Learning and Happy Dockerizing! ๐Ÿš€๐Ÿณ


๐‘๐ž๐Ÿ๐ž๐ซ๐ž๐ง๐œ๐ž๐ฌ


If you found this article helpful, consider:

โญ Leaving a reaction if you enjoyed it.

๐Ÿ’ฌ Sharing your thoughts or questions in the comments.

๐Ÿ”– Saving this article for future reference.

Happy Coding! ๐Ÿš€

Top comments (0)