สร้าง Docker Image ของตัวเอง: Dockerfile เบื้องต้น
ในบทที่แล้ว เราได้เรียนรู้วิธีการจัดการ Docker Container ต่างๆ ไม่ว่าจะเป็นการเริ่มต้น, หยุด, รีสตาร์ท, หรือลบ Container ไปแล้ว ในบทนี้ เราจะก้าวไปอีกขั้นด้วยการสร้าง Docker Image ของตัวเอง ซึ่งเป็นเหมือนพิมพ์เขียวสำหรับการสร้าง Container ที่เราต้องการ
การสร้าง Docker Image เองนั้นมีความสำคัญอย่างมาก เพราะมันช่วยให้เราสามารถกำหนดสภาพแวดล้อมที่ Container ของเราทำงานได้อย่างแม่นยำ และสามารถทำซ้ำ (reproducible) ได้อย่างง่ายดาย ไม่ว่าจะเป็นบนเครื่องของเราเอง, บนเซิร์ฟเวอร์, หรือในสภาพแวดล้อมการพัฒนาอื่นๆ
Dockerfile คืออะไร?
Dockerfile คือไฟล์ข้อความที่ประกอบด้วยชุดคำสั่ง (instruction) ที่ Docker จะใช้ในการสร้าง Image ไฟล์นี้เปรียบเสมือนสูตรอาหารที่บอก Docker ว่าจะต้องทำอะไรบ้าง ตั้งแต่การเลือก Image พื้นฐาน, การติดตั้งโปรแกรม, การคัดลอกไฟล์, ไปจนถึงการกำหนดคำสั่งที่จะรันเมื่อ Container เริ่มทำงาน
ข้อดีของการใช้ Dockerfile คือมันช่วยให้กระบวนการสร้าง Image เป็นไปอย่างอัตโนมัติ, สามารถทำซ้ำได้, และสามารถควบคุมเวอร์ชันได้ (เช่นเดียวกับโค้ดอื่นๆ) ซึ่งเป็นหัวใจสำคัญของ DevOps และ Continuous Integration/Continuous Deployment (CI/CD).
คำสั่งพื้นฐานใน Dockerfile
Dockerfile ประกอบด้วยคำสั่ง (instruction) หลายประเภท แต่ในบทนี้เราจะเน้นที่คำสั่งพื้นฐานที่ใช้บ่อยที่สุด:
- FROM: กำหนด Image พื้นฐาน (base image) ที่ Image ของเราจะสร้างขึ้นต่อยอดจาก Image นั้น ตัวอย่างเช่น
FROM ubuntu:latestหมายถึงเราจะใช้ Image ของ Ubuntu เวอร์ชันล่าสุดเป็นฐาน - RUN: ใช้สำหรับรันคำสั่งต่างๆ ภายใน Container ระหว่างการสร้าง Image ตัวอย่างเช่น
RUN apt-get update && apt-get install -y nginxจะทำการอัพเดท package list และติดตั้ง Nginx - COPY: ใช้สำหรับคัดลอกไฟล์หรือโฟลเดอร์จากเครื่อง host ไปยัง Container ตัวอย่างเช่น
COPY ./app /appจะคัดลอกโฟลเดอร์appใน directory ปัจจุบันไปยัง/appใน Container - CMD: กำหนดคำสั่งที่จะรันเมื่อ Container เริ่มทำงาน มีได้เพียงคำสั่งเดียวเท่านั้นใน Dockerfile หากมีหลายคำสั่ง Docker จะใช้คำสั่งสุดท้ายเท่านั้น ตัวอย่างเช่น
CMD ["nginx", "-g", "daemon off;"]จะสั่งให้ Nginx เริ่มทำงาน
ข้อควรจำ: คำสั่ง RUN จะถูก execute ในระหว่างการสร้าง Image ในขณะที่ CMD จะถูก execute เมื่อ Container ถูกสร้างขึ้นจาก Image นั้น
สร้าง Dockerfile อย่างง่าย
มาลองสร้าง Dockerfile อย่างง่ายเพื่อสร้าง Image ที่รัน Nginx Web Server กัน:
- สร้างโฟลเดอร์ใหม่สำหรับโปรเจ็กต์ของเรา (เช่น
nginx-docker) - สร้างไฟล์ชื่อ
Dockerfile(ไม่มีนามสกุล) ภายในโฟลเดอร์นั้น - ใส่เนื้อหาต่อไปนี้ลงในไฟล์
Dockerfile:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY ./index.html /var/www/html/index.html
CMD ["nginx", "-g", "daemon off;"]
คำอธิบาย:
FROM ubuntu:latest: ใช้ Ubuntu เวอร์ชันล่าสุดเป็น Image พื้นฐานRUN apt-get update && apt-get install -y nginx: อัพเดท package list และติดตั้ง NginxCOPY ./index.html /var/www/html/index.html: คัดลอกไฟล์index.html(ที่เราจะสร้างในขั้นตอนถัดไป) ไปยัง directory/var/www/html/ใน Container ซึ่งเป็น directory ที่ Nginx ใช้สำหรับ serving static filesCMD ["nginx", "-g", "daemon off;"]: สั่งให้ Nginx เริ่มทำงานเมื่อ Container เริ่มทำงานdaemon off;เป็น flag ที่บอก Nginx ให้ทำงานใน foreground ซึ่งจำเป็นสำหรับการทำงานใน Container
ต่อมา สร้างไฟล์ index.html ในโฟลเดอร์ nginx-docker (ข้างๆ Dockerfile) โดยมีเนื้อหาดังนี้ (หรือเนื้อหา HTML ใดๆ ที่คุณต้องการ):
<!DOCTYPE html>
<html>
<head>
<title>Hello from Docker!</title>
</head>
<body>
<h1>Hello from Docker!</h1>
<p>This is a simple HTML page served by Nginx running in a Docker container.</p>
</body>
</html>
สร้าง Image ด้วยคำสั่ง 'docker build'
เมื่อเรามี Dockerfile และไฟล์ index.html แล้ว เราก็พร้อมที่จะสร้าง Image ของเราแล้ว เปิด Terminal หรือ Command Prompt แล้วเข้าไปยังโฟลเดอร์ nginx-docker จากนั้นรันคำสั่ง:
docker build -t my-nginx-image .
คำอธิบาย:
docker build: คำสั่งสำหรับสร้าง Docker Image-t my-nginx-image: Tag Image ที่สร้างด้วยชื่อmy-nginx-imageการ tag image ช่วยให้เราอ้างอิง Image ได้ง่ายขึ้นในภายหลัง.: ระบุ context สำหรับการ build ซึ่งในกรณีนี้คือ directory ปัจจุบัน (.) Docker จะมองหา Dockerfile ใน directory นี้และใช้ไฟล์ทั้งหมดใน directory นี้เป็นส่วนหนึ่งของการ build context
เมื่อรันคำสั่งนี้ Docker จะเริ่มกระบวนการสร้าง Image โดยอ่าน Dockerfile ทีละบรรทัดและ execute คำสั่งตามที่ระบุไว้ คุณจะเห็น output ใน Terminal ที่แสดงให้เห็นว่า Docker กำลังทำอะไรอยู่
ข้อควรจำ: การเลือก build context ที่เหมาะสมเป็นสิ่งสำคัญ หาก context ใหญ่เกินไป จะทำให้การ build ช้าลงโดยไม่จำเป็น ควรเลือก context ที่มีเฉพาะไฟล์ที่จำเป็นสำหรับการสร้าง Image เท่านั้น
รัน Container จาก Image ที่เราสร้าง
เมื่อการ build เสร็จสิ้น เราก็สามารถรัน Container จาก Image ที่เราสร้างได้ โดยใช้คำสั่ง:
docker run -d -p 80:80 my-nginx-image
คำอธิบาย:
docker run: คำสั่งสำหรับรัน Container-d: รัน Container ใน detached mode (background)-p 80:80: map port 80 บนเครื่อง host ไปยัง port 80 ใน Container ทำให้เราสามารถเข้าถึง Nginx ผ่าน browser โดยใช้ IP address ของเครื่อง hostmy-nginx-image: ระบุ Image ที่จะใช้ในการสร้าง Container
เปิด browser แล้วไปยัง http://localhost (หรือ IP address ของเครื่อง host) คุณควรจะเห็นหน้าเว็บ "Hello from Docker!" ที่เราสร้างไว้ใน index.html
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการสร้าง Docker Image ของตัวเองโดยใช้ Dockerfile เราได้รู้จักคำสั่งพื้นฐานใน Dockerfile (FROM, RUN, COPY, CMD) และได้ลองสร้าง Image ที่รัน Nginx Web Server อย่างง่าย การสร้าง Docker Image เองเป็นทักษะที่สำคัญสำหรับนักพัฒนาและ DevOps เพราะมันช่วยให้เราสามารถกำหนดสภาพแวดล้อมที่ Container ของเราทำงานได้อย่างแม่นยำและสามารถทำซ้ำได้
ในบทถัดไป เราจะเรียนรู้วิธีการแชร์ Docker Image ของเราบน Docker Hub เพื่อให้คนอื่นๆ สามารถนำ Image ของเราไปใช้งานได้