Thuta Learning

Node.js App ကို Docker Container ပြုလုပ်နည်း

Dockerfile၊ .dockerignore၊ non-root user နှင့် health check သဘောတရားတို့ပါသော သေးငယ်ပြီး ပြန်လည်တည်ဆောက်နိုင်သည့် Node.js image တစ်ခုလုပ်ပါမယ်။

Node.js App ကို Docker Container ပြုလုပ်နည်း cover illustration

Problem

Developer စက်မှာအလုပ်လုပ်ပေမယ့် server မှာ dependency သို့မဟုတ် runtime version မတူလို့ပျက်ခြင်းကို container ဖြင့်လျှော့ချနိုင်ပါတယ်။

Requirements

  • Docker Desktop သို့မဟုတ် Docker Engine
  • Node.js project
  • Project start command

Build context ကိုသန့်ရှင်းပါ

node_modules၊ .git၊ local environment files နဲ့ logs တွေ image build context ထဲမဝင်အောင် .dockerignore ရေးပါ။ Build ပိုမြန်ပြီး secret မတော်တဆပါသွားတာကိုလည်းကာကွယ်ပေးပါတယ်။

.dockerignore
node_modules
.git
.env*
npm-debug.log*
coverage
.next

Multi-stage Dockerfile ရေးပါ

Build tools ကို final runtime image ထဲမထည့်ဘဲ stage ခွဲပါ။ Production dependency နဲ့ build output သာကျန်ရင် image size နဲ့ attack surface လျော့ပါတယ်။

Dockerfile
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app ./
USER node
EXPOSE 3000
CMD ["npm", "start"]

Image build နှင့် local run လုပ်ပါ

Tag ပါသော image တည်ဆောက်ပြီး host port ကို container port နဲ့ချိတ်ပါ။ Secret ကို image ထဲ bake မလုပ်ဘဲ run အချိန်မှာပေးပါ။

Terminal
$ docker build -t learning-app:1.0 .
$ docker run --rm -p 3000:3000 --env-file .env.local learning-app:1.0

Container ကိုစစ်ဆေးပါ

Browser ဖြင့်ဖွင့်ရုံမက logs၊ process exit နှင့် container ထဲက user ကိုစစ်ပါ။ Production မှာ immutable tag သုံးပြီး latest tag တစ်ခုတည်းကိုမယုံပါနှင့်။

Terminal
$ docker ps
$ docker logs <container-id>
$ docker exec <container-id> whoami

Expected result

Node runtime နှင့် dependency များကိုသတ်မှတ်ထားပြီး non-root user ဖြင့် run သော reproducible container image ရရှိပါမယ်။

Troubleshooting

  • Port မဖွင့်လျှင် app က 0.0.0.0 ကို listen လုပ်ကြောင်းစစ်ပါ။
  • Build context ကြီးလွန်းလျှင် .dockerignore ကိုပြန်စစ်ပါ။
  • Permission denied ဖြစ်လျှင် copied files ၏ ownership နှင့် USER instruction ကိုစစ်ပါ။

Related tutorials