# Docker Containers

🤠 จาก [**บทความที่ 1**](https://www.saladpuk.com/basic/docker-1) เราน่าจะรู้แล้วว่าเจ้าวาฬสีน้ำเงิน 🐳 **Docker** มันช่วยให้ขาเดฟทำงานสะดวกขึ้นได้ยังไง ดังนั้นบทความนี้เรามาลองซูมดูเบื้องหลังการทำงานที่ว่านั้นกันดีก่าาา

{% hint style="success" %}
**แนะนำให้อ่าน**\
บทความนี้เป็นส่วนหนึ่งของคอร์ส [🐳 **Docker**](https://www.saladpuk.com/basic/docker-1) ที่จะสอนตั้งแต่เรื่องพื้นฐานยันระดับ master กันไปเลย ซึ่งเนื้อหาทั้งหมดจะทำให้เพื่อนๆเข้าใจและใช้งาน **Docker** โดยใช้ **Kubernetes** เป็น และสามารถสร้าง **Cluster** เพื่อนำไปใช้งานบน **Cloud Providers** ต่างๆได้ และทั้งหมดที่พูดมานั้นอ่านได้ฟรีเลย ดังนั้นหากสนใจก็สามารถกดเจ้าวาฬสีน้ำเงินเพื่อไปอ่านตั้งแต่เริ่มต้นได้ครัช 🤠
{% endhint %}

## 🚨 เท้าความเดิม

จาก [**บทความที่ 1**](https://www.saladpuk.com/basic/docker-1) เราอยากได้ Environments แบบไหน (เช่น ลง .NET 4.8, PHP 8.0 Angular 9.0 เอาไว้) เราก็จะสร้างสิ่งที่เรียกว่า 🖼️ **Docker Image** ขึ้นมา แล้วเครื่องคอมพิวเตอร์เครื่องไหนก็ตามที่เอา Docker Image นั้นไปใช้ มันก็จะถูกจัด Environments ตามที่ Docker Image นั้นระบุไว้ ตามรูปด้านล่างเบย

![](/files/-MKKw5Qt54GTe3AmudOm)

แต่เราเคยสงสัยกันป่ะว่าเจ้า 🐳 **Docker** มันทำให้ Environments ของคอมพวกนั้นเหมือนกันได้ยังไง? 🤔 ... ดังนั้นเรามาดูหัวใจของมันที่ชื่อว่า **Docker Engine** กันดีก่า

## 💝 Docker Engine

**`Docker Engine`** คือตัวทำงานอยู่เบื้องหลังของ Docker โดยมันสามารถทำงานได้หลากหลาย **OS** *(CentOS, Debian, Fedora, Oracle Linux, RHEL, SUSE, Ubuntu, Windows Server)* หรือพูดง่ายๆคือ **Windows** กับ **Linux** นั่นเอง ซึ่งต้นตระกูลของ **macOS** มันก็คือ Linux ดังนั้น Docker Engine ก็เลยทำงานกับเครื่องแมคได้เลยนั่นเอง และเมื่อรองรับทุกระบบปฎิบัติการหลักอยู่ละ เลยทำให้ตัวมันเองก็สามารถไปทำงานบน **Cloud Providers** ได้ด้วย

![](/files/-MKL8kx-XfK_udCtmQ8f)

โดยเจ้า Docker Engine มีหน้าที่ **`สร้างระบบจำลอง`** ให้มี Environments ตามที่ Docker Image ระบุไว้นั่นเอง

😳 หลายคนพออ่านถึงจุดนี้ก็อาจเอะใจคำว่า **ระบบจำลอง** ที่เจ้า Docker สร้างละว่ามันคือ **Virtual Machine** หรือ **VM** ที่เราชอบใช้กันหรือเปล่า? ดังนั้นเราจะลองซูมดูรายละเอียดกันอีกนิสสสนุง

## 🔥 Virtual Machine

รู้กันป่ะว่าคอมพิวเตอร์ที่เราใช้ๆกันอยู่นั้น เราสามารถสร้างคอมพิวเตอร์จำลองให้มันทำงานอยู่ภายในเครื่องคอมเราอีกทีได้ด้วยนะ ตามรูปด้านล่าง

![](/files/-MKLFm-uGV-xAHGrshcT)

ซึ่งการที่เราทำแบบนี้ได้ เราจะต้องใช้ **Hypervisor (**&#xE2D;ีกชื่อคือ **Hyper-V**) เข้ามาช่วยสร้างเครื่องคอมจำลองขึ้นมา และเนื่องจากมันเป็นการจำลองเครื่องคอม ดังนั้นมันก็จะต้องมีการลง OS ให้กับเครื่องจำลองพวกนั้นด้วย (OS ที่เราลงให้คอมจำลองพวกนั้นเราเรียกมันว่า **Guest OS**) ตามรูปด้านล่าง

![](/files/-MKLKc0J0o1DGZKIkjP3)

{% hint style="success" %}
**Virtual Machine**\
👍ข้อดีของการทำ Virtual Machine แบบนี้คือ **มันเป็นเครื่องจำลองที่เหมือนเครื่องคอมจริงๆ** เราต้องลง Windows ให้มันจริงๆ จะเปิดก็ต้องรอมันบูต จะปิดก็ต้องรอมัน shutdown จริงๆ และการแบ่ง RAM แบ่ง Storage ให้มันเท่าไหร่ มันก็จะใช้ได้เท่านั้นจริงๆ ดังนั้นคอมจริงๆทำอะไรได้ คอมจำลองพวกนี้ก็จะทำได้เช่นกัน\
👎ส่วนข้อเสียคือ **มันเปลืองทรัพยากรของเครื่องที่ใช้สร้าง VM ม๊ากกก** เพราะเราต้องสละ RAM สละ CPU สละ Storage ส่วนหนึ่งไปใช้ในการจำลองนั่นเอง เพราะคอมจำลองพวกนั้นก็ถูกดูแลเสมือนเป็นคอมพิวเตอร์จริงๆอีกเครื่องเลย
{% endhint %}

🤠 แต่ในทางกลับกันบริษัทที่ทำ Docker กลับมองว่าเราไม่ต้องทำแบบนั้นก็ได้นิ และเสนอแนวคิดที่เรียกว่า **`Container`** มาจัดการ **สร้างระบบจำลอง** ขึ้นมา ดังนั้นเรามาลองดูฝั่ง Docker Container กันบ้าง

## 🔥 Docker Container

บริษัทที่สร้าง Docker นั้นมองว่า ถ้าเราสามารถควบคุม Environment ของระบบจำลองนั้นๆได้ การสร้าง Guest OS ก็ไม่จำเป็นต้องทำอีกต่อไป ... ดังนั้น **Docker เลยสร้าง📦 กล่องขึ้นมา เราเรียกมันว่า `📦 Container` แล้วยัดของที่เราอยากจะควบคุมให้อยู่แค่ภายในกล่องใบนั้น** ตามรูปด้านล่าง

![](/files/-MKLU2edI6ZF_AL_n78v)

{% hint style="success" %}
**Docker Container**\
👍ข้อดีของการทำ Docker Container คือ **มันไม่หนักเครื่อง** และ **เร็วม๊ากกกกก** เพราะไม่ต้องไปสร้าง Guest OS โดยเครื่องนั้นใช้ OS อะไรก็ใช้ไป ตัว Docker แค่ไปสร้าง Container ให้มี Environments ตามแบบที่เราอยากได้ก็จบ ส่วนพวก RAM, CPU, Storage อะไรพวกนั้นก็แชร์ๆกันไปเลยไม่ต้องไปยุ่งอะไรกับมันเยอะ\
👎ส่วนข้อเสียคือ **มันเป็นแค่การจำลอง environment เท่านั้น** ทำให้เราไม่สามารถทำงานมันได้เหมือนเป็นเครื่องคอมพิวเตอร์จริงๆ และก็เคยเกิดเหตุการณ์ที่ Java สามารถมองเห็นและเข้าถึงตัว OS หลักได้จากภายใน Container (bug นี้โดนแก้แล้ว) จะเกิดอะไรขึ้นถ้าสิ่งที่หลุดออกมาสามารถโจมตี OS หลักได้?
{% endhint %}

## ⚔️ VM vs Container

ตัว VM กับ Container เป็นแนวคิดในการสร้าง Environment จำลองเหมือนกัน ซึ่งแต่ละตัวก็มี ข้อดี/ข้อเสีย ที่ไม่เหมือนกัน แต่**สำหรับการพัฒนาซอฟต์แวร์นั้น สิ่งที่เราต้องการจริงๆคือ Environment เท่านั้น** เราไม่ค่อยได้ไปยุ่งกับพวก OS หรือ Hardware มากนัก ดังนั้นเจ้า **`📦 Docker Container` เลยเหมาะสมกับการสร้างซอฟต์แวร์มากกว่า** อีกทั้งมันไม่หนักเครื่องเลยทำให้ เวลาจะสร้าง เวลาจะลบก็เร็วดุจสายฟ้า แถมยังทำงานในลักษณะ [**Infrastructure as code**](https://www.saladpuk.com/basic/devops#infrastructure-as-code-iac) หรือ [**IaC** ](https://www.saladpuk.com/basic/devops#infrastructure-as-code-iac)ซึ่งเป็นที่นิยมในการทำ [**DevOps** ](https://www.saladpuk.com/basic/devops)อีกด้วย เลยไม่น่าแปลกเลยที่เจ้าวาฬน้ำเงิน 🐳 **Docker** จะเป็นที่ถูกใจของขาเดฟทั่วโลก ( 💡 VM เราก็สามารถทำ IaC ได้เหมือนกันนะ )

![](/files/-MKNfgfiyXvbzyFEHceP)

## 🐳 Container Image

เมื่อเราเข้าใจละว่า Docker มันสร้าง Environments ให้กับเครื่องคอมพิวเตอร์ต่างๆ โดยการสร้าง Container ขึ้นมา ดังนั้นเพื่อที่จะเข้าใจให้ถูก เลยต้องย้อนกลับไปว่า **สิ่งที่ทีมสร้างมันคือ Image ของ Container นั่นเอง** ซึ่งเราเรียกมันว่า **`Container Image`** ตามรูปด้าน

![](/files/-MKLXv-0S3lb_FvQooC7)

และเมื่อเราเอา **Container Image** มาทำงานที่คอมพิวเตอร์เครื่องไหนก็ตาม มันก็จะถูก Docker Engine เอาไปสร้างเป็น **`📦 Container`** โดยภายใน container ก็จะมี Environments ตรงตามที่ Container Image ระบุไว้ ตามรูปด้านล่างเบย

![](/files/-MKLcA94-OINh_bhC8ZY)

และถ้าเราเอา Container Image หลายๆอันมาใช้ภายในคอมพิวเตอร์เครื่องเดียวกัน เจ้า Docker Engine ก็จะทำการสร้าง Container ตามที่ถูกกำหนดไว้ใน Container Image แต่ละตัวนั่นเอง ตามรูปด้านล่าง

![](/files/-MKLh1LU3jp2zPaZPa0q)

จากที่ว่ามาทั้งหมด เราเลยจะเห็นโลโก้ของเจ้าวาฬน้ำเงิน 🐳 แบกตู้คอนเทนเนอร์ ตามรูปด้านล่างยังไงล่าา

![](/files/-MKNvVybshYIpfDig-wl)

🤠 เอาละ **ดช.แมวน้ำ** คิดว่าอธิบายทฤษฎีมาเยอะพอสมควรละ และหลายๆคนก็น่าจะเริ่มคันมืออยากลองเล่น Docker กันละ ดังนั้นในบทความถัดไปเราจะมาลองติดตั้งและใช้งาน Docker ตามทฤษฎีทั้งหมดที่ว่ามากันดีกว่า

{% content-ref url="/pages/-MKQQZNoeAmxK-p50Hk\_" %}
[Docker Exercise 01](/basic/docker-1/exercise01.md)
{% endcontent-ref %}

{% hint style="success" %}
อ่านแล้วชอบป๋มก็ขอฝากแชร์ หรือกดติดตามเพื่อจะได้ไม่พลาดบทความอื่นๆจาก **ดช.แมวน้ำ** ได้จากลิงค์นี้เบยครัช [**Saladpuk Fanclub**](https://www.facebook.com/mr.saladpuk/?modal=admin_todo_tour) **😍**
{% endhint %}

![ช่องทางสนับสนุนค่าอาหารแมวน้ำกั๊ฟ 😘](/files/-MKNmp9HEqzREDsXrZ0H)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.saladpuk.com/basic/docker-1/containers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
