DEV Community

Aisalkyn Aidarova
Aisalkyn Aidarova

Posted on

Lab: Build, Run, and Debug a Basic Dockerized Node.js App

0) Prerequisites

  • Docker Desktop installed and running (whale icon in menu bar)
  • Terminal access on Mac

Verify Docker:

docker --version
Enter fullscreen mode Exit fullscreen mode

1) Create Project Folder

mkdir docker-basic
cd docker-basic
Enter fullscreen mode Exit fullscreen mode

2) Create Node App

Create app.js:

nano app.js
Enter fullscreen mode Exit fullscreen mode

Paste exactly:

const http = require("http");

const server = http.createServer((req, res) => {
  res.write("Hello DevOps from Docker!");
  res.end();
});

server.listen(3000, () => {
  console.log("Server running on port 3000");
});
Enter fullscreen mode Exit fullscreen mode

Save:

  • Ctrl + O, Enter
  • Ctrl + X

3) Create package.json

npm init -y
Enter fullscreen mode Exit fullscreen mode

Confirm it exists:

ls -la
Enter fullscreen mode Exit fullscreen mode

You should see:

  • app.js
  • package.json

4) Create Dockerfile

Create file named Dockerfile (no extension):

nano Dockerfile
Enter fullscreen mode Exit fullscreen mode

Paste:

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install --production

COPY . .

EXPOSE 3000

CMD ["node", "app.js"]
Enter fullscreen mode Exit fullscreen mode

Save:

  • Ctrl + O, Enter
  • Ctrl + X

5) Validate Files (Important)

Make sure Dockerfile content is NOT inside app.js.

echo "---- app.js ----"
cat app.js

echo "---- Dockerfile ----"
cat Dockerfile
Enter fullscreen mode Exit fullscreen mode

6) Build the Docker Image

docker build -t my-node-app:latest .
Enter fullscreen mode Exit fullscreen mode

Verify image:

docker images | head
Enter fullscreen mode Exit fullscreen mode

You should see my-node-app:latest.


7) Run the Container (with Port Mapping)

docker rm -f my-node-container 2>/dev/null
docker run -d -p 3000:3000 --name my-node-container my-node-app:latest
Enter fullscreen mode Exit fullscreen mode

Verify it’s running:

docker ps
Enter fullscreen mode Exit fullscreen mode

You must see:

  • NAME: my-node-container
  • PORTS: 0.0.0.0:3000->3000/tcp

8) Test in Browser

Open:

http://localhost:3000

Expected output:

Hello DevOps from Docker!

Also test via terminal:

curl http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

9) Debugging Lab (Real DevOps Troubleshooting)

9.1 If localhost:3000 shows nothing

Step A: Is container running?

docker ps
Enter fullscreen mode Exit fullscreen mode

If empty → container exited.

Step B: Show stopped containers

docker ps -a
Enter fullscreen mode Exit fullscreen mode

Look for status like:

  • Exited (1)

Step C: Read logs (most important)

docker logs my-node-container
Enter fullscreen mode Exit fullscreen mode

Common errors:

  • SyntaxError: missing ) after argument list
  • Unexpected identifier (often means Dockerfile text was pasted into app.js)
  • Cannot find module or app.js not found

9.2 Fix Common Student Mistakes

Mistake 1: Running wrong tag (example :prod)

If you built :latest but run :prod:

docker run my-node-app:prod
Enter fullscreen mode Exit fullscreen mode

You’ll get: “Unable to find image…”

Fix: run :latest:

docker run -d -p 3000:3000 --name my-node-container my-node-app:latest
Enter fullscreen mode Exit fullscreen mode

Or create prod tag:

docker tag my-node-app:latest my-node-app:prod
Enter fullscreen mode Exit fullscreen mode

Mistake 2: Container exits immediately

Cause: JavaScript error in app.js.

Fix: check logs:

docker logs my-node-container
Enter fullscreen mode Exit fullscreen mode

Fix app.js, then rebuild and rerun:

docker rm -f my-node-container
docker build -t my-node-app:latest .
docker run -d -p 3000:3000 --name my-node-container my-node-app:latest
Enter fullscreen mode Exit fullscreen mode

Mistake 3: Port 3000 already in use

Check:

lsof -iTCP:3000 -sTCP:LISTEN
Enter fullscreen mode Exit fullscreen mode

Run on another port:

docker rm -f my-node-container
docker run -d -p 3001:3000 --name my-node-container my-node-app:latest
Enter fullscreen mode Exit fullscreen mode

Open:

http://localhost:3001


10) Use docker exec (Inspect Inside Container)

Enter container shell:

docker exec -it my-node-container sh
Enter fullscreen mode Exit fullscreen mode

Check files:

ls -la
pwd
cat app.js
Enter fullscreen mode Exit fullscreen mode

Exit:

exit
Enter fullscreen mode Exit fullscreen mode

11) Cleanup (Stop and Remove Everything)

Stop & remove container:

docker rm -f my-node-container
Enter fullscreen mode Exit fullscreen mode

Remove image:

docker rmi my-node-app:latest
Enter fullscreen mode Exit fullscreen mode

Top comments (0)