<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tossapol Ritcharoenwattu</title>
    <description>The latest articles on DEV Community by Tossapol Ritcharoenwattu (@cross1308).</description>
    <link>https://dev.to/cross1308</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3322328%2Faad2a492-57fc-4748-a197-79bb6161c69c.jpg</url>
      <title>DEV Community: Tossapol Ritcharoenwattu</title>
      <link>https://dev.to/cross1308</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cross1308"/>
    <language>en</language>
    <item>
      <title>Git : ความสำคัญของ tag</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Tue, 15 Jul 2025 10:10:48 +0000</pubDate>
      <link>https://dev.to/cross1308/git-khwaamsamkhaykhng-tag-44e5</link>
      <guid>https://dev.to/cross1308/git-khwaamsamkhaykhng-tag-44e5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Tag ใน Git คืออะไร?&lt;/strong&gt;&lt;br&gt;
Tag ใน Git คือ ป้ายชื่อ (label) ที่เราติดไว้กับ commit เพื่อบอกว่า commit นี้สำคัญ เช่น release เวอร์ชัน&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ทำไมต้องใช้ tag?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;บอกเวอร์ชันที่ deploy ไปแล้ว เช่น v1.0.0&lt;/li&gt;
&lt;li&gt;ช่วยให้ทีมรู้ว่าต้อง checkout commit ไหน&lt;/li&gt;
&lt;li&gt;ใช้ใน CI/CD → เช่น pipeline ที่จะ deploy เฉพาะ tag&lt;/li&gt;
&lt;li&gt;เวลากลับไปแก้ bug → รู้ว่าต้องแก้บนเวอร์ชันไหน&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Git มี 2 ประเภทหลักๆ&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lightweight Tag
คล้าย bookmark → แค่บอกว่า tag ชี้ไปที่ commit ไหน
ไม่มีข้อมูล extra เช่น ชื่อคนสร้างหรือข้อความ
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git tag v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvuqwqgx8tjolxd3tmwev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvuqwqgx8tjolxd3tmwev.png" alt=" " width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Annotated Tag
เป็น tag แบบจริงจัง ที่เก็บ:&lt;/li&gt;
&lt;li&gt;ชื่อคนสร้าง&lt;/li&gt;
&lt;li&gt;อีเมล&lt;/li&gt;
&lt;li&gt;วันเวลา&lt;/li&gt;
&lt;li&gt;message อธิบาย release&lt;/li&gt;
&lt;li&gt;ใช้ทำ release บ่อยที่สุด
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git tag -a v1.0.0 -m "Release version 1.0.0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;หรือระบุ commit ที่จะ tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git tag -a v1.0.0 a1b2c3d4 -m "Release version 1.0.0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;แสดง tag ที่มีทั้งหมด&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git tag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ดูรายละเอียด tag&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git show v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1seubz9n3usi7nt7783.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1seubz9n3usi7nt7783.png" alt=" " width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Push tag ขึ้น Remote&lt;/strong&gt;&lt;br&gt;
สำคัญมาก! → tag ไม่ถูก push ขึ้น remote อัตโนมัติ ถ้าไม่สั่งเอง&lt;/p&gt;

&lt;p&gt;Push tag เดี่ยว&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push tag ทั้งหมด&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin --tags
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ลบ tag&lt;/strong&gt;&lt;br&gt;
ลบใน local&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git tag -d v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ลบบน remote&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin --delete v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Git : เริ่มต้นใช้ Git ตั้งค่า และสร้าง repository</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Tue, 15 Jul 2025 03:38:17 +0000</pubDate>
      <link>https://dev.to/cross1308/git-erimtnaich-git-tangkhaa-4o5o</link>
      <guid>https://dev.to/cross1308/git-erimtnaich-git-tangkhaa-4o5o</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;ตั้งค่าเริ่มต้น&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;เริ่มต้นใช้งาน git ที่ต้องทำในครั้งแรกเลย คือ การบอก git ว่าเราคือใคร ขั้นตอนนี้ทำครั้งเดียว&lt;br&gt;
setup name and email&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.name "Tossapol"
git config --global user.email = "youremail@domain.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจากตั้งค่าเสร็จ ลอง เช็คดูว่า git รู้จักเราหรือยัง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.name
git config --global user.email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8oiuhjljrp85g6lbiza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx8oiuhjljrp85g6lbiza.png" alt=" " width="572" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เราสามารถเช็คดูค่า config ของ git ที่ตั้งค่าไว้ได้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7efjtwg5a3ncygg1ztqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7efjtwg5a3ncygg1ztqa.png" alt=" " width="569" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;กรณีสร้าง Project ใหม่ Create project on GitLab&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Create gitlab project&lt;/strong&gt;&lt;br&gt;
ให้เราสร้าง blank project ใน gitlab โดยไม่ต้อง add readme &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgulfkf9znn6bm9zlvxso.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgulfkf9znn6bm9zlvxso.png" alt=" " width="800" height="791"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone project จาก Gitlab ลงมายังเครื่องเราเอง
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://gitlab.com/tossapol.rit/demogitlab1.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ohij0fvmx3hnhyy950t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ohij0fvmx3hnhyy950t.png" alt=" " width="800" height="212"&gt;&lt;/a&gt;&lt;br&gt;
หลังจาก clone เสร็จแล้ว ให้เรา cd เข้าไปยัง foler project และ run command เพื่อบอกว่า เราต้องการทำงานอยู่ที่ branch ไหน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd demogitlab1
git switch --create main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjihp8lund6o3y5z81sdf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjihp8lund6o3y5z81sdf.png" alt=" " width="800" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ทดลองสร้างไฟล์ readme และ push ขึ้นไปยัง gitlab
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch README.md
git add README.md
git commit -m "add README"
git push --set-upstream origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9wuk95t46taq010fas1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9wuk95t46taq010fas1m.png" alt=" " width="800" height="681"&gt;&lt;/a&gt;&lt;br&gt;
ลอง reload project บน gitlab ดูจะพบว่ามี file README.md &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzd95scqqayv4utj8yno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzd95scqqayv4utj8yno.png" alt=" " width="800" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ข้อควรระวังมากๆ ของการ สั่ง git push&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;อาจจะเคยเห็นมีการส่ง argument -uf ไปด้วย สิ่งนี้ เอามาอธิบายเพิ่มเติมคือ&lt;br&gt;
 u = set-upstream เอาไว้สำหรับ run ครั้งแรกครั้งเดียว&lt;br&gt;
 f = force ส่วนนี้ปกติไม่ควรใช้เป็นอย่างยิ่ง เพราะจะทำให้ ประวัติการแก้ไขหาย&lt;/p&gt;

