Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,98 @@ docker build -t mern-backend .

`docker compose up -d`

## Learnings from dockerizing a MERN stack web application
### **1. Dockerizing a MERN Stack Application**
#### Dockerfiles:
->Created separate Dockerfile for the frontend and backend to define the build process and runtime configurations.

->Specified appropriate base images (e.g., node for frontend/backend, mongo for database).

->Defined commands to install dependencies, build the application, and set the working directory.

->Used .dockerignore to exclude unnecessary files, improving build efficiency.

#### Environment Variables:

->Managed sensitive data like database connection strings using .env files and passed them securely in docker-compose.yaml.

### **2. Networking with Bridge Type**
#### Bridge Networking:
->Configured the Docker network of type bridge to allow communication between containers.

->Ensured the frontend and backend containers could resolve the database container hostname using Docker's internal DNS.

### **3. Using docker-compose.yaml**
#### Service Definition:

->Defined three services in docker-compose.yaml:

**frontend:** To serve the React app.

**backend:** To handle API logic.

**database:** To manage MongoDB data.

->Specified image build contexts pointing to respective directories with their Dockerfile.

#### Networking Configuration:

->Used networks in docker-compose.yaml to link the three services under the same bridge network.

#### Volume Management:

->Mounted volumes for hot-reloading during development.

->Persisted MongoDB data using Docker volumes to ensure data remains after container restarts.

#### Port Mapping:

->Exposed necessary ports to the host machine for frontend (e.g., 5713), backend (e.g., 5050), and database (e.g., 27017).

### 4. **Simplified Multi-Container Management**
#### Building and Running:

->Used docker-compose up to build and start all services simultaneously, reducing complexity.

->Managed logs for all containers in one terminal for easier debugging.

#### Dependency Management:

->Specified service dependencies in docker-compose.yaml to ensure containers start in the correct order (e.g., backend waits for the database).

### **5. Debugging and Optimization**

->Identified issues with inter-container communication by checking logs and connectivity.

->Optimized Dockerfiles to reduce image size (e.g., using multi-stage builds for production).

->Verified that the app worked in both development and production environments.

### **6. Benefits of Containerization**

#### Consistency:

->Ensured that the application runs identically across different environments (development, staging, production).

#### Portability:

->Deployed the entire stack as a set of containers, enabling quick migration across platforms.

### **7. Future Enhancements**

->Automated builds and deployments using CI/CD pipelines with Docker.

->Implemented advanced networking configurations, such as custom subnets or overlay networks, for more complex setups.