การใส่ React/Next.js App ลงใน Docker
เขียน Dockerfile แบบหลายขั้นตอนสำหรับแอป Next.js และเรียกใช้ภายในเครื่องด้วย Docker Compose
การใส่ React/Next.js App ลงใน Docker เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทำไมต้องใช้ Docker
คอนเทนเนอร์ Docker บรรจุแอปและสิ่งที่แอปต้องพึ่งพาไว้ด้วยกัน เพื่อให้ทำงานสอดคล้องกันในสภาพแวดล้อมการพัฒนา การเตรียมใช้งาน และการใช้งานจริง อิมเมจเดียวกันทำงานได้ทุกที่
ไฟล์ Docker สำหรับ React SPA แบบพื้นฐาน
การสร้างแบบสองขั้นตอน: ใช้ Node.js สำหรับการสร้าง และใช้ Nginx สำหรับให้บริการผลลัพธ์แบบสแตติก
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Serve with Nginx
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]การกำหนดค่า Nginx สำหรับการกำหนดเส้นทางของ SPA
กำหนดค่า Nginx ให้ส่งไฟล์ index.html สำหรับทุกเส้นทาง (รองรับการกำหนดเส้นทางฝั่งไคลเอนต์)
# nginx.conf
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html; # SPA routing
}
location ~* \.(js|css|png|jpg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}ไฟล์ Docker ของ Next.js ในโหมดสแตนด์อโลน
Next.js 12 ขึ้นไปรองรับ output: 'standalone' ซึ่งจะคัดลอกเฉพาะไฟล์ที่จำเป็นสำหรับอิมเมจใช้งานจริงที่มีขนาดเล็กที่สุด
// next.config.js
module.exports = { output: 'standalone' };
# Dockerfile (Next.js standalone)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"].dockerignore
แยกไฟล์ที่ไม่จำเป็นออกจากบริบทการสร้างของ Docker เพื่อเร่งการสร้างและลดขนาดอิมเมจ
node_modules
.next
dist
.env*
.git
README.md
*.test.tsการสร้างและการเรียกใช้
สร้างอิมเมจและเรียกใช้ในเครื่องของคุณ
# Build:
docker build -t my-next-app .
# Run:
docker run -p 3000:3000 -e DATABASE_URL=postgres://... my-next-app
# Check size:
docker images my-next-appDocker Compose สำหรับการพัฒนาในเครื่อง
ใช้ Docker Compose เพื่อเรียกใช้แอปพร้อมกับสิ่งที่แอปต้องพึ่งพา เช่น ฐานข้อมูลและ Redis ด้วยคำสั่งเดียว
# docker-compose.yml
services:
web:
build: .
ports: ['3000:3000']
environment:
DATABASE_URL: postgresql://postgres:password@db:5432/myapp
depends_on: [db]
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:การตรวจสอบสุขภาพ
เพิ่มการตรวจสอบสุขภาพลงในไฟล์ Docker เพื่อให้ตัวจัดการระบบทราบว่าคอนเทนเนอร์พร้อมใช้งานเมื่อใด
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:3000/api/health || exit 1ตัวแปรสภาพแวดล้อมขณะเรียกใช้
ส่งตัวแปรสภาพแวดล้อมในเวลาที่เรียกใช้ด้วย docker run หรือผ่าน --env-file อย่าฝังข้อมูลลับไว้ในอิมเมจโดยเด็ดขาด
docker run -p 3000:3000 \
--env-file .env.production \
my-next-appการสร้างสำหรับหลายแพลตฟอร์ม
สร้างอิมเมจสำหรับสถาปัตยกรรม CPU หลายแบบ เช่น ARM64 สำหรับ Mac ที่ใช้ชิป M1 และเครื่องเสมือนบนคลาวด์ และ AMD64 สำหรับเซิร์ฟเวอร์ส่วนใหญ่ ด้วย Docker Buildx
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t myregistry/my-next-app:latest \
--push .ตรวจสอบความเข้าใจ
ข้อดีของการใช้การสร้าง Docker แบบหลายขั้นตอนสำหรับแอป React/Next.js คืออะไร
สรุป
ใช้ไฟล์ Docker แบบหลายขั้นตอน โดยใช้ Node.js สำหรับการสร้าง และใช้ Nginx หรือ node:alpine สำหรับให้บริการ เพิ่ม output: 'standalone' ในการกำหนดค่า Next.js เพื่อสร้างอิมเมจขนาดเล็ก ใช้ Docker Compose สำหรับการพัฒนาในเครื่อง ส่งข้อมูลลับขณะเรียกใช้ผ่านตัวแปรสภาพแวดล้อม และสร้างอิมเมจสำหรับหลายแพลตฟอร์มด้วย Buildx เพื่อให้รองรับ ARM และ AMD64
คำถามที่พบบ่อย
บทเรียน “การใส่ React/Next.js App ลงใน Docker” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การใส่ React/Next.js App ลงใน Docker” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การใส่ React/Next.js App ลงใน Docker”
เขียน Dockerfile แบบหลายขั้นตอนสำหรับแอป Next.js และเรียกใช้ภายในเครื่องด้วย Docker Compose คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การใส่ React/Next.js App ลงใน Docker” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การนำไปใช้งานบน Vercel: ไม่ต้องกำหนดค่าและ URL สำหรับพรีวิว
- การโฮสต์ React SPA บน AWS S3 และ CloudFront
- การใส่ React/Next.js App ลงใน Docker
- CI/CD ด้วย GitHub Actions สำหรับ React