> 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 หลักแสนที่ไม่ต้องจ่ายเงินเรียน 😘

## 💖 เกริ่น

คอร์สนี้ **ดช.แมวน้ำ** จะพาเพื่อนๆดำดิ่งกับเจ้าปลาวาฬสีน้ำเงินที่ชื่อว่า 🐳 **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 ของเครื่องคอมเราให้พร้อมที่จะทำงานนั่นเอง** จากที่ฟังดูก็เหมือนไม่มีอะไรยากเลยชิมิ? ตามรูปด้านล่าง

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKJZGfNEh7NYNl__2bJ%2F-MKJfAJC60XIskEw3NDV%2Fimage.png?alt=media\&token=8a203222-b79d-40a6-95ea-c8de762da1f7)

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

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKJZGfNEh7NYNl__2bJ%2F-MKJmxUUs1yaLGIwQF7g%2Fimage.png?alt=media\&token=050766b1-f9f5-47d6-8244-5ea123506b6c)

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

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

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKJZGfNEh7NYNl__2bJ%2F-MKJrHzuHpebYX_jnifz%2Fimage.png?alt=media\&token=506b2d94-0a91-46cb-8023-7eedfd1a124a)

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

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKJr_ppqyxGrB4Hb3KF%2F-MKJxKM-qM9FQVBKG_hq%2Fimage.png?alt=media\&token=e3096477-a7de-4403-949d-103364b3db20)

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

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKJxUc3EJM6lzxl9rcq%2F-MKJyrBQWK05dqUmB7cq%2Fimage.png?alt=media\&token=29e8fe66-96f5-47cc-baf2-d842dcab74f0)

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

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

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

![Docker Image ไม่ใช่ไฟล์รูปนะ 🤣](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKJz1EYhsu_1IAzqGpD%2F-MKK5tHOBE9GvlOL6m7m%2Fimage.png?alt=media\&token=efe061c0-e967-4091-a614-708e2ce50851)

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

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

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKJz1EYhsu_1IAzqGpD%2F-MKK9dbhgjVihZPaWA9k%2Fimage.png?alt=media\&token=86669035-5a45-4f76-948e-338d4cdd0632)

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

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKJz1EYhsu_1IAzqGpD%2F-MKKBahhf9GRuQsTHwpB%2Fimage.png?alt=media\&token=50fc528d-70f5-43bd-9229-33f616528547)

{% 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 %}

![ช่องทางสนับสนุนค่าอาหารแมวน้ำกั๊ฟ 😘](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-MKNgXXMPEbIB6sQztG2%2F-MKNmp9HEqzREDsXrZ0H%2Fpromptpay.png?alt=media\&token=0829926b-41a7-48d1-a515-4dea42ac4c2a)
