# Docker

## 💖 เกริ่น

คอร์สนี้ **ดช.แมวน้ำ** จะพาเพื่อนๆดำดิ่งกับเจ้าปลาวาฬสีน้ำเงินที่ชื่อว่า 🐳 **Docker** ตั้งแต่ความรู้พื้นฐานยันระดับ master กันไปเลย ซึ่งแมวน้ำเชื่อว่ามันจะเป็นคอร์สฟรีที่ให้ความรู้เท่าคอร์สที่ต้องจ่ายเงินหลักแสนแน่นอนฮ๊าฟ

{% hint style="success" %}
**ความในใจ**\
สาเหตุที่ตั้งคอร์สนี้ขึ้นมาเพราะ **อยากส่งมอบความรู้ที่สมบูรณ์ให้ได้มากที่สุดแก่สังคมที่ผมรัก** เพราะเรื่อง docker ในเบื้องลึกนั้นมันไม่ได้ง่ายแบบที่หลายๆคนเข้าใจ ดังนั้นถ้าใครเห็นเห็นจุดไหนอธิบายผิดไป หรืออยากเสริมตรงไหน โปรดอย่าได้รอช้าทำ Pull request หรือส่งข้อความหาผมได้ที่ลิงค์นี้เบยครัช <https://www.facebook.com/mr.saladpuk>
{% endhint %}

> เนื้อหาของ Docker ที่จะเอามาอธิบายมันเยอะม๊วกกกก แต่หลักๆที่อ่านจบผมรับรองว่าเราจะรู้จักและใช้งาน **Docker** ได้ สามารถจัดการ **Microservices** ด้วย **Kubernetes** เป็น และสามารถนำไปสร้าง **Cluster** บนผู้ให้บริการ **Cloud Computing** ได้แน่นอนครับ ... ซึ่งอย่างที่บอกแต่ละเรื่องมันสามารถแตกมาเป็นคอร์สของมันเองได้เลย ดังนั้นผมจะขอไล่ไต่ระดับไปทีละเรื่อง และบางเรื่องจะขอแยกออกมาเป็นคอร์สของมันอีกทีนะกั๊ฟ 🤠

## 🤔 Docker คือไย? ทำไมนิยมจุง?

### 😢 ปัญหา

สมมุติว่าเราต้องเขียนเว็บซักตัวที่ต้องต่อ database เราต้องทำไงบ้าง? ... อย่างแรกเลยเราต้องติดตั้งโปรแกรมต่างๆในเครื่องเราก่อนชิมิ เช่นคนเขียน php ก็ต้องติดตั้ง Apache หรือ Java ก็ต้องติดตั้ง JDK, Node, .NET บลาๆแล้วแต่ว่าเราจะเขียนเว็บด้วยอะไร ส่วนตัว database เราก็ต้องไปติดตั้งมันเช่นกัน SQL, MySQL, MongoDB บลาๆขึ้นอยู่กับเราจะใช้ database ตัวไหน หรือพูดแบบรวบรัดง่ายๆคือ **เราต้องเตรียม Environment ของเครื่องคอมเราให้พร้อมที่จะทำงานนั่นเอง** จากที่ฟังดูก็เหมือนไม่มีอะไรยากเลยชิมิ? ตามรูปด้านล่าง

![](/files/-MKJfAJC60XIskEw3NDV)

แต่เวลาที่เราทำงานกันเป็นทีมจริงๆเราก็จะพบว่า ทุกคนในทีมก็ต้องเตรียม Environment แบบเดียวกัน จะได้ทำงานด้วยกันได้ ซึ่งเราก็จะพบกับความหฤหรรษ์ว่า บางคนใช้ **Windows** บางคนใช้ **MacOS** บางคนใช้ **Linux** และแม้แต่กระทั่ง **Software Version** ก็ยังเป็นคนละตัวกันอีกต่างหาก ตามรูปเบย

![](/files/-MKJmxUUs1yaLGIwQF7g)

{% hint style="danger" %}
**ข้อควรระวัง**\
บ่อยครั้งที่เราไม่สนใจว่าเครื่องแต่ละคนเป็นยังไงใครอยากใช้อะไรก็ใช้ไป มันจะทำให้เรามองไม่เห็นปัญหา เช่น การเขียนโค้ดแบบนี้มันทำงานได้กับ version นี้เท่านั้น พอไปทำงานที่เครื่องอื่นที่ไม่ได้ใช้ version นั้นๆ มันก็จะทำงานไม่ได้ ทำให้เกิดปัญหาที่หลายๆคนมักจะได้ยินว่า **"ที่เครื่องผมมันทำงานได้นะ"** งุยล่ะ
{% endhint %}

สมมุติว่าเคลียกับคนในทีมจนได้ environments เหมือนกันทั้งทีมละ สุดท้ายเราก็ต้องเอาเว็บที่เราเขียนเสร็จ ไปทำงานที่เครื่องเซิฟเวอร์ซักตัว ซึ่งคำถามคือ ... **เจ้าเซิฟเวอร์เครื่องนั้นมันถูกตั้ง Environments เหมือนกับของเราหรือเปล่า?**