</description>
      <category>git</category>
      <category>cli</category>
      <category>productivity</category>
      <category>howto</category>
    </item>
    <item>
      <title>Docker Lesson 2 : มาลองสร้าง image กัน</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Mon, 14 Jul 2025 09:38:18 +0000</pubDate>
      <link>https://dev.to/cross1308/docker-lesson-2-maalngsraang-image-kan-4ond</link>
      <guid>https://dev.to/cross1308/docker-lesson-2-maalngsraang-image-kan-4ond</guid>
      <description>&lt;p&gt;เราจะมาลองสร้าง image ของ web บน ubuntu ด้วย python flask กัน&lt;br&gt;
สิ่งที่เราจะทำ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;OS Ubuntu&lt;/li&gt;
&lt;li&gt;Update apt repo&lt;/li&gt;
&lt;li&gt;Install dependencies using apt&lt;/li&gt;
&lt;li&gt;Install python dependencies using pip&lt;/li&gt;
&lt;li&gt;Copy source code to /opt/ folder&lt;/li&gt;
&lt;li&gt;Run the web server using flask command&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;สร้าง app.py ก่อน&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import os
from flask import Flask
app = Flask(__name__)

@app.route("/")
def main():
    return "Welcome!"

@app.route('/how are you')
def hello():
    return 'I am good, how about you?'

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ทดลองสร้าง image แบบ manual กันดูก่อน&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;run docker จาก image ubuntu และเปิด bash ใน container
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -it -p 5001:5000 ubuntu bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;ติดตั้ง python และ virtual envieroment
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apt-get update
apt-get install -y python3 python3-pip python3-venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy550whe7vz54v591ji6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy550whe7vz54v591ji6u.png" alt=" " width="800" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;สร้าง virtualenv
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m venv /opt/venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Activate virtualenv
สำคัญมาก → ทุกครั้งที่จะใช้ venv → ต้อง activate ก่อน:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source /opt/venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fei9dn1fhdmrlvhzei4qc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fei9dn1fhdmrlvhzei4qc.png" alt=" " width="800" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;อัปเกรด pip ใน venv
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install --upgrade pip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98p3n9qqi5tvw5bd2orb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98p3n9qqi5tvw5bd2orb.png" alt=" " width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ติดตั้ง Flask ใน venv
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install flask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1ezr5qjkm93q3lp3w5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1ezr5qjkm93q3lp3w5n.png" alt=" " width="800" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ตรวจสอบว่า Flask ติดตั้งแล้วหรือยัง
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flask --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a2c18ooc74k2236lso1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3a2c18ooc74k2236lso1.png" alt=" " width="800" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy app.py เข้าไป
เปิด terminal ใหม่
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker cp app.py &amp;lt;container_id&amp;gt;:/opt/source-code/app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkw4fyqa36smxjvkka1u3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkw4fyqa36smxjvkka1u3.png" alt=" " width="800" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;cd เข้า directory ที่มี app.py
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /opt/source-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;export FLASK_APP
อย่าใช้ path ตรง ๆ เพราะ import จะ error → ใช้ชื่อ module
เช่น ถ้าไฟล์คือ app.py → ต้อง export FLASK_APP=app
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export FLASK_APP=app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;รัน flask
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flask run --host=0.0.0.0 --port=5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3inoc1y5ps7581jd6nm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3inoc1y5ps7581jd6nm.png" alt=" " width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12 : ลองเข้า web url : &lt;a href="http://localhost:5001" rel="noopener noreferrer"&gt;http://localhost:5001&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi02yuzi4a135l7z6grhq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi02yuzi4a135l7z6grhq.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;br&gt;
เข้าได้ปกติ ทีนี้เราจะมาสร้าง dockerfile ตาม step ที่ทำมากัน&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;สร้าง Dockerfile&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM ubuntu:latest

# ติดตั้ง python + pip + venv
RUN apt-get update &amp;amp;&amp;amp; \
    apt-get install -y python3 python3-pip python3-venv

# สร้าง virtualenv
RUN python3 -m venv /opt/venv

# ติดตั้ง flask ใน venv
RUN /opt/venv/bin/pip install --upgrade pip &amp;amp;&amp;amp; \
    /opt/venv/bin/pip install flask

# Copy app.py เข้า container
COPY app.py /opt/source-code/app.py

# set PATH → ใช้ venv
ENV PATH="/opt/venv/bin:$PATH"
ENV FLASK_APP=/opt/source-code/app.py
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;เสร็จแล้ว build image ด้วย command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build Dockerfile -t tossapol/my-custom-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44k939rvzbadw6huqhlx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44k939rvzbadw6huqhlx.png" alt=" " width="800" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;จะพบว่ามี image ที่เราสร้างขึ้น&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshzffq0oiyshqdxkpy99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshzffq0oiyshqdxkpy99.png" alt=" " width="800" height="184"&gt;&lt;/a&gt;&lt;br&gt;
ลองสร้าง container จาก image my-custom-app&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpasxv9m55wdwvjwwafzv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpasxv9m55wdwvjwwafzv.png" alt=" " width="800" height="76"&gt;&lt;/a&gt;&lt;br&gt;
เราจะสามารถใช้งาน app ที่เราทำไว้ได้ทันที&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0v8gvxfd9is369i8arff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0v8gvxfd9is369i8arff.png" alt=" " width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Docker Lesson 1 : Basic Docker command</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Mon, 14 Jul 2025 03:00:10 +0000</pubDate>
      <link>https://dev.to/cross1308/docker-lesson-1-basic-docker-command-26jb</link>
      <guid>https://dev.to/cross1308/docker-lesson-1-basic-docker-command-26jb</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. docker run&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -p 8080:80 --name my-nginx nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ดึง image ชื่อ nginx (ถ้าไม่มีใน local)&lt;br&gt;
สร้าง container&lt;br&gt;
-d → detached mode → ให้ container รันอยู่เบื้องหลัง&lt;br&gt;
-p → publish port 8080:80 → เอา port 80 ใน container (nginx) → map ออกมาให้เข้าจาก port 8080 บนเครื่อง host เข้าเว็บได้ที่ &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;br&gt;
--name my-nginx → ตั้งชื่อ container เป็น my-nginx&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiky4ob5ycdogsnp5ztti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiky4ob5ycdogsnp5ztti.png" alt=" " width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เราสามารถ mount volume ให้ container ใช้ไฟล์บน host ได้ด้วยการส่ง argument -v เข้าไป&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -p 8080:80 \
    -v /Users/tossapol/Documents/k8s_beginner/nginx_html:/usr/share/nginx/html \
    nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-v → mount volume&lt;br&gt;
