> For the complete documentation index, see [llms.txt](https://www.saladpuk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.saladpuk.com/basic/docker-1.md).

# 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)
