Docker คือ
Docker คือเครื่องมือที่ใช้จำลองสภาพแวดล้อม(Virtual Environment) ขึ้นมาให้เหมาะสมกับ Application นั้นๆ โดยภายใน Docker จะประกอบไปด้วย Container ซึ่งภายใน 1 Docker สามารถประกอบไปด้วยหลายๆ Container โดยแต่ละ Container ก็จะมีรายละเอียดแตกต่างกันออกไปเช่น Libraries, Code, Application และ Config ต่างๆ เป็นต้น ซึ่งการทำงานเช่นนี้จะทำให้เราสามารถจำลองสภาพแวดล้อมได้อย่างง่ายและรวดเร็ว แต่ก่อนนั้นการจำลองสภาพแวดล้อมขึ้นจะใช้การทำ Virtual Machines แต่การทำเช่นนี้จะใช้ทรัพยากรของเครื่องคอมพิวเตอร์ค่อนข้างสูงเช่น Memory ใช้เวลา Set-up นานเป็นต้น ซึ่ง Docker นั้นสามารถแก้ปัญหาหลายๆอย่างได้ จึงนิยมใช้ Docker ในปัจจุบัน
ตัวอย่างที่สามารถอธิบายเพื่อให้เห็นภาพการจำลองสภาพแวดล้อมได้ชัดขึ้นเช่น สมมติเรามีที่ดินแปลงหนึ่งซึ่งผืนที่ดินเปรียบได้กับ Docker ที่ภายในผืนที่ดินเดียวกันจะมีโครงสร้างที่คล้ายๆกันเช่น แร่ธาตุในดิน ความชื้น เป็นต้น หากเรามีที่ดินมากและเราต้องการปลูกพืชหลายๆชนิดในพื้นที่ดินเดียวกันเราก็จะแบ่งพืชออกเป็นแปลงๆเช่นแปลงนี้ปลูกข้าว แปลงนี้ปลูกข้าวโพด ซึ่งการแบ่งพืชออกเป็นแปลงนี้ก็เปรียบเสมือนการสร้าง Container ขึ้นมา เพราะสภาพแวดล้อมของแต่ละแปลงนี้จะแตกต่างกันออกไป ข้าวเป็นพืชที่ต้องการน้ำมาก ส่วนข้าวโพดเป็นพืชที่ต้องการน้ำน้อย เราสามารถสร้างสภาพแวดล้อมขึ้นมาให้เหมาะสมกับพืชที่เราจะปลูกได้
Docker Architecture
Docker Architecture | ที่มา |
ปกติแล้วเราจะใช้งานฝั่ง Docker Client ซึ่งสามารถ Build Pull หรือ Run Docker Containers ได้ ทั้งหมดนี้จะเรียกใช้งานผ่าน Docker Daemon ทั้งสองตัวนั้นจะติดต่อผ่าน REST API เมื่อ Docker Daemon รับคำสั่งฝั่ง Client มาแล้ว จะติดต่อสื่อสารกับ Image Container และ Volumes เป็นต้น
ส่วนประกอบของ Docker
Docker Client and Server การติดต่อระหว่าง Docker Client และ Docker Server นั้นจะใช้ REST API เราสามารถเรียก Docker Client ผ่าน Terminal ได้โดยเราสามารถ Build Pull และ Run ผ่าน Docker Client ไปยัง Docker Server ได้
Docker Image คือตัวต้นแบบของ Container หากมีค่าบางอย่างที่ทุก Container จะใช้งาน ก็สามารถ Config ค่าเหล่านั้นได้ที่ Docker Image เพื่อเป็นต้นแบบให้กับทุก Container โดยภายใน Docker Image สามารถประกอบไปด้วยหลาย Container ได้
Docker Container เป็นตัวที่จะนำ Docker Image มาติดตั้งและใช้สำหรับการ Run Application ต่างๆ ซึ่งเราสามารถ Run Container หลายตัวขึ้นมาได้ภายใต้ Infrastructure เดียวกัน โดยแต่ละ Container สามารถจำลองสภาพแวดล้อมของแต่ละ Container ขึ้นมาเองได้ เช่น Libraries, RAM, CPU, Database และ Config ต่างๆ
Docker Registry เป็นตัวที่เก็บ Image การที่เราจะเรียกใช้งาน Docker Image ได้นั้นเราจะใช้ Docker Registry เพื่อเรียกใช้งาน เพราะ Docker Image นั้นเป็น Public คือใครๆก็สามารถเข้าถึงได้เช่น ในทีมมี Developer 10 คนก็จะ Pull Docker Image นี้ลงมายังเครื่องของตัวเองหรือเราเป็นเจ้าของ Image คนเดียว(Private Image) ซึ่งมันจะทำให้เราเป็นเจ้าของ Environment ได้ เพราะหาก Docker Image มีการเปลี่ยนแต่ถ้าเรายังไม่ Pull ลงมาเราก็จะได้ Version เก่า แต่หากอยากได้ Version ใหม่ก็แค่ Pull ลงมาซึ่งทั้งหมดนี้เราสามารถควบคุมเองได้
ประโยชน์ของ Docker
- Docker มีขนาดเล็ก สามารถติดตั้งและใช้งานได้อย่างรวดเร็ว
- สามารถสร้างเพิ่มหรือลด Container ได้ตามความต้องการ(Scalability)
- ไม่พึ่งพาระบบภายนอกในการ Run Applications เนื่องจากตัว Container เองจะติดต่อกับ Host เท่านั้นและในการ Run แต่ละครั้งก็ใช้ทรัพยากรน้อย
- ในกรณีที่เราพบปริมาณข้อมูลที่ใหญ่มากๆ(Data Volumes) ในการทำงานของ Container จะมีการใช้ทรัพยากรของเครื่อง Container อื่นๆร่วมกัน
- สามารถ Share Docker ให้กับเพื่อนร่วมงานได้ ในกรณีที่เรามีการแก้ไข Docker แล้วต้องการแบ่งปันให้กับคนอื่นๆ เราแค่ Push ไปเก็บไว้ที่ Registry จากนั้นคนอื่นๆที่ต้องการใช้ก็ แค่ Pull ลงมายังเครื่อง Local ของตัวเอง
- ช่วยให้การ Sync Environment ง่ายขึ้น บางทีในเครื่อง Local เราอาจจะเป็น Image ที่เก่ากว่าของปัจจุบัน ถ้าอยากอัพเดทให้ใหม่ขึ้นก็เพียงแค่ Pull Image จาก Registry ลงจะตัดปัญหาในกรณีที่ Environment ไม่ตรงได้
รู้จัก Kubernetes ซักหน่อย
เมื่อพูดถึง Containers แล้วก็ต้องพูดถึง Kubernetes เพราะ 2 สิ่งนี้มีความเกี่ยวข้องกัน Kubernetes (K8S) คือเครื่องมือที่ช่วยจัดการ Containers เพื่อให้สามารถจัดการบริหารทรัพยากร Application ให้เกิดประสิทธิภาพสูงสุดและสนับสนุนการทำงานได้แบบอัตโนมัติต่างๆเช่น Automated Deploy รวมถึงยังเป็นตัวที่คอยสั่งการ และควบคุมการทำงานของ Containers ด้วย ภายใน Kubernetes จะมีหน่วยที่เล็กที่สุดชื่อว่า Pods เอาไว้ระบุถึง Containers ภายใน Pods อาจจะมีหลายๆ Containers ก็ได้แต่โดยทั่วไปจะมีไม่เกิน 2 Containers สิ่งที่เป็นจุดเด่นของ Kubernetes ที่ใช้ในการช่วยจัดการคือ Replication Controllers เป็นตัวจัดการว่าใน Application เราจะต้องมีกี่ Pods ซึ่งการทำการตรงนี้จะช่วยให้สามารถ Copy Pods ขึ้นมาได้ ทำให้เราสามารถ Scaling ไม่ว่าจะ Up หรือ Down ตัว Applicaiton ได้อย่างง่ายดาย