![](/files/-MKJrHzuHpebYX_jnifz)

สมมุติอีกว่าตั้งค่าต่างๆของเซิฟเวอร์ได้ไม่มีปัญหาละกัน ซึ่งอยู่มาวันหนึ่งคนเข้าชมเว็บเยอะขึ้นเราก็ต้อง**ขยายเซิฟเวอร์เพื่อรองรับผู้ใช้ปริมาณมากๆ** ... แล้วเครื่องเซิฟเวอร์ที่เราขยายเพิ่มขึ้นมา เราจะตั้งค่า Environment พวกนั้นยังไง? พวกมันจะคุยกันยังไง? Network ล่ะ? Infrastructure บลาๆ

![](/files/-MKJxKM-qM9FQVBKG_hq)

จากปัญหาที่ว่ามาก็น่าจะพอเห็นภาพแบบคร่าวๆแล้วล่ะว่า

![](/files/-MKJyrBQWK05dqUmB7cq)

### 😄 วิธีแก้ปัญหา

ซึ่งแน่นอนว่าปัญหาที่เราเจอ ขาเดฟทั่วโลกก็เจอปัญหานี้เช่นกัลล์ ซึ่งหนึ่งในการแก้ปัญหาแบบนี้ที่กำลังได้รับการนิยมอยู่ก็คือการใช้ 🐳 **Docker** นั่นเอง ซึ่งมันจะช่วยเราได้ยังไงลองย้อนกลับไปที่จุดเริ่มต้นกันนิสสส์นุง

เมื่อเรา/ทีมจะเขียนอะไรก็ตาม **เราก็จะตกลงกันให้เรียบร้อยว่าจะใช้ Environments เป็นแบบไหน แล้วเราก็จะสร้างสิ่งที่เรียกว่า** 🖼️ **Docker Image ขึ้นมา** *(ขออธิบายให้เข้าใจง่ายๆแบบนี้ก่อนละกันนะ)*

![Docker Image ไม่ใช่ไฟล์รูปนะ 🤣](/files/-MKK5tHOBE9GvlOL6m7m)

{% hint style="success" %}
**Docker Image**\
คล้ายๆกับการที่เราทำ Backup Image ที่มันจะจำสถานะทุกอย่างที่เรากำหนดเอาไว้ เช่น ลงโปรแกรมอะไรไว้ เวอร์ชั่นเท่าไหร่ ของต่างๆถูกตั้งค่าเอาไว้ยังไง บลาๆ แล้วใครก็ตามที่เอา Image ไปใช้ก็จะได้สถานะ Environments ทุกอย่างตามที่ Image ถูกตั้งค่าไว้นั่นเอง
{% endhint %}

หลังจากที่ได้ Docker Image ละถัดมา **ทุกคนในทีมก็จะใช้** 🖼️ **Docker Image ตัวนั้นอีกที** โดยเจ้า Docker Image จะจัดการ Environments ทุกอย่างให้เป็นไปตามที่มันถูกระบุไว้ ตามรูปด้านล่างเบย

![](/files/-MKK9dbhgjVihZPaWA9k)

และแน่นอนที่เซิฟเวอร์ก็สามารถเอาไปใช้ได้ และรวมถึงการทำ Server Scaling ก็เช่นกัน

![](/files/-MKKBahhf9GRuQsTHwpB)

{% hint style="warning" %}
**คำเตือน**\
การทำ Scaling โดยใช้ Docker ไม่ได้ง่ายแบบในตัวอย่างนะจ๊ะ ซึ่งเนื้อหาทั้งหมดของการทำ Orchestration ทั้งหมดแมวน้ำจะขอแยกไปไว้ในคอร์ส **Kubernetes** นะกั๊ฟ เพราะในคอร์สนี้จะขอเน้นเรื่อง Docker เพียงอย่างเดียวไปก่อนนั่นเองฮ๊าฟ
{% endhint %}

อาววล๊า เพียงเท่านี้ก็น่าจะพอเห็นภาพกันแล้วนะว่าทำไมเจ้าวาฬน้ำเงิน🐳 **Docker**  ถึงได้เป็นที่นิยมกันจุง และน่าจะเพียงพอต่อการตัดสินใจว่าควรจะสละเวลาตีพุงดู Netflix ของเรามานั่งศึกษามันอ่ะป่าวละ ดังนั้นในบทความถัดไปของคอร์สนี้เดี๋ยวเราจะมาเริ่มลงรายละเอียดและลองใช้ Docker กันดูบ้างดีก่าฮั๊ฟ 😘

{% content-ref url="/pages/-MKKqd-Cbe3f-5JRHCPQ" %}
[Docker Containers](/basic/docker-1/containers.md)
{% endcontent-ref %}

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

* [👶 Docker ขั้นพื้นฐาน](https://www.saladpuk.com/basic/docker)
* [👶 Microservices พื้นฐาน](https://www.saladpuk.com/basic/microservices)
* [👶 Azure Service Fabric](https://www.saladpuk.com/cloud/azure-service-fabric)
  {% 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.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.
