5. Run Docker Container จาก Image
หลังจากที่เราได้สร้าง Docker Image จาก Dockerfile ในบทความที่แล้ว ตอนนี้ถึงเวลาที่เราจะนำ Image นั้นมาใช้งานจริง โดยการ Run เป็น Docker Container ซึ่งเปรียบเสมือนการสร้าง instance ของ application ของเราที่ทำงานแยกจากระบบปฏิบัติการหลัก
docker run คืออะไร?
คำสั่ง docker run คือหัวใจหลักในการสร้างและเริ่มต้น Container จาก Image ที่เรามี โดยมีรูปแบบการใช้งานดังนี้:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
มาดูส่วนประกอบสำคัญของคำสั่งนี้:
docker run: คำสั่งหลักในการ Run Container[OPTIONS]: ตัวเลือกต่างๆ ที่ใช้ปรับแต่งการทำงานของ Container เช่น การกำหนดชื่อ, Port Mapping, Environment Variables เป็นต้นIMAGE: ชื่อ Image ที่เราต้องการใช้ในการสร้าง Container (เช่นmy-php-app:latest)[COMMAND]: คำสั่งที่จะรันภายใน Container เมื่อ Container เริ่มทำงาน (ถ้าไม่ระบุ จะใช้คำสั่งที่กำหนดไว้ใน Dockerfile)[ARG...]: Argument ที่ส่งให้กับ Command
การ Run Container อย่างง่ายที่สุด
เริ่มต้นด้วยการ Run Container จาก Image ที่เราสร้างในบทความที่แล้ว (สมมติว่า Image ชื่อ my-php-app:latest)
docker run my-php-app:latest
คำสั่งนี้จะสร้างและ Run Container จาก Image my-php-app:latest โดยใช้ configuration default ที่กำหนดไว้ใน Dockerfile ถ้า Dockerfile ของเรามีการกำหนด Command ไว้ (เช่น การ start web server) Container ก็จะเริ่มทำงานตาม Command นั้นทันที
กรณีใช้งานจริง: ถ้า Dockerfile ของเรามีคำสั่ง CMD ["apache2ctl", "-D", "FOREGROUND"] Container จะเริ่มต้น Apache web server ภายใน Container ทันที
ข้อผิดพลาดที่พบบ่อย: ถ้าไม่มี Command ถูกกำหนดไว้ใน Dockerfile และเราไม่ได้ระบุ Command ใน docker run Container อาจจะ Run แล้ว Exit ทันที เพราะไม่มี process หลักให้ Container ทำงานต่อ
Port Mapping: เชื่อมต่อ Container กับโลกภายนอก
โดยปกติ Container จะทำงานแยกจากระบบปฏิบัติการหลัก ดังนั้นถ้า application ของเราต้องการรับ request จากภายนอก (เช่น web server ที่ต้องการรับ HTTP request) เราต้องทำการ Mapping Port จาก Host Machine (เครื่องที่เรากำลัง Run Docker) ไปยัง Port ภายใน Container
เราใช้ Option -p หรือ --publish ในคำสั่ง docker run เพื่อกำหนด Port Mapping โดยมีรูปแบบดังนี้:
docker run -p HOST_PORT:CONTAINER_PORT IMAGE
HOST_PORT: Port บน Host Machine ที่เราต้องการ MapCONTAINER_PORT: Port ภายใน Container ที่ application ของเรากำลัง ListenIMAGE: ชื่อ Image ที่เราต้องการใช้
ตัวอย่าง: สมมติว่า application PHP ของเรา (เช่น Apache web server) กำลัง Listen อยู่ที่ Port 80 ภายใน Container และเราต้องการให้สามารถเข้าถึงได้จาก Port 8080 บน Host Machine เราจะใช้คำสั่ง:
docker run -p 8080:80 my-php-app:latest
หลังจาก Run คำสั่งนี้ เราจะสามารถเข้าถึง application PHP ของเราได้โดยการเปิด browser และเข้า URL http://localhost:8080
กรณีใช้งานจริง: เราสามารถ Map หลาย Ports ได้พร้อมกัน เช่น:
docker run -p 8080:80 -p 33060:3306 my-php-app:latest
คำสั่งนี้จะ Map Port 8080 บน Host ไปยัง Port 80 ภายใน Container (สำหรับ web server) และ Map Port 33060 บน Host ไปยัง Port 3306 ภายใน Container (สำหรับ MySQL database)
ข้อผิดพลาดที่พบบ่อย: ถ้า Port ที่เราต้องการ Map บน Host Machine ถูกใช้งานอยู่แล้ว Docker จะไม่สามารถ Run Container ได้ และจะแสดง Error Message เราต้องเลือก Port อื่นที่ว่างอยู่ หรือหยุด process ที่กำลังใช้งาน Port นั้นอยู่
Environment Variables: ปรับแต่ง Application โดยไม่ต้อง Build Image ใหม่
Environment Variables (ตัวแปรสภาพแวดล้อม) คือตัวแปรที่เราสามารถกำหนดค่าได้ในขณะที่ Run Container โดยไม่ต้องแก้ไข Code ใน application หรือ Build Image ใหม่ ซึ่งมีประโยชน์มากในการปรับแต่ง configuration ของ application เช่น Database Connection String, API Key, หรือ Debug Mode
เราใช้ Option -e หรือ --env ในคำสั่ง docker run เพื่อกำหนด Environment Variables โดยมีรูปแบบดังนี้:
docker run -e VARIABLE_NAME=VALUE IMAGE
VARIABLE_NAME: ชื่อของ Environment VariableVALUE: ค่าของ Environment VariableIMAGE: ชื่อ Image ที่เราต้องการใช้
ตัวอย่าง: สมมติว่า application PHP ของเราต้องการ Environment Variable ชื่อ DB_HOST เพื่อกำหนด hostname ของ database server เราจะใช้คำสั่ง:
docker run -e DB_HOST=mysql my-php-app:latest
ภายใน application PHP เราสามารถเข้าถึงค่าของ Environment Variable DB_HOST ได้โดยใช้ function getenv('DB_HOST')
กรณีใช้งานจริง: เราสามารถกำหนด Environment Variables หลายตัวได้พร้อมกัน:
docker run -e DB_HOST=mysql -e DB_USER=root -e DB_PASSWORD=secret my-php-app:latest
ข้อผิดพลาดที่พบบ่อย: ถ้า Environment Variable ที่เรากำหนดชื่อไม่ตรงกับที่ application PHP คาดหวัง Application อาจจะทำงานผิดพลาด หรือไม่สามารถเชื่อมต่อกับ database ได้ ตรวจสอบให้แน่ใจว่าชื่อ Environment Variable ถูกต้อง
การตั้งชื่อ Container
โดยปกติ Docker จะสุ่มสร้างชื่อให้กับ Container ที่เรา Run แต่เราสามารถกำหนดชื่อ Container เองได้โดยใช้ Option --name
docker run --name my-php-container my-php-app:latest
การตั้งชื่อ Container จะช่วยให้เราสามารถอ้างอิง Container ได้ง่ายขึ้น เช่น ในการ Stop, Start, หรือ Remove Container
Run Container แบบ Detached Mode (Background)
โดยปกติเมื่อเรา Run Container ด้วยคำสั่ง docker run Terminal จะถูกผูกไว้กับ Container นั้น ถ้าเราปิด Terminal Container ก็จะถูก Stop ไปด้วย เราสามารถ Run Container แบบ Detached Mode ได้โดยใช้ Option -d หรือ --detach
docker run -d my-php-app:latest
เมื่อเรา Run Container แบบ Detached Mode Docker จะ Run Container ใน Background และแสดง Container ID ให้เราทราบ
กรณีใช้งานจริง: การ Run web server หรือ database server ใน Detached Mode จะทำให้ application ของเราทำงานต่อเนื่องได้ แม้ว่าเราจะปิด Terminal
สรุป
ในบทความนี้เราได้เรียนรู้วิธีการ Run Docker Container จาก Image โดยใช้คำสั่ง docker run พร้อมทั้ง Option ต่างๆ ที่สำคัญ เช่น Port Mapping (-p), Environment Variables (-e), การตั้งชื่อ Container (--name), และการ Run Container แบบ Detached Mode (-d) การเข้าใจและใช้งานคำสั่ง docker run อย่างคล่องแคล่วเป็นสิ่งสำคัญในการพัฒนาและ Deploy application PHP ด้วย Docker
ในบทความต่อไป เราจะมาเรียนรู้เรื่อง Docker Compose ซึ่งเป็นเครื่องมือที่ช่วยให้เราสามารถจัดการ Multi-Container Application ได้อย่างง่ายดาย