/Users/tossapol/Documents/k8s_beginner/nginx_html → path บนเครื่องเรา (host)&lt;br&gt;
/usr/share/nginx/html → path ใน container&lt;br&gt;
ใช้แก้ไฟล์ HTML บน host แล้ว container จะเห็นการเปลี่ยนแปลงทันที&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxe247gb5symbrqn1cg9o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxe247gb5symbrqn1cg9o.png" alt=" " width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. docker ps&lt;/strong&gt;&lt;br&gt;
ใช้สำหรับ แสดงรายการ container ที่กำลังรันอยู่ ในระบบ จะแสดงข้อมูลเช่น:&lt;br&gt;
Container ID&lt;br&gt;
ชื่อ container&lt;br&gt;
image ที่ใช้งาน&lt;br&gt;
status&lt;br&gt;
ports&lt;br&gt;
command ที่ container กำลังรัน&lt;br&gt;
ถ้าไม่ใส่ option อะไรเลย → จะแสดงเฉพาะ container ที่ กำลังทำงานอยู่ (running)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1ri37q0zwsfhi2dtd5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1ri37q0zwsfhi2dtd5w.png" alt=" " width="800" height="242"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps -a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะแสดง container สถานะอื่นๆ นอกจาก running ด้วย&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetmnmezq8t5d1xfm9b7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetmnmezq8t5d1xfm9b7g.png" alt=" " width="800" height="278"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps -n 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;กรณีที่เรามี container หลายตัว เราสามารถกำหนดจำนวนแถวที่จะแสดงผลได้&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9sbpueb5m7ter0j0ujf0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9sbpueb5m7ter0j0ujf0.png" alt=" " width="800" height="185"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps -f "status=exited"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เราสามารถใส่ filter เพื่อกรองเฉพาะ container ที่ต้องการได้&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobera9pc8rjau9829gpc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobera9pc8rjau9829gpc.png" alt=" " width="800" height="168"&gt;&lt;/a&gt;&lt;br&gt;
กรณีที่ต้องการกำหนดเงื่อนไขมากกว่า 1 เงื่อนไข สามารถใส่ argument -f &lt;br&gt;
เพิ่มได้เช่น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps -a  -f "status=exited"  -f "ancestor=nginx"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqo0m1flfvg4g0gkh2it.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqo0m1flfvg4g0gkh2it.png" alt=" " width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. docker start &amp;amp; stop&lt;/strong&gt;&lt;br&gt;
ใช้ start และ stop container ที่ถูกสร้างไว้แล้ว&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker start 
docker stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflfubh98knvgsxwgz9yb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fflfubh98knvgsxwgz9yb.png" alt=" " width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. docker rm&lt;/strong&gt;&lt;br&gt;
ใช้ลบ container ที่ไม่ต้องการ แต่การจะลบได้ container นั้นต้องอยู่ในสถานะ stop เท่านั้น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker rm 7b8e8e8633bf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9tvd7lafoqm96avvqrq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9tvd7lafoqm96avvqrq.png" alt=" " width="800" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. docker images&lt;/strong&gt;&lt;br&gt;
ใช้สำหรับดูว่าใน host มี image อะไรอยุ่บ้าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dkrl4ty74rocag01a25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dkrl4ty74rocag01a25.png" alt=" " width="800" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;docmer rmi
ใช้สำหรับลบ image ที่ต้องการ โดย image ที่จะสามารถลบได้ จะต้องไม่มี container ใดที่เกี่ยวข้อง run อยู่
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker rmi nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb6qut5fystgc0p8ptfy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb6qut5fystgc0p8ptfy.png" alt=" " width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;docker pull
ใช้สำหรับ download image จาก docker hub
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzk38xr77vuoens0jdlx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzk38xr77vuoens0jdlx.png" alt=" " width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;docker inspect
เอาไว้ดูรายละเอียดของ container
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker inspect d923e4fda97f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3wqq9p4e5rgbuw6kk78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3wqq9p4e5rgbuw6kk78.png" alt=" " width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;docker log
เอาไว้ดู log ของ container
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker logs d923e4fda97f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jvsa5to6ykap723bqik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jvsa5to6ykap723bqik.png" alt=" " width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes Workshop1 : Step10 : Service Loadbalancer</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Sun, 13 Jul 2025 07:10:49 +0000</pubDate>
      <link>https://dev.to/cross1308/kubernetes-workshop1-step9-service-loadbalancer-565i</link>
      <guid>https://dev.to/cross1308/kubernetes-workshop1-step9-service-loadbalancer-565i</guid>
      <description>&lt;p&gt;เราจะมาลองทำ service loadbalancer ด้วย minikube กัน&lt;br&gt;
เราจะสร้าง pod nginx ขึ้นมาก่อน &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqy8tetkvsuxeqmmoy96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqy8tetkvsuxeqmmoy96.png" alt=" " width="800" height="259"&gt;&lt;/a&gt;&lt;br&gt;
ถ้าเรายังไม่ได้สร้าง loadbalancer เราจะไม่สามารถ curl ไปยัง nginx จากภายนอก container ได้&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr1h51dt8osvfp0a0nc1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr1h51dt8osvfp0a0nc1.png" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;br&gt;
ip : 192.168.49.2 เป็น ip ของ minikube node ยังไม่มีการสร้าง service จึงไม่สามารถ curl ได้&lt;br&gt;
ip : 10.244.0.108 เป็น ip ของ pod ที่อยู่ภายใน node ไม่สามาถเรียก curl จากภายนอกได้&lt;br&gt;
ถ้าอยากเรียก curl &lt;a href="http://10.244.0.108" rel="noopener noreferrer"&gt;http://10.244.0.108&lt;/a&gt; ต้อง ssh เข้าไปใน node ก่อน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw14qelj5xsa4xhav4f5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw14qelj5xsa4xhav4f5.png" alt=" " width="800" height="812"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;สร้าง service loadbalancer เพื่อให้สามารถเข้าถึง nginx จากภายนอกได้&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;1. สร้างไฟล์ service-definition.yaml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30008
  selector:
    app: nginx
    tier: frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ในส่วนของ selector ต้องกำหนดให้ตรงกับ label ของ pod ที่สร้างไว้ และสั่ง apply&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f service-definition.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppsxtjcov4ydy9myetbm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppsxtjcov4ydy9myetbm.png" alt=" " width="800" height="246"&gt;&lt;/a&gt;&lt;br&gt;
