Back to Blogs
Docker
Docker for Dummies - Part 1

Practical Docker: Step-by-Step Container Creation and Execution

January 15, 2024
10 min read
Atharva Unde

Learn Docker from scratch with a hands-on guide to creating and running your first container. Perfect for beginners looking to understand containerization.

Running your software in containers, whether it's a website, an app, or even your database, is becoming increasingly important. Docker is a powerful tool for this, and a crucial part of it is the Dockerfile.

Think of a Dockerfile as a recipe for building a Docker image. It's a simple text file that lists all the steps needed to create a complete, self-contained package (the image) of your application. This includes installing necessary software, setting up your environment, and copying over your code. Docker reads this recipe and automatically builds the image, ensuring everything is prepared exactly the way you want it.

Why all this effort? Repeatable results are critical in DevOps. A Dockerfile ensures that every time you build your image, you get the exact same, reliable outcome. It eliminates the "it works on my machine" problem by providing a consistent environment.

Understanding the Dockerfile

Let's start with a fundamental Dockerfile example for a Node.js application:

Dockerfile
FROM node:latest
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]

Breaking Down Each Instruction

FROM node:latest

Uses Node.js as the base image. The base image provides the foundation - in this case, it includes Node.js and npm pre-installed.

WORKDIR /app

Sets /app as the working directory inside the container. All subsequent commands will run from this location.

COPY package*.json ./

Copies package.json and package-lock.json files for dependency installation. This is done separately to leverage Docker's caching mechanism.

RUN npm install

Installs the application's dependencies. This command runs during the build process.

COPY . .

Copies your entire project files into the /app directory in the container.

EXPOSE 3000

Documents that the application uses port 3000. This is informational and doesn't actually publish the port.

CMD ["node", "index.js"]

Specifies the command to run when the container starts. This starts your Node.js application.

Building Your Docker Image

Once you have your Dockerfile, navigate to your project folder and run:

Build Command
docker build -t my-node-app .
  • -t my-node-app: Tags your image with a name for easy reference
  • The . specifies the build context (current directory)

Docker will download the Node.js base image (if not present) and execute each Dockerfile instruction to assemble your application into an image.

Running Your Container

Start a container from your built image:

Run Command
docker run -d -p 3000:3000 --name my-running-app my-node-app
  • -d: Runs the container in detached mode (background)
  • -p 3000:3000: Maps host port 3000 to container port 3000
  • --name my-running-app: Names your container for easy management

Visit localhost:3000 in your browser to see your running application!

Managing Your Containers

Essential commands for container management:

Container Management
# List containers
docker ps

# Stop a container
docker stop my-running-app

# Restart
docker start my-running-app

# Remove
docker rm my-running-app

Pro Tip

Use docker ps -a to see all containers, including stopped ones. This helps track which containers are consuming resources.

Why Use Docker?

  • Consistency: Same environment everywhere - development, testing, production
  • Isolation: Each container runs independently without conflicts
  • Portability: Runs on any system with Docker installed
  • Efficiency: Lightweight compared to traditional virtual machines

Next Steps

This is just the beginning! In the next articles of this series, we'll explore:

  • Understanding compressed vs uncompressed Docker image sizes
  • Choosing the right base images for smaller containers
  • Using Dockerfile labels for better organization
  • Optimizing with layers, caching, and multi-stage builds

Stay tuned for more practical Docker guides!