พื้นฐาน Docker


ก่อนจะ รู้จัก Docker มาทำความรู้จัก Container ก่อน

Container

  • คือ ที่ ที่มีสภาพแวดล้อมเฉพาะสำหรับรัน service ต่างๆ โดยไม่ต้องจำลอง OS หรือมีการจองพื้นที่และหน่วยความจำ
  • อาศัยทรัพยากรจากเครื่องหลักที่มี

images?q=tbn%3AANd9GcTT8RChNraIv78Y7L52NMoS6P7xmxpgTZvgKUVeStoOT384Lk3_

Software Container

  • แนวคิดการสร้างเครื่องมือหรือซอฟต์แวร์ที่ใช้จัดการและควบคุม Container
  • จำลองสภาพแวดล้อมเพื่อการใช้งาน service นั้นๆ
  • ช่วยจัดการ ให้แต่ละ service ทำงานได้ โดยที่แต่ละ service ไม่ทำงานรบกวนกัน
  • ทุก service สามารถ คุยกันได้

Software Container นอกจาก Docker ยังมีตัวอื่นๆ เช่น

  • Google Kubernetes Engine ( GKE )
  • Amazon ECS
  • หรือ อย่าง Linux ที่มี software Containers ( LXC ) เขียนโดย C, Python, Shell, Lua.

Docker คือ อะไร ?

  • Docker engine ตัวหนึ่งที่มีการทำงานในลักษณะจำลองสภาพแวดล้อมขึ้นมาบนเครื่อง server ลักษณะแบบ Virtual Environment (VE) เพื่อใช้ในการ run service ที่ต้องการ มีการทำงานคล้ายคลึงกับ Virtual Machine ( VM )

Virtual Machine vs Virtual Environment

ทั้งสองตัว มีประโยชน์ในการ ที่สามารถจำลอง สภาพแวดล้อม เพื่อรัน service

  • Virtual Machine การจำลอง สภาพแวดล้อมต่างๆขึ้นมา โดยมี การจอง cpu ram harddisk เสมือนเป็นอีกเครื่องนึง

  • Virtual Environment คล้าย Virtual Machine แต่ต่างการที่ Virtual Environment ไม่มีการจอง cpu ram harddisk แต่จะอาศัยทรัพยากร จากเครื่องที่มี

images?q=tbn%3AANd9GcQyETHt-gkuVRx-B1IeKEPt3vVDRDZ4EIOwwHHxKYztnwET5XJv


ทำไมต้องใช้ Docker

  • โดยปกติแล้ว เวลาเราจะรัน service ใดๆ ก็ตาม สิ่งที่ทำคือ ติดตั้งอะไรต่างๆที่จำเป็นสำหรับ service นั้นๆ บน OS ใดๆ แต่สำหรับ Docker จะใช้ Container ในการจำลองสภาพแวดล้อมขึ้นมา เพื่อ service นั้นๆ โดยไม่มีส่วน ของ OS เข้ามาเกี่ยว
  • ป้องกันการทำงานรบกวนกัน ในกรณีที่ เครื่องเรา อาจมี service มากกว่า 1 service และอาจใช้ port ที่ทับกัน
  • ช่วยลดเวลาในการขึ้น production หรือมีการนำไป deploy ตามเครื่องต่างๆ ตาม สโลแกน “Build Once Run Everywhere”

ข้อจำกัดของ Docker

  • OS ที่รัน Docker ได้จะต้องเป็น Linux เท่านั้น เพราะอย่างที่ได้กล่าวไปว่า มันทำงานอยู่บน LXC ที่อยู่บน Linux ถ้าเราต้องการรันบน OS อื่น เราก็ต้องทำการจำลอง Linux ขึ้นมา ( VMs )

โครงสร้างของ Docker

แบ่งหลักๆ เป็น 4 ส่วน

  • Docker Client ( docker engine )

ส่วนของ engine สำหรับ รันคำสังต่างๆของ docker ( run , build , images , push , … )

engine-components-flow.png

  • The Docker daemon ( dockerd )

ส่วนนึงภายใน Docker Host ตัวรับคำสั่งที่ส่งมาจาก Docker Cilent และนำมาจัดการสิ่งที่เรียกว่า Docker Object ภายในอีกที

  • Docker Daemon

ส่วนนึงภายใน docker host ที่ใช้ สำหรับ จัดการ container ต่างๆ (dockerd)

  • Docker Registry

ที่เก็บ docker image (image repository) สำหรับ ใน run ภายใน container มี ที่เก็บหลักชื่อว่า Docker Hub ซึ่งเป็น ที่เก็บ images ที่มีใช้อยู่ทั่วไป และยังมี Private Registry ที่เราสามารถสร้างใช้เองได้เช่นกัน

1*qflwrydBkx5DSFUUxRuy-w.png

  • Docker objects

เป็นการเรียกพวก images,container,networks,volumes .. แบบสั่นๆ

  • IMAGES

คือ Template ตัว service ที่เราต้องการจะใช่ เช่น ubuntu node nginx ,..

  • CONTAINERS

คือส่วนที่เป็นการเอา images มา run เพื่อใช้งาน

ตัวอย่าง docker run เช่น

$ docker run ubuntu pwd

สิ่งที่จะเกิดขึ้นคือ

  • ถ้าไม่มี images ubuntu อยู่ในเครื่อง มันจะทำการ pull images จาก docker hub ลงมา
  • จากนั้นเมื่อมี images แล้ว docker จะทำการ สร้าง container ขึ้นมาในสถานะ created
  • จากนั้น docker จะทำการเชื่อมต่อ network ซึ่งถ้าไม่มีการกำหนด มันจะใช้ network default ที่มี
  • จากนั้น docker จะขึ้นสถานะ running แล้ว run command pwd จากที่เราพิมพ์ไป ใน container นี้