จะพบว่ามี service ประเภท loadbalancer ถูกสร้างขึ้นมา&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. เปิด minikube tunnel จำลอง load balance ในเครื่อง&lt;/em&gt;&lt;br&gt;
ให้เปิด terminal ใหม่ขึ้นมา run คำสั่ง และห้ามปิด&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube tunnel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk958ge194r4omuiy3my.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk958ge194r4omuiy3my.png" alt=" " width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;_3. ทดสอบการทำงาน _&lt;br&gt;
สำหรับการใช้ minikube tunnel นี้ เป็นการจำลอง loadbalance จึงไม่สามารถเรียก curl ไปยัง port 30008 ที่กำหนดได้  จะต้อง run command เพื่อดู port ที่สามารถเรียกจาก tunnel ได้ก่อน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube service myapp-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foazmlq7fik4dmkit2elj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foazmlq7fik4dmkit2elj.png" alt=" " width="800" height="302"&gt;&lt;/a&gt;&lt;br&gt;
จะเปิดหน้า web ขึ้นมาตาม url &lt;a href="http://127.0.0.1:64208" rel="noopener noreferrer"&gt;http://127.0.0.1:64208&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7okghygr7awvotl6lgs2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7okghygr7awvotl6lgs2.png" alt=" " width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes Workshop1 : Step9 : Service</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Sun, 13 Jul 2025 06:36:53 +0000</pubDate>
      <link>https://dev.to/cross1308/kubernetes-workshop1-step8-service-39ho</link>
      <guid>https://dev.to/cross1308/kubernetes-workshop1-step8-service-39ho</guid>
      <description>&lt;p&gt;Service คือ Virtual IP ช่วยให้เข้าถึง Pod ได้โดยไม่ต้องรู้ Pod IP ตรง ๆ มีหลายประเภท:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ClusterIP → ภายใน Cluster&lt;/li&gt;
&lt;li&gt;NodePort → เปิด Port ภายนอก&lt;/li&gt;
&lt;li&gt;LoadBalancer → สร้าง Load Balancer ภายนอก&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ClusterIP&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ใช้งานภายใน Cluster เท่านั้น&lt;/li&gt;
&lt;li&gt;ใช้ IP ภายใน (เช่น 10.96.5.42)&lt;/li&gt;
&lt;li&gt;Pod อื่นใน Cluster เรียกผ่าน ClusterIP ได้&lt;/li&gt;
&lt;li&gt;เหมาะสำหรับใช้งานภายใน เช่น Backend, Database
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------+
|       Kubernetes Cluster    |
|                             |
|  +-----------------------+  |
|  |     Service (ClusterIP)| |
|  |  10.96.5.42:80         | |
|  +----------+------------+  |
|             |               |
|     +-------+--------+      |
|     |       |        |      |
| +---v--+ +--v---+ +--v---+  |
| | Pod1 | | Pod2 | | Pod3 |  |
| |:8080 | |:8080 | |:8080 |  |
| +------+ +------+ +------+  |
|                             |
+-----------------------------+
Client Pod --&amp;gt; ClusterIP --&amp;gt; Pod1/2/3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NodePort&lt;/strong&gt;&lt;br&gt;
เปิด Port บน Node ทุกตัว&lt;br&gt;
kube-proxy จะ redirect traffic ไปที่ Pod&lt;br&gt;
เหมาะกับ Cluster on-prem หรือทดสอบระบบ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+---------------------------------------------+
|              Outside World                  |
|                                             |
|         http://NodeIP:30080                 |
|                    |                        |
+--------------------|------------------------+
                     |
          +----------v-----------+
          |   Node (Worker)      |
          |                      |
          |  kube-proxy          |
          +----------+-----------+
                     |
      +--------------+----------------+
      |                               |
+-----v------+                  +-----v------+
| Service    |                  | Service    |
| NodePort   |                  | NodePort   |
| 30080:80   |                  | 30080:80   |
+-----+------+                  +-----+------+
      |                               |
  +---v---+   +---v---+          +----v----+
  | Pod1  |   | Pod2  |          | Pod3    |
  | :8080 |   | :8080 |          | :8080   |
  +-------+   +-------+          +---------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;LoadBalancer&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;สร้าง Load Balancer ภายนอก (Cloud Provider)&lt;/li&gt;
&lt;li&gt;Cloud Provider สร้าง Load Balancer ให้ เช่น AWS ELB&lt;/li&gt;
&lt;li&gt;User เรียกผ่าน External DNS หรือ IP&lt;/li&gt;
&lt;li&gt;Load Balancer ส่ง traffic ไป NodePort ของ Node&lt;/li&gt;
&lt;li&gt;Load Balancer → NodePort → Service → Pod&lt;/li&gt;
&lt;li&gt;เหมาะสำหรับ Production
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-------------------------------------+
|         External LoadBalancer       |
|       (Cloud Provider ELB/ALB)      |
|         aabbcc.elb.amazonaws.com     |
+----------------+--------------------+
                 |
        +--------v--------+
        |   NodePort      |
        | (ทุก Node)      |
        | :30080          |
        +--------+--------+
                 |
         +-------+--------+
         |                |
     +---v---+        +---v---+
     | Pod1  |        | Pod2  |
     | :8080 |        | :8080 |
     +-------+        +-------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;สรุปภาพรวม&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2lduf2ay0rv7dttk33m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2lduf2ay0rv7dttk33m.png" alt=" " width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes Workshop1 : Step8 : Update and Rollback Deployment</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Sat, 12 Jul 2025 16:11:58 +0000</pubDate>
      <link>https://dev.to/cross1308/kubernetes-workshop1-step8-update-and-rollback-deployment-1c71</link>
      <guid>https://dev.to/cross1308/kubernetes-workshop1-step8-update-and-rollback-deployment-1c71</guid>
      <description>&lt;p&gt;ในเรื่องของการ Update and Rollback เรามารู้จักหัวข้อหลักๆ ที่ต้องใช้ในเรื่องนี้กันก่อนประกอบด้วย&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Rollout&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;การปรับเปลี่ยนเวอร์ชันแอปใน Kubernetes แบบไม่ทำให้ระบบล่ม&lt;br&gt;
