การ Deploy Next.js ด้วย Docker
การ Deploy Application ที่พัฒนาขึ้นมาด้วย Next.js นั้นมีหลายวิธี ซึ่งวิธีที่น่าจะมีผู้ใช้งานเยอะที่สุดคือการ Deploy โดยใช้ Container ซึ่งในบทความนี้เราจะพาคุณไป Deploy Next.js ลงบน Docker แบบ Step by Step โดยเริ่มจาก
ขั้นตอนการ Deploy Next.js
ขั้นตอนที่ 1. สร้าง Dockerfile
สร้าง Dockerfile
ไว้ใน Root directory หลังจากนั้นให้เขียนแบบนี้
|
|
การทำงานของ Dockerfile นี้จะเป็นการทำงานแบบ Multi-Stages Build ซึ่งจะแบ่งออกเป็น 2 ขั้นตอนหลักๆ คือเราจะ Build ด้วย node:23-alpine
ที่ตั้งชื่อว่า Builder หลังจากนั้นจะ Copy ผลลัพธ์ใน Builder ไป Run ในด้วย node:23-alpine
ที่ตั้งชื่อว่า Runner
ขั้นตอนที่ 2. สร้าง .dockerignore
เอาไฟล์ที่ไม่ได้ใช้ออกจาก Container ด้วย .dockerignore
สำหรับ Next.js แล้วเราจะเอา node_modules, npm-debug.log, file ของ git และ .next/cache ออก
node_modules
npm-debug.log
.next/cache
.git
.gitignore
ขั้นตอนที่ 3. Build Docker Image
หลังจากนั้นสร้าง Image ขึ้นมาด้วยคำสั่ง docker build
ใน path ที่มี Dockerfile
$ docker build -t nextjs-app .
ในกรณีที่เกิด Error และต้องการ Build ซ้ำใหม่ตั้งแต่ต้นให้ใช้
$ docker build -t nextjs-app --no-cache .
ขั้นตอนที่ 4. Run Next.js
สุดท้ายเราจะนำ Image ที่ได้ในขั้นตอนก่อนหน้ามาสร้างเป็น Container ด้วยคำสั่ง docker run
$ docker run -p 3000:3000 nextjs-app
สุดท้ายเราจะได้ Next.js ที่ Run อยู่ใน Docker container แล้วโดยเข้าไปทดสอบ Application ที่ http://localhost:3000
ใช้ Docker Compose แทน Docker
ในการทำงานจริงเราจะต้องทำงานร่วมกับ Database หรือ Log server ที่อาจ Run อยู่ใน Container อื่นๆเราจึงจำเป็นต้องใช้ Docker Compose แทน Docker ธรรมดา โดยเราจะสร้างไฟล์ docker-compose.yml
โดยมีเนื้อหาดังนี้
services:
nextjs:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
และ Run Docker Compose ด้วยคำส่ัง
$ docker-compose up -d
นำขึ้น Container Registry
อีกทางเลือกนึงคือการนำ Image ที่ได้นี้ไปใช้บน Cloud หรือ Kubernetes เราจึงต้อง Push Docker Image ที่ได้มาจากขั้นตอนต่างๆก่อนหน้านี้ขึ้นไปยัง Container Registry โดยในตัวอย่างนี้เราจะ Push Image ขึ้นไปยัง Docker Hub โดยมีขั้นตอนต่างๆ ดังนี้
ขั้นตอนที่ 1. เปลี่ยนชื่อ Image ใหม่
เราจะต้องใช้คำสั่ง docker tag
เพื่อเปลี่ยนชื่อ Image เป็น username/image-name
$ docker tag nextjs-app dockerhub-username/nextjs-app
ขั้นตอนที่ 2. Push Image ขึ้นไปยัง Container Registry
หลังจากนั้นให้ Push ขึ้น Docker Hub ด้วยคำสั่ง
$ docker push dockerhub-username/nextjs-app
ขั้นตอนที่ 3. Pull Image ลงมาใช้งาน
ในขั้นตอนนี้จะเป็นการตรวจสอบผลลัพธ์ที่ได้จากขั้นตอนที่ 2 โดยเราจะทดสอบ Pull Image จาก Container Registry ลงมาใช้งานด้วยคำสั่ง Pull
$ docker pull dockerhub-username/nextjs-app
ถ้าต้องการทดสอบ Application เราต้อง Run Container ขึ้นมาด้วยคำสั่ง
$ docker run -p 3000:3000 dockerhub-username/nextjs-app