Dockerfile และการใช้งาน

   อัปเดตล่าสุด April 12, 2024

ในโลกของการพัฒนาแอปพลิเคชันที่รวดเร็วและมีประสิทธิภาพ, Dockerfile ถือเป็นเครื่องมือสำคัญที่ช่วยให้นักพัฒนาสามารถสร้าง Docker Images ได้อย่างเรียบง่ายและแม่นยำ Dockerfile ไม่เพียงแต่ช่วยลดเวลาในการตั้งค่าสภาพแวดล้อมการพัฒนาเท่านั้น แต่ยังช่วยให้การเผยแพร่และการทำงานร่วมกันเป็นไปได้อย่างไม่มีปัญหา บทความนี้จะนำเสนอความรู้พื้นฐานเกี่ยวกับ Dockerfile, วิธีการเขียน Dockerfile, และเคล็ดลับในการสร้าง Images ที่มีประสิทธิภาพสูง


Dockerfile คืออะไร ?

Dockerfile คือไฟล์ข้อความที่ประกอบด้วยคำสั่งซึ่งระบุขั้นตอนในการสร้าง Docker Image แต่ละคำสั่งจะสร้างเลเยอร์ใหม่ใน Image ซึ่งเมื่อรวมกันแล้วจะกลายเป็น Image ที่สมบูรณ์\

คำสั่งหลักที่ใช้ใน Dockerfile ได้แก่

  • FROM: ระบุ Base Image ที่จะใช้เป็นพื้นฐานในการสร้าง Image ใหม่
  • RUN: รันคำสั่งใดๆ ในระหว่างการสร้าง Image เช่น ติดตั้งแพ็คเกจหรืออัปเดตระบบ
  • COPY: คัดลอกไฟล์จากโฮสต์ไปยัง Image
  • ENV: ตั้งค่าตัวแปรสภาพแวดล้อมใน Image
  • EXPOSE: ระบุพอร์ตที่ Container จะเปิดใช้งาน
  • CMD: ระบุคำสั่งเริ่มต้นที่จะรันเมื่อ Container ถูกสร้างจาก Image


ตัวอย่าง Dockerfile พื้นฐาน

FROM node:14-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Dockerfile นี้จะสร้าง Image โดยใช้ Node.js 14 บน Alpine Linux เป็นพื้นฐาน จากนั้นจะคัดลอกไฟล์ package.json และรันคำสั่ง  npm install เพื่อติดตั้ง Dependencies ต่อมาจะคัดลอกไฟล์ทั้งหมดในโปรเจ็กต์ไปยัง Image เปิดพอร์ต 3000 และระบุคำสั่ง  npm start  ให้รันเมื่อ Container ถูกสร้างขึ้น


การ Optimize Dockerfile สำหรับ requirements ที่ต้องการ

การปรับแต่ง Dockerfile ให้เหมาะสมกับความต้องการของโปรเจคเป็นสิ่งสำคัญในการสร้าง Images ที่มีประสิทธิภาพและเชื่อถือได้ ตัวอย่างเช่น:

1. การตั้งค่าตัวแปรสภาพแวดล้อม:

ENV NODE_ENV=production
ENV PORT=3000


2. การจัดการ Dependencies อย่างมีประสิทธิภาพ:

COPY package.json package-lock.json ./
RUN npm ci


3. การใช้ Multi-stage Builds เพื่อลดขนาดของ Image:

FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:14-alpine
WORKDIR /app
COPY --from=build /app/package*.json ./
RUN npm ci --only=production
COPY --from=build /app/dist ./dist
CMD ["node", "dist/index.js"]

ใน Dockerfile นี้ เราใช้ Multi-stage Builds เพื่อแยกขั้นตอนการสร้างแอปพลิเคชันออกจากขั้นตอนการสร้าง Image สุดท้าย ในขั้นตอนแรก เราสร้างแอปพลิเคชันและรวบรวมไฟล์ทั้งหมดในไดเรกทอรี   dist/  จากนั้นในขั้นตอนที่สอง เราใช้ Node.js บน Alpine เป็นพื้นฐาน คัดลอกเฉพาะไฟล์ที่จำเป็นจากขั้นตอนแรก และติดตั้ง Dependencies เฉพาะที่ใช้ในโหมด Production เท่านั้น สุดท้ายเราคัดลอกไฟล์ในไดเรกทอรี  dist/  และระบุคำสั่งในการรันแอปพลิเคชัน ทำให้ได้ Image ที่มีขนาดเล็กลงอย่างมาก


ทำไม Dockerfile ถึงมีความสำคัญใน DevOps

Dockerfile มีบทบาทสำคัญใน DevOps และการทำงานร่วมกันของทีมนักพัฒนา เนื่องจากช่วยให้สามารถสร้างสภาพแวดล้อมการพัฒนาและการผลิตที่สม่ำเสมอได้อย่างรวดเร็วและมีประสิทธิภาพ

เมื่อทีมใช้ Dockerfile ทุกคนสามารถมั่นใจได้ว่ากำลังทำงานกับสภาพแวดล้อมเดียวกัน ไม่ว่าจะเป็นบนเครื่องของนักพัฒนาแต่ละคน บนเซิร์ฟเวอร์สำหรับการทดสอบ หรือบนโครงสร้างพื้นฐานคลาวด์สำหรับการใช้งานจริง ด้วย Dockerfile ทีมสามารถหลีกเลี่ยงปัญหาที่เกิดจากความแตกต่างของสภาพแวดล้อม และลดเวลาที่ใช้ในการแก้ไขปัญหาเหล่านั้น

นอกจากนี้ การใช้ Dockerfile ยังช่วยให้การปรับขนาดและการทำ Continuous Integration/Continuous Deployment (CI/CD) ทำได้ง่ายขึ้น เนื่องจากสามารถสร้าง Images ใหม่และปรับใช้อย่างอัตโนมัติเมื่อมีการเปลี่ยนแปลงใน Codebase

สรุป

Dockerfile เป็นส่วนหนึ่งที่ไม่อาจขาดได้ในการสร้าง Docker Images ที่มีประสิทธิภาพและปรับให้เหมาะสมกับความต้องการของแต่ละโปรเจ็กต์ ด้วยการใช้ Dockerfile, นักพัฒนาสามารถมั่นใจได้ว่าสภาพแวดล้อมการพัฒนาและการผลิตนั้นเป็นไปอย่างเสถียรและสม่ำเสมอ ไม่เพียงเท่านั้น Dockerfile ยังเป็นกุญแจสำคัญในการปลดล็อกความสามารถของ DevOps และการทำงานร่วมกันของทีม โดยการลดความซับซ้อนและเพิ่มความคล่องตัวในกระบวนการพัฒนาซอฟต์แวร์


ดูเพิ่มเติม บทเรียน Dockerfile



คอร์สเรียนแนะนำ