คือกระบวนการที่ Deployment อัปเดตแอป จากเวอร์ชันเดิม → ไปยังเวอร์ชันใหม่ ทำแบบ ค่อย ๆ แทนที่ Pod เก่า ด้วย Pod ใหม่ (Rolling Update) ช่วยให้ แอปยังใช้งานได้ตลอด → ไม่มี downtime&lt;br&gt;
&lt;strong&gt;Rollout สำคัญอย่างไร&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;อัปเดตแอปโดย ไม่หยุดให้บริการ&lt;/li&gt;
&lt;li&gt;ลดความเสี่ยง → ถ้าเวอร์ชันใหม่พัง → Rollback กลับได้ทันที&lt;/li&gt;
&lt;li&gt;ช่วยให้ Deploy เวอร์ชันใหม่ได้ปลอดภัยกว่า
&lt;strong&gt;Rollout ทำงานยังไง&lt;/strong&gt;
ตัวอย่างเช่น:
คุณมี Deployment ที่รัน nginx:1.18
ต้องการเปลี่ยนเป็น nginx:1.19&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;เราจะลองทำ lab กันดู โดยการ สร้าง deployment nginx:1.18 ก่อน&lt;/strong&gt;&lt;br&gt;
'''&lt;br&gt;
kubectl create deployment my-nginx --image=nginx:1.18 --replicas=3&lt;br&gt;
'''&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc18jv6gt7fpns34sp5lt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc18jv6gt7fpns34sp5lt.png" alt=" " width="800" height="63"&gt;&lt;/a&gt;&lt;br&gt;
จะเห็นว่าตอนนี้เรามี deployment my-nginx:1.18&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwi40w0emfppdj1yij6hx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwi40w0emfppdj1yij6hx.png" alt=" " width="800" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;เราจะทำการ rollout nginx version ใหม่เป็น 1.19&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl set image deployment/my-nginx nginx=nginx:1.19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbexlc1cdq1innjjurft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbexlc1cdq1innjjurft.png" alt=" " width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;เช็คสถานะการ rollout&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl rollout status deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zqqus97d0kcj5gg48mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zqqus97d0kcj5gg48mi.png" alt=" " width="800" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เช็ค history การ rollout&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl rollout history deployment/my-nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrtmxktbmkjhpgmruqxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrtmxktbmkjhpgmruqxg.png" alt=" " width="800" height="207"&gt;&lt;/a&gt;&lt;br&gt;
สรุปขั้นตอนการทำงานของ rollout &lt;br&gt;
Kubernetes จะสร้าง ReplicaSet ใหม่ สำหรับเวอร์ชันใหม่และค่อย ๆ ปิด Pod เก่า แล้วสร้าง Pod ใหม่แทนจนครบจำนวน replicas ที่กำหนด&lt;/p&gt;

&lt;p&gt;ก่อน Rollout:&lt;br&gt;
[Pod v1] [Pod v1] [Pod v1]&lt;br&gt;
ระหว่าง Rollout:&lt;br&gt;
[Pod v1] [Pod v1] [Pod v2]&lt;br&gt;
[Pod v1] [Pod v2] [Pod v2]&lt;br&gt;
[Pod v2] [Pod v2] [Pod v2]&lt;br&gt;
หลัง Rollout เสร็จ:&lt;br&gt;
[Pod v2] [Pod v2] [Pod v2]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ถ้าแก้ไข image ใน deployment.yaml แล้วสั่ง apply kubernetes จะทำการ rollout ให้เช่นกัน&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;2. Versioning&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;คือการจัดการเวอร์ชันของแอปหรือ Deployment เพื่อให้รู้ว่าเรากำลังรันแอปเวอร์ชันไหน และสามารถย้อนกลับได้ถ้าพัง&lt;br&gt;
&lt;strong&gt;Versioning ใช้ทำอะไร?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;รู้ว่า ตอนนี้รันแอปเวอร์ชันไหน (image, config)&lt;/li&gt;
&lt;li&gt;ช่วยให้ Kubernetes ทำ Rollback ได้ง่าย&lt;/li&gt;
&lt;li&gt;ช่วยเก็บ ประวัติการเปลี่ยนแปลง (Revision History) ของ Deployment&lt;/li&gt;
&lt;li&gt;ลดความเสี่ยงเวลาปล่อยแอปเวอร์ชันใหม่&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;เวลาสร้างหรือแก้ไข Deployment → Kubernetes จะสร้าง ReplicaSet ใหม่ ทุกครั้งที่มีการเปลี่ยนแปลง โดยแต่ละ ReplicaSet = แต่ละเวอร์ชันของ Deployment&lt;br&gt;
ตัวอย่างหลังจาก rollout แล้ว ถ้าเรา เช็คดูว่าใน cluster มี replicaset อะไรอยู่บ้าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get replicaset -o wide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gi3a0glvcxoe4twawer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gi3a0glvcxoe4twawer.png" alt=" " width="800" height="223"&gt;&lt;/a&gt;&lt;br&gt;
จะเห็นว่า มี replicaset อยู่ 2 โดย replicaset nginx:1.19 มี pod ที่พร้อมทำงานอยู่ 3 แต่ใน nginx:1.18 ไม่มี pod ที่พร้อมทำงาน เนื่องจาก kubernetes จะเก็บ version เดิมไว้เผื่อระบบเกิดปัญหา ต้องทำการ rollback&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;3. Rollback&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;คือการย้อนกลับไปใช้ version ก่อนหน้า ถ้าเวอร์ชันใหม่พัง → Rollback กลับเวอร์ชันเดิมได้ทันที&lt;br&gt;
เราสามารถสั่งด้วย command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl rollout undo deployment/my-nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jahm0egdk3e2z6ct9lp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jahm0egdk3e2z6ct9lp.png" alt=" " width="800" height="136"&gt;&lt;/a&gt;&lt;br&gt;
Kubernetes จะสลับกลับไปใช้ ReplicaSet ของเวอร์ชันเก่า&lt;br&gt;
ลองเช็ค replicaset ดู จะเห็นว่า pod ready จะกลับมาอยู่ที่ nginx:1.18 แล้ว&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97vdbmv39xhq3u8ttx4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97vdbmv39xhq3u8ttx4d.png" alt=" " width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;4. Deployment Strategy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;คือรูปแบบการ rollout version ใหม่ มี 2 แบบคือ Rolling-Update เป็นค่า default ที่ kubernetes ใช้ ตามที่อธิบายแล้วด้านบน และ Recreate เป็นการ ลบ pod เก่าออกจากระบบทั้งหมดก่อน แล้วจึงสร้าง pod ใหม่มาแทนที่ ซึ่งวิธีนี้อาจมี downtime&lt;br&gt;
&lt;strong&gt;เหตุผลที่ควรใช้ Recreate&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;1. แอปทำงานพร้อมกันหลายเวอร์ชันไม่ได้&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database Migration&lt;/li&gt;
&lt;li&gt;Stateful App ที่ต้องการ Lock Resource&lt;/li&gt;
&lt;li&gt;Service ที่ใช้ Port เดียวกัน
ตัวอย่าง:
ถ้าคุณมี Database Migration → ต้องหยุด Service ก่อน deploy schema ใหม่ → ใช้ Recreate เหมาะสุด
&lt;em&gt;2. ป้องกัน Conflicts&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;แอปบางตัวอาจชนกันถ้ารันหลายเวอร์ชันพร้อมกัน
&lt;em&gt;3. ต้องการ Clean Slate&lt;/em&gt;
อยาก ล้างของเก่าให้หมดก่อน deploy ใหม่
&lt;strong&gt;ไม่ควรใช้ Recreate ตอนไหน?&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;แอปที่ต้อง ให้บริการตลอดเวลา (Zero Downtime)&lt;/li&gt;
&lt;li&gt;แอปที่ต้องการ High Availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;การกำหนดให้ kubernetes ใช้ Deployment Strategy แบบ Recreate สามารถทำได้ด้วย yaml เท่านั้น โดยการกำหนด Strategy type&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
    type: front-end
