Build Docker Image จาก Dockerfile
ในบทที่แล้ว เราได้เรียนรู้วิธีการสร้าง Dockerfile ซึ่งเปรียบเสมือนพิมพ์เขียว (blueprint) สำหรับการสร้าง Docker Image ในบทนี้ เราจะมาเรียนรู้วิธีการนำ Dockerfile นั้นมาสร้างเป็น Docker Image จริงๆ กันครับ
คำสั่ง docker build คืออะไร?
คำสั่ง docker build เป็นคำสั่งหลักที่เราใช้ในการสร้าง Docker Image จาก Dockerfile ครับ มันจะอ่านคำสั่งต่างๆ ที่อยู่ใน Dockerfile แล้ว execute ทีละบรรทัด เพื่อสร้างเป็น Layer ของ Image ขึ้นมา
รูปแบบคำสั่งพื้นฐานคือ:
docker build [OPTIONS] PATH | URL | -
โดยที่:
OPTIONS: เป็นตัวเลือกต่างๆ ที่เราสามารถใส่เพิ่มได้ เช่น ชื่อ Image, Tag, หรือไฟล์ Dockerfile ที่ต้องการใช้PATH: คือ Path ไปยัง directory ที่มี Dockerfile อยู่ ถ้าไม่ได้ระบุไฟล์ Dockerfile ด้วย option-fDocker จะหาไฟล์ชื่อDockerfileใน directory นี้โดยอัตโนมัติURL: คือ URL ไปยัง Git Repository ที่มี Dockerfile อยู่ (ไม่ค่อยได้ใช้ในกรณีทั่วไป)-: อ่าน Dockerfile จาก standard input (ไม่ค่อยได้ใช้ในกรณีทั่วไป)
ตัวอย่าง: การ Build Docker Image อย่างง่าย
สมมติว่าเรามี Dockerfile ชื่อ Dockerfile อยู่ใน directory ชื่อ my-php-app (ซึ่งสร้างไว้ตั้งแต่บทที่แล้ว) เราสามารถ Build Image ได้ด้วยคำสั่งนี้:
docker build my-php-app
เมื่อรันคำสั่งนี้ Docker จะเริ่มอ่าน Dockerfile ทีละบรรทัด และแสดงผลลัพธ์ออกมา เราจะเห็น process การ Build ที่ Docker ทำ เช่น การ download base image, การ execute คำสั่งต่างๆ, และการสร้าง Layer ใหม่
ข้อสังเกต: Docker จะใช้ current directory เป็น build context โดยอัตโนมัติ นั่นหมายความว่าไฟล์ทุกไฟล์ใน directory นั้นจะถูกส่งไปยัง Docker Daemon เพื่อใช้ในการ Build ดังนั้นควรระวังอย่าให้มีไฟล์ที่ไม่จำเป็นอยู่ใน directory นั้น เพราะจะทำให้การ Build ช้าลง
Tagging Image: การตั้งชื่อ Image
หลังจาก Build Image เสร็จแล้ว เราควรตั้งชื่อ (tag) ให้กับ Image เพื่อให้ง่ายต่อการใช้งานและการจัดการ เราสามารถทำได้โดยใช้ option -t ในคำสั่ง docker build
รูปแบบการตั้งชื่อ (tagging) คือ:
docker build -t image-name:tag my-php-app
โดยที่:
image-name: คือชื่อ Image ที่เราต้องการตั้ง เช่นmy-php-apptag: คือ tag ที่ใช้ระบุ version หรือ label ของ Image เช่นlatest,1.0,dev
ตัวอย่าง:
docker build -t my-php-app:latest my-php-app
คำสั่งนี้จะ Build Image จาก Dockerfile ใน directory my-php-app และตั้งชื่อ Image ว่า my-php-app พร้อม tag latest
ข้อควรจำ: ควรตั้งชื่อ Image ให้สื่อความหมายและสอดคล้องกับ application ของเรา และควรใช้ tag เพื่อระบุ version หรือ environment ของ Image อย่างชัดเจน
Docker Hub: ที่เก็บ Image สาธารณะ
Docker Hub เป็น registry สาธารณะ (public registry) ที่เราสามารถ upload และ download Docker Image ได้ฟรี เปรียบเสมือน GitHub สำหรับ Docker Image นั่นเอง
การใช้งาน Docker Hub มีประโยชน์หลายอย่าง เช่น:
- Shared Resources: สามารถใช้ Image ที่คนอื่นสร้างไว้แล้วได้
- Collaboration: สามารถแชร์ Image ของเราให้คนอื่นใช้ได้
- Centralized Storage: เป็นที่เก็บ Image ที่ปลอดภัยและเข้าถึงได้จากทุกที่
ข้อควรระวัง: Image ที่ upload ขึ้น Docker Hub จะเป็น public โดย default ดังนั้นควรตรวจสอบให้แน่ใจว่าไม่มีข้อมูล sensitive อยู่ใน Image ก่อนที่จะ upload ขึ้นไป
การ Push Image ขึ้น Docker Hub
ก่อนที่จะ push Image ขึ้น Docker Hub ได้ เราต้อง:
- สร้าง Account: สร้าง account บน Docker Hub ก่อน
- Login: Login เข้า Docker Hub ผ่าน command line โดยใช้คำสั่ง
docker login - Tag Image: Tag Image ของเราให้มี format เป็น
username/image-name:tagโดยที่usernameคือ username ของ Docker Hub - Push: Push Image ขึ้น Docker Hub โดยใช้คำสั่ง
docker push username/image-name:tag
ตัวอย่าง:
# Login เข้า Docker Hub
docker login
# Tag Image (สมมติว่า username คือ myusername และ image name คือ my-php-app)
docker tag my-php-app:latest myusername/my-php-app:latest
# Push Image ขึ้น Docker Hub
docker push myusername/my-php-app:latest
หลังจาก push สำเร็จ เราจะเห็น Image ของเราบน Docker Hub และคนอื่นๆ ก็สามารถ download Image ของเราไปใช้ได้
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
กรณีใช้งานจริง: สมมติว่าเราต้องการสร้าง Image สำหรับ application PHP ที่ใช้ Composer ในการจัดการ dependencies เราสามารถใช้ Dockerfile ประมาณนี้:
FROM php:7.4-apache
WORKDIR /var/www/html
COPY . /var/www/html
RUN apt-get update && apt-get install -y \
zip \
unzip
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install --no-dev --optimize-autoloader
EXPOSE 80
จากนั้น Build Image โดยใช้คำสั่ง:
docker build -t my-php-app:latest .
ข้อผิดพลาดที่พบบ่อย:
- Permission denied: หากพบข้อผิดพลาดเกี่ยวกับ permission ในระหว่างการ Build ให้ลองเพิ่ม
USER rootที่ Dockerfile เพื่อให้ command ต่างๆ ถูก execute ด้วย root user - Cache invalidation: Docker จะใช้ cache ในการ Build เพื่อให้รวดเร็วขึ้น หากมีการแก้ไขไฟล์ที่ใช้ใน Dockerfile Docker อาจจะไม่ re-build layer นั้น ให้ลองใช้ option
--no-cacheในคำสั่งdocker buildเพื่อ force re-build - Context path incorrect: ตรวจสอบให้แน่ใจว่า path ที่ระบุในคำสั่ง
docker buildถูกต้อง และมี Dockerfile อยู่ใน directory นั้น - Image size too large: พยายามลดขนาด Image โดยการใช้ multi-stage build หรือ clean up ไฟล์ที่ไม่จำเป็นหลังจากการ Build
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการ Build Docker Image จาก Dockerfile, การตั้งชื่อ Image, และการ Push Image ขึ้น Docker Hub หวังว่าคุณจะสามารถนำความรู้เหล่านี้ไปประยุกต์ใช้ในการพัฒนา application PHP ของคุณได้นะครับ ในบทต่อไป เราจะมาเรียนรู้วิธีการ Run Docker Container จาก Image ที่เราสร้างขึ้นครับ