Docker เป็นแพลตฟอร์มที่ช่วยให้นักพัฒนาและผู้ดูแลระบบสามารถสร้าง ส่งมอบ และเรียกใช้งานแอปพลิเคชันได้ง่ายขึ้นผ่านการใช้คอนเทนเนอร์ (Container) โดยพื้นฐานแล้ว Docker จะช่วยสร้างสภาพแวดล้อมที่เป็นอิสระและสมบูรณ์สำหรับการรันแอปพลิเคชัน ซึ่งสามารถทำงานได้เหมือนกันในทุกสภาพแวดล้อม ไม่ว่าจะเป็นบนคอมพิวเตอร์ของนักพัฒนา, เซิร์ฟเวอร์ที่ให้บริการจริง, หรือแม้กระทั่งบนเครื่องของผู้ใช้งาน
Docker เป็นเครื่องมือที่มีองค์ประกอบสำคัญสามส่วนคือ Dockerfile, Docker Image, และ Docker Container ซึ่งแต่ละส่วนมีบทบาทและหน้าที่เฉพาะเจาะจง มาดูรายละเอียดของแต่ละส่วนดังนี้
Dockerfile
Dockerfile เป็นไฟล์ข้อความธรรมดาที่ประกอบไปด้วยชุดคำสั่งที่บอก Docker ว่าต้องทำอะไรบ้างในการสร้าง Docker Image ซึ่งเป็นเทมเพลตหรือแม่แบบสำหรับคอนเทนเนอร์ คำสั่งใน Dockerfile สามารถรวมถึงการระบุฐานอิมเมจ, การคัดลอกไฟล์, การติดตั้งซอฟต์แวร์, การตั้งค่าคอนฟิก, และการรันคำสั่งต่างๆ
ตัวอย่าง Dockerfile สำหรับแอปพลิเคชัน Node.js
Docker Image
Docker Image เป็นผลลัพธ์ที่ได้จากการรันคำสั่งใน Dockerfile อิมเมจนี้เป็นไฟล์แบบอ่านอย่างเดียวที่มีทุกอย่างที่จำเป็นสำหรับการรันแอปพลิเคชันในคอนเทนเนอร์ โดยประกอบไปด้วยฐานอิมเมจ, ไลบรารี, ไฟล์ที่ต้องใช้, และโค้ดแอปพลิเคชัน อิมเมจสามารถสร้างใหม่หรือแชร์ผ่าน Docker Hub หรือรีจิสทรีอื่นๆ ได้
การสร้าง Docker Image จาก Dockerfile
คำสั่งนี้จะสร้าง Docker Image ชื่อ my-node-app จาก Dockerfile ที่อยู่ใน directory ปัจจุบัน
Docker Container
Docker Container เป็นการนำ Docker Image มารัน โดยคอนเทนเนอร์จะสร้างสภาพแวดล้อมแยกออกมาเฉพาะของมัน ซึ่งมีทุกอย่างที่จำเป็นสำหรับการรันแอปพลิเคชัน คอนเทนเนอร์เป็นแบบไดนามิกและสามารถเริ่มต้น หยุด หรือลบได้ง่ายๆ โดยที่ไม่มีผลกระทบต่อระบบอื่นๆ
การรัน Docker Container จาก Docker Image
คำสั่งนี้จะรันคอนเทนเนอร์จาก Docker Image ชื่อ my-node-app และแม็พพอร์ต 3000 ของคอนเทนเนอร์ไปยังพอร์ต 3000 ของเครื่องคอมพิวเตอร์
- Dockerfile เป็นไฟล์ที่กำหนดขั้นตอนในการสร้าง Docker Image
- Docker Image เป็นไฟล์ที่สร้างจาก Dockerfile ซึ่งประกอบด้วยทุกอย่างที่จำเป็นสำหรับการรันแอปพลิเคชัน
- Docker Container เป็นสภาพแวดล้อมที่สร้างจาก Docker Image ซึ่งสามารถรันแอปพลิเคชันได้ในสภาพแวดล้อมที่แยกจากระบบหลัก
สถาปัตยกรรมของ Docker
Docker ใช้สถาปัตยกรรมแบบไคลเอนต์-เซิร์ฟเวอร์ โดยประกอบด้วยสองส่วนหลักคือ Docker Client และ Docker Daemon ซึ่งทั้งสองส่วนนี้ทำงานร่วมกันผ่านการสื่อสารด้วย REST API ผ่านทาง UNIX sockets หรืออินเทอร์เฟซเครือข่าย
Docker Client
เป็นส่วนที่ผู้ใช้งานติดต่อกับ Docker โดยตรง มันทำหน้าที่รับคำสั่งจากผู้ใช้ เช่น คำสั่งสำหรับการสร้าง, การรัน, หรือการกระจายคอนเทนเนอร์ คำสั่งเหล่านี้จะถูกส่งไปยัง Docker Daemon เพื่อให้มันทำงานหนักทั้งหมด Docker Client สามารถรันบนระบบเดียวกับ Docker Daemon หรือสามารถเชื่อมต่อกับ Docker Daemon ที่อยู่ระยะไกลได้
Docker Daemon
เป็นส่วนที่ทำงานหนักในการจัดการคอนเทนเนอร์ มันรับคำสั่งจาก Docker Client แล้วทำการสร้าง, รัน, และกระจายคอนเทนเนอร์ Daemon จะจัดการทุกอย่างที่เกี่ยวข้องกับคอนเทนเนอร์ เช่น การดาวน์โหลดอิมเมจจาก Docker Hub, การจัดการเน็ตเวิร์กของคอนเทนเนอร์, และการติดตามสถานะของคอนเทนเนอร์
การสื่อสารระหว่าง Docker Client และ Docker Daemon
สื่อสารกันผ่าน REST API ซึ่งสามารถใช้งานได้ทั้งผ่าน UNIX sockets หรืออินเทอร์เฟซเครือข่าย การใช้ REST API นี้ทำให้ Docker มีความยืดหยุ่นในการตั้งค่าและการจัดการคอนเทนเนอร์ต่างๆ บนระบบที่แตกต่างกัน
Docker Compose
นอกจาก Docker Client และ Docker Daemon แล้ว ยังมี Docker Compose ซึ่งเป็น Docker Client อีกตัวหนึ่ง Docker Compose ช่วยให้คุณสามารถทำงานกับแอปพลิเคชันที่ประกอบด้วยหลายคอนเทนเนอร์ได้ง่ายขึ้น โดยการกำหนดคอนฟิกทั้งหมดในไฟล์ docker-compose.yml
เพียงไฟล์เดียว Docker Compose จะช่วยจัดการการสร้างและการรันคอนเทนเนอร์หลายๆ ตัวพร้อมกัน ทำให้การจัดการแอปพลิเคชันที่ซับซ้อนง่ายขึ้นมาก
ตัวอย่างการใช้งาน Docker ในโปรเจคจริง
มมุติว่าคุณมีโปรเจคที่ใช้ฐานข้อมูล MySQL และเว็บเซิร์ฟเวอร์ Nginx คุณสามารถใช้ Docker Compose เพื่อจัดการคอนเทนเนอร์หลายๆ ตัวในโปรเจคเดียวได้อย่างง่ายดาย ตัวอย่าง docker-compose.yml
อาจมีลักษณะดังนี้
การใช้งาน Docker Compose
หลังจากสร้างไฟล์ docker-compose.yml
แล้ว คุณสามารถรันโปรเจคทั้งหมดได้ด้วยคำสั่ง
คำสั่งนี้จะสร้างและรันคอนเทนเนอร์ทั้งหมดที่กำหนดในไฟล์ docker-compose.yml โดยอัตโนมัติ
หากต้องการให้คอนเทนเนอร์ทำงานตลอดเวลา คุณสามารถใช้ flag -d
ได้
สรุป
Docker เป็นเครื่องมือที่ช่วยให้นักพัฒนาและผู้ดูแลระบบสามารถสร้าง ส่งมอบ และเรียกใช้งานแอปพลิเคชันได้อย่างมีประสิทธิภาพแ โดยใช้ Container ซึ่งทำให้แอปพลิเคชันทำงานในสภาพแวดล้อมที่แยกออกจากระบบหลักได้