spec:
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      type: front-end
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Kubernetes Workshop1 : Step7 : การจัดการ Deployment</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Sat, 12 Jul 2025 15:06:33 +0000</pubDate>
      <link>https://dev.to/cross1308/kubernetes-workshop1-step7-kaarcchadkaar-deployment-3eph</link>
      <guid>https://dev.to/cross1308/kubernetes-workshop1-step7-kaarcchadkaar-deployment-3eph</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;สร้าง Deployment ด้วย command&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;เราสามารถสร้าง deployment ด้วย command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create deployment httpd-frontend --image=httpd:2.4-alpine --replicas=3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;kubernetes จะทำการสร้าง deployment, replicaset และ pod ที่เกี่ยวข้อง&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr3p2gw4bw9wkacxyxdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr3p2gw4bw9wkacxyxdn.png" alt=" " width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;สร้าง Deployment ด้วยไฟล์ yaml&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;เรามาลองสร้างไฟล์ deployment.yaml กัน โดยไฟล์ที่สร้างนี้เป็นแบบ basic มีหน้าตาเหมือกับ replicaset ในบทความก่อน โดย แตกต่างกันเพียงแค่ kind = Deployment เท่านั้น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
    type: front-end
spec:
  replicas: 3
  selector:
    matchLabels:
      type: front-end
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end
    spec:
      containers:
        - name: nginx-container
          image: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ก่อนจะสร้าง deployment เรามาเช็คดูก่อนว่าใน cluster มีอะไรบ้าง (ใน lab นี้ ได้ทำการลบทุกอย่างออกหมดแล้ว จึงพบว่าไม่มีอะไร)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4iimjj8a3ibbth9cpmxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4iimjj8a3ibbth9cpmxn.png" alt=" " width="800" height="157"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;สร้าง deployment จาก yaml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f deployment.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8549dq4a7othhxma0b4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8549dq4a7othhxma0b4.png" alt=" " width="800" height="107"&gt;&lt;/a&gt;&lt;br&gt;
หลังจากสร้าง deployment เรามาเช็คดูว่าใน cluster มีอะไรถูกสร้างขึ้นมาบ้าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubetcl get all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0wuftm3izv5xw8384r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0wuftm3izv5xw8384r5.png" alt=" " width="800" height="351"&gt;&lt;/a&gt;&lt;br&gt;
จะเห็นได้ว่า deployment จะทำการสร้าง replicaset และ pods ให้เอง&lt;/p&gt;

&lt;p&gt;ดูว่าใน cluster มี deployment อะไรบ้าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9cyy7t9fqe9yc8v0gj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9cyy7t9fqe9yc8v0gj1.png" alt=" " width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ดูรายละเอียดของ deployment ที่ต้องการ&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
kubectl describe deploymeny myapp-deployment&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbg69zccz9si338dwdc7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbg69zccz9si338dwdc7v.png" alt=" " width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ลบ deployment &lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
kubectl delete deployment myapp-deployment&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudrsgizidixxknhxd8q0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudrsgizidixxknhxd8q0.png" alt=" " width="800" height="89"&gt;&lt;/a&gt;&lt;br&gt;
ลองเช็คดูว่าใน cluster มีอะไรบ้างหลังจากลบ deployment&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl77tdiq22qp2bk71kqg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhl77tdiq22qp2bk71kqg.png" alt=" " width="800" height="172"&gt;&lt;/a&gt;&lt;br&gt;
เมื่อสั่งลบ deployment แล้ว จะเห็นว่า kubernetes จะทำการลบ repicaset และ pod ที่เกี่ยวข้องกับ deployment ออกไปพร้อมกัน&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes Workshop1 : Step6 : Deployment</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Sat, 12 Jul 2025 14:47:38 +0000</pubDate>
      <link>https://dev.to/cross1308/kubernetes-workshop1-step6-deployment-5d3e</link>
      <guid>https://dev.to/cross1308/kubernetes-workshop1-step6-deployment-5d3e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Deployment คืออะไร?&lt;/strong&gt;&lt;br&gt;
Deployment คือผู้จัดการเวอร์ชันของแอปใน Kubernetes&lt;br&gt;
ใช้ควบคุมการสร้าง, อัปเดต, และจัดการจำนวน Pod ให้อยู่ในสภาพพร้อมใช้งาน&lt;br&gt;
ดูเผินๆ อาจจะรู้สึกว่ามันคล้ายกับ replicaset จริงๆ แล้วมันควบคุม replicaset อีกที เพื่อเพิ่มความสามารถที่ replicaset ทำไม่ได้&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment ทำอะไร?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;สร้าง ReplicaSet ให้อัตโนมัติ → เพื่อควบคุมจำนวน Pod&lt;/li&gt;
&lt;li&gt;รองรับ Rolling Update → อัปเดตเวอร์ชันแอปแบบไม่ล่ม&lt;/li&gt;
&lt;li&gt;ทำ Rollback กลับไปใช้เวอร์ชันเก่าได้ ถ้าเจอปัญหา&lt;/li&gt;
&lt;li&gt;ช่วยให้ Scaling ขึ้น-ลง Pod ได้ง่าย&lt;/li&gt;
&lt;li&gt;บริหาร หลาย ReplicaSet เบื้องหลังเพื่อจัดการเวอร์ชันต่าง ๆ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ความแตกต่างระหว่าง Deployment กับ ReplicaSet&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmh1cuhy8tfj1wlmbp24f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmh1cuhy8tfj1wlmbp24f.png" alt=" " width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deployment&lt;br&gt;
    │&lt;br&gt;
    ├── ReplicaSet v1&lt;br&gt;
    │       └── Pods (old version)&lt;br&gt;
    │&lt;br&gt;
    └── ReplicaSet v2&lt;br&gt;
            └── Pods (new version)&lt;/p&gt;

