Skip to content

Latest commit

 

History

History
53 lines (34 loc) · 3.37 KB

docker.md

File metadata and controls

53 lines (34 loc) · 3.37 KB

Purpose: Streamlining Development and Deployment with Docker

The docker folder is essential for building and managing Docker images for our Node.js Express application. Dockerization offers significant benefits:

  • Effortless Portability: Docker images bundle our application with its dependencies, ensuring consistent execution in any environment (development, testing, production).
  • Guaranteed Reproducibility: Our application's behavior remains the same regardless of the host environment, simplifying debugging and deployment.
  • Scalability Made Easy: Docker containers make it straightforward to scale up or down our application instances to meet changing demand.
  • Enhanced Isolation: Containers prevent conflicts between our application and other software or dependencies, promoting stability.

Key Files

  • Dockerfile: The blueprint for building our application's Docker image.
  • dev.env (Optional): Stores development-specific environment variables, kept separate from version control.
  • docker-compose.yml (Optional): Defines how multiple containers (our application, database, etc.) interact when running locally with Docker Compose.

Inside the Dockerfile

The Dockerfile outlines the steps to construct our Docker image:

  1. Choosing a Base Image: We typically start with a lightweight Node.js image (e.g., node:18-alpine).
  2. Setting the Work Directory: This is where our application code will live within the container.
  3. Installing Dependencies: We copy package.json and use npm install to fetch necessary packages.
  4. Copying Application Code: We transfer our source code from the src folder into the container.
  5. Setting Environment Variables (Optional): Production environment variables may be defined within the Dockerfile or provided during container creation.
  6. Exposing Ports: We indicate which ports our application listens on (e.g., EXPOSE 3000).
  7. Defining the Start Command: This tells Docker how to initiate our application within the container (e.g., CMD ["npm", "start"]).

Building and Deploying

We build the image with docker build -t my-app:latest . (with our chosen image name). Authentication with docker login and the docker push command facilitate deployment to a registry like ECR.

Hot Reloading for Rapid Development

Key Technique: Volume Mounting

During development, we can mount our local src folder directly into the Docker container. This creates a two-way synchronization between the host filesystem and the container environment. With this setup, Nodemon (or a similar tool) will automatically detect changes within the mounted src folder and trigger a restart of our application.

Benefits:

  • Faster Iteration: Code changes are reflected near-instantly, eliminating the need to rebuild the Docker image for each small adjustment.
  • Seamless Workflow: This promotes a fluid development experience, keeping you focused on coding rather than repetitive image rebuild cycles.

How to Implement (in docker-compose.yml)

Under our application service within docker-compose.yml, add a volumes section like this:

volumes:
  - ./src:/app  # Maps the local 'src' folder to '/app' inside the container

Important Note: Ensure that Nodemon or your chosen hot reloading tool is installed as a development dependency within your project.