0) Prerequisites
- Docker Desktop installed and running (whale icon in menu bar)
- Terminal access on Mac
Verify Docker:
docker --version
1) Create Project Folder
mkdir docker-basic
cd docker-basic
2) Create Node App
Create app.js:
nano app.js
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");
});
Save:
- Ctrl + O, Enter
- Ctrl + X
3) Create package.json
npm init -y
Confirm it exists:
ls -la
You should see:
app.jspackage.json
4) Create Dockerfile
Create file named Dockerfile (no extension):
nano Dockerfile
Paste:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
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
6) Build the Docker Image
docker build -t my-node-app:latest .
Verify image:
docker images | head
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
Verify it’s running:
docker ps
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
9) Debugging Lab (Real DevOps Troubleshooting)
9.1 If localhost:3000 shows nothing
Step A: Is container running?
docker ps
If empty → container exited.
Step B: Show stopped containers
docker ps -a
Look for status like:
Exited (1)
Step C: Read logs (most important)
docker logs my-node-container
Common errors:
SyntaxError: missing ) after argument list-
Unexpected identifier(often means Dockerfile text was pasted into app.js) -
Cannot find moduleorapp.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
You’ll get: “Unable to find image…”
Fix: run :latest:
docker run -d -p 3000:3000 --name my-node-container my-node-app:latest
Or create prod tag:
docker tag my-node-app:latest my-node-app:prod
Mistake 2: Container exits immediately
Cause: JavaScript error in app.js.
Fix: check logs:
docker logs my-node-container
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
Mistake 3: Port 3000 already in use
Check:
lsof -iTCP:3000 -sTCP:LISTEN
Run on another port:
docker rm -f my-node-container
docker run -d -p 3001:3000 --name my-node-container my-node-app:latest
Open:
http://localhost:3001
10) Use docker exec (Inspect Inside Container)
Enter container shell:
docker exec -it my-node-container sh
Check files:
ls -la
pwd
cat app.js
Exit:
exit
11) Cleanup (Stop and Remove Everything)
Stop & remove container:
docker rm -f my-node-container
Remove image:
docker rmi my-node-app:latest
Top comments (0)