&lt;p&gt;ตัวอย่าง YAML ของ Deployment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx:1.18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Kubernetes Workshop1 : Step5 : การจัดการ replicaset</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Sat, 12 Jul 2025 14:39:19 +0000</pubDate>
      <link>https://dev.to/cross1308/kubernetes-workshop1-step5-kaarcchadkaar-replicaset-2a2i</link>
      <guid>https://dev.to/cross1308/kubernetes-workshop1-step5-kaarcchadkaar-replicaset-2a2i</guid>
      <description>&lt;p&gt;&lt;strong&gt;ตัวอย่างไฟล์ yaml ของ replicaset&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-replicaset
  labels:
    app: myapp
    type: front-end
spec:
  replicas: 3
  selector:
    matchLabels:
      type: front-end
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: front-end 
    spec:
      containers:
      - name: nginx-container
        image: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะมีโครงสร้างอยู่ 4 ส่วนหลักเหมือน pod คือ apiVersion, kind, metadata, spec แต่จะมีส่วนที่แตกต่างกันดังนี้&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;appVersion ตรงนี้ ค่าที่ใส่จะต้องมี apps/ นำหน้าเสมอ เช่น apps/v1&lt;/li&gt;
&lt;li&gt;tag ที่อยู่ภายใต้ template เขียนเหมือนเวลาเราเขียน metadata ของ pod ที่ต้องการได้เลย&lt;/li&gt;
&lt;li&gt;replicas ตรงนี้เป็นการกำหนดค่า default จำนวน pod ว่าต้องการให้มีเท่าไหร่&lt;/li&gt;
&lt;li&gt;selector ตรงนี้ต้องมี เพราะ replicaset สามารถเลือกกลุ่มที่ต้องการจั้ดการได้ เช่นในตัวอย่าง matchLabels = "type: front-end" replicaset จะเลือกเฉพาะที่มีการกำหนด label เป็นค่านี้เท่านั้น&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;สร้าง Replicaset
เราสามารถสร้าง replicaset ด้วย command
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f replicaset-definition.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e6r456oamqsmndmzk4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e6r456oamqsmndmzk4f.png" alt=" " width="800" height="145"&gt;&lt;/a&gt;&lt;br&gt;
ลองเช็คดูว่ามี pod ถูกสร้างขึ้นมา 3 pods จริงหรือไม่&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwomla6cf8j73e9eyw46d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwomla6cf8j73e9eyw46d.png" alt=" " width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ทดลองลบ pod ออก 1 ตัว แล้วเช็คดูใหม่ว่า ยังมี 3 pods เท่ากับที่กำหนดไว้ใน replacaset หรือไม่&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nr1a9u5cc9yupe6itbf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nr1a9u5cc9yupe6itbf.png" alt=" " width="800" height="342"&gt;&lt;/a&gt;&lt;br&gt;
จะเห็นได้ว่าถึงจะลบ pod ออกไป แต่พอ เช็คดูใหม่ ก็ยังมี 3 pods เท่าเดิม&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ทดลองเพิ่มจำนวน pods ขึ้นเป็น 5 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;โดยแก้ yaml file &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmlp5z3mzgx9okju8omi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmlp5z3mzgx9okju8omi.png" alt=" " width="800" height="747"&gt;&lt;/a&gt;&lt;br&gt;
สั่ง kubectl apply -f replicaset-definition.yaml&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb7wg2kk13o1bupvp7kn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb7wg2kk13o1bupvp7kn.png" alt=" " width="800" height="288"&gt;&lt;/a&gt;&lt;br&gt;
จะเห็นว่า เราสามารถเพิ่มจำนวน pod เป็น 5 pods ได้&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ไม่แก้ yaml เราสามารถสั่งผ่าน command line โดยอ้างอิง ชื่อไฟล์ หรือ ชื่อ replicaset ได้เลย&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl scale --replicas=4 -f replicaset-definition.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ncu6sjleu3j01mayfsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ncu6sjleu3j01mayfsp.png" alt=" " width="800" height="324"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl scale --replicas=3 replicaset  myapp-replicaset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcduncpvohyr0tgh3b1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcduncpvohyr0tgh3b1c.png" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เรียกดูว่าใน cluster มี replicaset ใด ทำงานอยู่บ้าง
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get replicaset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexnv8iywi30x0w7j6ijb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexnv8iywi30x0w7j6ijb.png" alt=" " width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ดูรายละเอียดของ replicaset
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl describe replicaset myapp-replicaset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqvk6m784ppt0oc6xt9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqvk6m784ppt0oc6xt9p.png" alt=" " width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ลบ replicaset
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete replicaset myapp-replicaset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgsdiqi3v1euynicdaj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgsdiqi3v1euynicdaj9.png" alt=" " width="800" height="190"&gt;&lt;/a&gt;&lt;br&gt;
จะเห็นว่า เมื่อลบ replicaset แล้ว pod ที่ถูกสร้างจาก replicaset นั้นจะถูกลบออกไปด้วย&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes Workshop1 : Step4 : replicaset คืออะไร</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Sat, 12 Jul 2025 14:39:09 +0000</pubDate>
      <link>https://dev.to/cross1308/kubernetes-workshop1-step4-replicaset-khuueaair-4i1</link>
      <guid>https://dev.to/cross1308/kubernetes-workshop1-step4-replicaset-khuueaair-4i1</guid>
      <description>&lt;p&gt;ReplicaSet คือผู้คุมจำนวน Pod ใน Kubernetes ทำหน้าที่ให้แน่ใจว่าในระบบมี Pod เท่าที่เราต้องการอยู่เสมอ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ReplicaSet ทำงานยังไง?&lt;/strong&gt;&lt;br&gt;
กำหนดจำนวน replicas ที่ต้องการ เช่น 3 Pods&lt;br&gt;
ถ้า Pod ใดล้ม → ReplicaSet จะสร้างใหม่ให้ทันที&lt;br&gt;
ถ้ามี Pod เกิน → ReplicaSet จะลบออก&lt;br&gt;
ใช้กับ Deployment เป็นหลัก → Deployment จะสร้างและจัดการ ReplicaSet ให้เราโดยอัตโนมัติ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ทำไมต้องมี ReplicaSet?&lt;/strong&gt;&lt;br&gt;
ทำให้ระบบ ทนทาน (High Availability)&lt;br&gt;
ช่วยให้ Scaling จำนวน Pod ขึ้นหรือลงง่าย&lt;br&gt;
ทำให้ Kubernetes จัดการโหลดได้ดีขึ้น&lt;/p&gt;

&lt;p&gt;ตัวอย่างไฟล์ replicaset yaml แบบง่ายๆ โดยจะเป็นการ สร้าง replicaset มาควบคุมจำนวน pod ให้มี 3 pods ตลอดเวลา&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;+--------------------------+&lt;br&gt;
|      ReplicaSet          |&lt;br&gt;
|       (3 Pods)           |&lt;br&gt;
+--------------------------+&lt;br&gt;
|  +-----+  +-----+  +-----+&lt;br&gt;
|  | Pod |  | Pod |  | Pod |&lt;br&gt;
|  +-----+  +-----+  +-----+&lt;br&gt;
+--------------------------+&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes Workshop1 : Step3 : จัดการ Pod ด้วย Kube control command</title>
      <dc:creator>Tossapol Ritcharoenwattu</dc:creator>
      <pubDate>Fri, 11 Jul 2025 04:29:12 +0000</pubDate>
      <link>https://dev.to/cross1308/kubernetes-workshop1-step3-cchadkaar-pod-dwy-kube-control-command-693</link>
      <guid>https://dev.to/cross1308/kubernetes-workshop1-step3-cchadkaar-pod-dwy-kube-control-command-693</guid>
      <description>&lt;p&gt;การจัดการ POD เราจะเริ่มต้นทำ lab ใน minikube กัน&lt;br&gt;
&lt;strong&gt;1. การสร้าง Pod&lt;/strong&gt;&lt;br&gt;
สามารถทำได้ 2 วิธีคือการสั่งให้ kubernetes สร้าง pod ขึ้นมาเลย หรือจะสร้างจาก ไฟล์ yaml ก็ได้  เรามาดูการสร้าง pod ง่ายๆ โดยสั่งให้ kubernetes สร้างขึ้นมาโดยไม่ใช้ yaml &lt;br&gt;
&lt;em&gt;- สั่งสร้าง pod ตรงๆ โดยไม่ได้ใช้ yml file&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl run my-nginx --image=nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83j548tz0nhd7o19nyus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83j548tz0nhd7o19nyus.png" alt=" " width="800" height="159"&gt;&lt;/a&gt;&lt;br&gt;
คำส้่งนี้จะดึง image nginx มาใช้จาก dockerhub มาสร้าง pod ชื่อ my-nginx&lt;br&gt;
เราสามารถตรวจสอบได้ว่า มี pod ถูกสร้างขึ้นมาจริงๆหรือไม่ด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2s6nbqyet742tp5bfnw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2s6nbqyet742tp5bfnw1.png" alt=" " width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- สั่งสร้าง pod ตรงๆ โดยใช้ yml file&lt;/em&gt;&lt;br&gt;
เราจะต้องสร้าง yml ขึ้นมาก่อน ด้วย vi หรือ vscode ก็ได้&lt;br&gt;
ตัวอย่างไฟล์ pods.yaml เพื่อสร้าง pod ที่มี 1 container เพื่อทำ web server ด้วย nginx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
    tier: frontend 
spec:
  containers:
  - name: nginx
    image: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อได้ไฟล์นี้แล้ว เราสามารถสั่งให้ kubernetes ทำงานได้ 2 คำสั่งคือ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create -f pod.yaml
หรือ 
kubectl apply -f pod.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ความแตกต่างคือ create คือการสร้างใหม่เท่านั้น ถ้ามีการสั่งซ้ำ จะ error แต่ apply จะเป็นการเช็คว่า ถ้าไม่มีให้สร้าง แต่ถ้ามีแล้วให้ update &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxkfx50lwy15ua710lny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxkfx50lwy15ua710lny.png" alt=" " width="800" height="137"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fashdd4d9of7ddarg9xxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fashdd4d9of7ddarg9xxk.png" alt=" " width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. การดูรายละเอียดของ pod&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;คำสั่งสำหรับดูว่ามี pod อะไรบ้าง
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hxkgxew1hk0ua9o2ew8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hxkgxew1hk0ua9o2ew8.png" alt=" " width="800" height="146"&gt;&lt;/a&gt;&lt;br&gt;
คำสั่งสำหรับดูรายละเอียดของ pod ที่ระบุ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl describe pod nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyduvyaolvn6ujbmc0zn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyduvyaolvn6ujbmc0zn3.png" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;คำสั่งสำหรับ list pod ทั้งหมด โดยแสดง ip ของ pod และ ดูว่า pod    อยู่ที่ node ไหน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -o wide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsltk2y28udd38y053qm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsltk2y28udd38y053qm2.png" alt=" " width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. การลบ pod ที่ไม่ต้องการ&lt;/strong&gt;&lt;br&gt;
คำสั่งสำหรับลบ pod&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete pod nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ckk8d1hjr0f4wd52o6p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ckk8d1hjr0f4wd52o6p.png" alt=" " width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. การสร้างไฟล์ yaml โดยการ generate script&lt;/strong&gt;&lt;br&gt;
การสร้างไฟล์ yaml นั้น เราสามารถสั่งให้ kubernetes generate ค่าเริ่มต้นให้ได้ เพื่อจะได้ไม่ต้องเริ่มทุกอย่างจาก 0 ทำให้เราสามารถเอาไป แก้ไขเพิ่มเติมได้ง่ายขึ้น&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;คำสั่งสำหรับจำลองการสร้าง yaml ไฟล์ โดยแสดงผลทางหน้าจอ
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl run my-redis --image=redis --dry-run=client -o yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;—dry-run=client หมายถึงไม่ต้องสร้างจริงๆ แค่จำลอง &lt;br&gt;
-o yaml หมายถึงแสดงคำสั่งสร้างในรูปแบบ yaml&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2022qlryyvqqpc5hl4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2022qlryyvqqpc5hl4h.png" alt=" " width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ถ้าต้องการ save file ไว้ด้วย เพียงแค่เพิ่ม  &amp;gt; filename.yaml ต่อท้าย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl run my-redis --image=redis --dry-run=client -o yaml &amp;gt; redis.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fag2oges9sx9ryv2ylr5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fag2oges9sx9ryv2ylr5m.png" alt=" " width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
