[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-golang-ai-lab-docker-setup-guide-all--*":3,"academy-blog-translations-v8fnxcrvfcvy974":85},{"data":4,"page":71,"perPage":71,"totalItems":71,"totalPages":71},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":79,"keywords":80,"locale":52,"published_at":81,"scheduled_at":13,"school_blog":75,"short_description":82,"status":73,"title":83,"updated":84,"updated_by":13,"slug":76,"views":78},"วิธีการตั้งค่า Docker สำหรับ Golang AI Microservice โดยใช้ Multi-stage Build","sclblg987654321","school_blog_translations","\u003Cp>ยินดีต้อนรับกลับสู่ \u003Cstrong>Golang The Series\u003C\u002Fstrong> ครับ! หลังจากที่เราได้ปรับ Mindset เรื่องสถาปัตยกรรมแบบ AI-First กันไปในตอนที่แล้ว วันนี้ถึงเวลาที่เราต้องมาเตรียม Infrastructure ให้พร้อม เพื่อสร้างสภาพแวดล้อมที่เสถียรและ Scale ได้จริงสำหรับโปรเจกต์ AI ที่เราจะลุยกันต่อในซีซันนี้ครับ\u003C\u002Fp>\u003Cp>การมี Infrastructure ที่ดีเปรียบเหมือนการวางรากฐานที่แข็งแรงให้กับตึก ยิ่งงาน AI ต้องใช้ทรัพยากรสูงและมีการเปลี่ยนแปลงของ Library บ่อยครั้ง การเซ็ตอัปเครื่องมือให้เป็นมาตรฐานตั้งแต่ต้นจึงสำคัญมาก\u003C\u002Fp>\u003Ch2>ทำไมต้อง Go 1.2x + Docker?\u003C\u002Fh2>\u003Cp>การพัฒนา AI ที่ Library และ Model เปลี่ยนแปลงเร็วแบบรายสัปดาห์ การรันโค้ดบนเครื่องตัวเองตรงๆ (Native Host) มักจะสร้างปัญหาคลาสสิกอย่าง It works on my machine ได้ง่ายๆ ครับ ดังนั้นการจับคู่ระหว่าง Go และ Docker จึงเป็นมาตรฐานที่เราเลือกใช้\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Docker (Consistency &amp; Portability):\u003C\u002Fstrong> ช่วยให้สภาพแวดล้อมในการพัฒนา (Dev) และการใช้งานจริง (Production) เหมือนกัน 100% ไม่ว่าทีมงานคนอื่นจะใช้ Mac (M4), Windows หรือ Linux ทุกคนจะทำงานบน Container ชุดเดียวกัน ลดปัญหาเรื่อง Dependency ตีกันได้อย่างเด็ดขาด\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Go 1.2x (Modern &amp; Secure):\u003C\u002Fstrong> ผมแนะนำให้ใช้ Go 1.22 ขึ้นไป ครับ เพราะมีการปรับปรุงเรื่องการจัดการ Loop Variable แบบใหม่ที่ปลอดภัยขึ้นมาก ช่วยลดบั๊กที่มักเกิดกับการเขียน Goroutines ในงานประมวลผลข้อมูล (Data Processing) และยังมาพร้อมกับ Performance ที่ดีขึ้น ซึ่งจำเป็นอย่างยิ่งสำหรับการจัดการหน่วยความจำในงาน AI ที่มีความซับซ้อน\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>เตรียม Dockerfile สำหรับ AI Microservice\u003C\u002Fh2>\u003Cp>เราจะใช้เทคนิค Multi-stage Build เพื่อให้ได้ Docker Image ที่มีขนาดเล็กที่สุด (Small &amp; Lean) ครับ วิธีนี้จะช่วยแยกสภาพแวดล้อมตอน Compile ออกจากตอนใช้งานจริง ทำให้เวลาเรา Deploy ขึ้น Cloud ทำได้รวดเร็วและปลอดภัยกว่าการใช้ Image ขนาดใหญ่\u003C\u002Fp>\u003Cp>\u003Cstrong>ไฟล์: Dockerfile\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Dockerfile\u003C\u002Fp>\u003Cpre>\u003Ccode># Stage 1: Build the Go binary (เน้นเครื่องมือครบสำหรับการ Compile)\nFROM golang:1.22-alpine AS builder\n\nWORKDIR \u002Fapp\n\n# คัดลอกไฟล์จัดการ Dependency (ใช้ * เผื่อกรณีโปรเจกต์ใหม่ที่ยังไม่มี go.sum)\nCOPY go.mod go.sum* .\u002F\nRUN go mod download\n\nCOPY . .\n\n# Compile ให้เป็น Binary ไฟล์เดียวที่ทำงานได้โดยไม่ต้องพึ่งพา OS มากนัก\nRUN CGO_ENABLED=0 GOOS=linux go build -o ai-service main.go\n\n# Stage 2: Final lightweight image (เน้นความเล็กและปลอดภัย)\nFROM alpine:latest  \nWORKDIR \u002Froot\u002F\n\n# คัดลอกเฉพาะไฟล์ Binary ที่ Build เสร็จแล้วมาจาก Stage แรก\nCOPY --from=builder \u002Fapp\u002Fai-service .\n\n# สร้างโฟลเดอร์สำหรับเก็บโมเดลหรือข้อมูลชั่วคราวที่ AI ต้องใช้\nRUN mkdir data\n\nEXPOSE 8080\nCMD [\".\u002Fai-service\"]\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>ตัวอย่างโค้ด Go: Simple Health Check &amp; Runtime Info\u003C\u002Fh2>\u003Cp>ในการทำระบบ AI สิ่งที่สำคัญไม่แพ้ตัว Model คือการรู้ว่าเรามี Resources ให้ใช้เท่าไหร่ เราจะเขียนโค้ดเพื่อตรวจสอบว่า Environment ของเรารันอยู่บน Go Version ที่ถูกต้องหรือไม่ และระบบมองเห็นจำนวน CPU เท่าไหร่ ซึ่งข้อมูลนี้สำคัญมากในการทำ Parallel Processing หรือการจองคิวประมวลผลให้ AI Model ครับ\u003C\u002Fp>\u003Cp>\u003Cstrong>ไฟล์: main.go\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>package main\n\nimport (\n\t\"fmt\"\n\t\"net\u002Fhttp\"\n\t\"runtime\"\n)\n\nfunc main() {\n\t\u002F\u002F สร้าง Route สำหรับตรวจสอบสถานะของระบบ (Health Check)\n\thttp.HandleFunc(\"\u002F\", func(w http.ResponseWriter, r *http.Request) {\n\t\t\u002F\u002F ดึงข้อมูล Runtime ของระบบ\n\t\tgoVersion := runtime.Version() \u002F\u002F ตรวจสอบเวอร์ชัน Go\n\t\tnumCPU := runtime.NumCPU()    \u002F\u002F ตรวจสอบจำนวน Logical CPUs ที่ใช้งานได้\n\n\t\t\u002F\u002F จัดรูปแบบ Response สำหรับแสดงผล\n\t\tresponse := fmt.Sprintf(\n\t\t\t\"Welcome to AI Lab!\\n\"+\n\t\t\t\"-------------------\\n\"+\n\t\t\t\"Go Version: %s\\n\"+\n\t\t\t\"Available CPUs: %d\\n\"+\n\t\t\t\"System Status: Online\",\n\t\t\tgoVersion, numCPU,\n\t\t)\n\t\t\n\t\tfmt.Fprint(w, response)\n\t})\n\n\tfmt.Println(\"🚀 AI Lab Server is running on port 8080...\")\n\t\n\t\u002F\u002F สั่งรัน Server พร้อมตรวจสอบ Error เบื้องต้น\n\tif err := http.ListenAndServe(\":8080\", nil); err != nil {\n\t\tfmt.Printf(\"Failed to start server: %v\\n\", err)\n\t}\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>🎯 ท้าให้ลอง (Daily Mission)\u003C\u002Fh2>\u003Cp>เพื่อให้มั่นใจว่า AI Lab ของคุณพร้อมใช้งานจริง ผมอยากให้ทุกคนลองหยิบโค้ดด้านบนไปรันผ่าน Docker ด้วยตัวเองครับ นี่คือขั้นตอนสั้นๆ ที่จะเปลี่ยนคุณจากผู้อ่านให้กลายเป็นผู้ลงมือทำ:\u003C\u002Fp>\u003Col>\u003Cli>\u003Cp>\u003Cstrong>Prepare Files:\u003C\u002Fstrong> สร้างไฟล์ \u003Ccode>main.go\u003C\u002Fcode> และ \u003Ccode>Dockerfile\u003C\u002Fcode> ไว้ในโฟลเดอร์เดียวกัน\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Build Image:\u003C\u002Fstrong> เปิด Terminal แล้วรันคำสั่ง:\u003C\u002Fp>\u003Cp>\u003Ccode>docker build -t ai-lab-test .\u003C\u002Fcode>\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Run Container:\u003C\u002Fstrong> สั่งรันด้วยคำสั่ง:\u003C\u002Fp>\u003Cp>\u003Ccode>docker run -p 8080:8080 ai-lab-test\u003C\u002Fcode>\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Verify:\u003C\u002Fstrong> เข้าไปที่ \u003Ccode>localhost:8080\u003C\u002Fcode> บน Browser เพื่อดูผลลัพธ์จาก AI Lab ของคุณ!\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003Ch3>🔥 การบ้านเพิ่มความเซียน (Level Up!)\u003C\u002Fh3>\u003Cp>สำหรับใครที่อยากไปให้สุด ลองเพิ่ม Route \u003Ccode>\u002Fenv\u003C\u002Fcode> เข้าไปในโค้ด Go เพื่อให้ระบบแสดงค่า Environment Variable ที่เราส่งมาจาก Docker ดูครับ\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Hint:\u003C\u002Fstrong> ลองใช้ฟังก์ชัน \u003Ccode>os.Getenv(\"APP_NAME\")\u003C\u002Fcode> ใน Go และตอนรัน Docker ให้เพิ่ม Flag \u003Ccode>-e APP_NAME=MyAILab\u003C\u002Fcode> เข้าไปดูครับ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>บทสรุป: ก้าวแรกสู่มาตรฐานระดับ Production\u003C\u002Fh2>\u003Cp>การเซ็ตอัป Environment ด้วย Docker และ Go 1.2x ในวันนี้ อาจจะดูเหมือนเป็นเรื่องพื้นฐานของ Backend ทั่วไป แต่สำหรับงาน AI-First แล้ว สิ่งนี้คือการสร้างกำแพงป้องกันปัญหาเรื่องความแตกต่างของระบบ (System Discrepancy) ที่จะเกิดขึ้นเมื่อเราเริ่มนำ AI Model ที่ซับซ้อนเข้ามาติดตั้งในอนาคตครับ\u003C\u002Fp>\u003Cp>เมื่อเรามี AI Lab ที่เสถียรและพร้อมทำงานบน Container แล้ว ก้าวต่อไปที่เราต้องตัดสินใจคือ \u003Cstrong>\"เราจะส่งข้อมูลเข้า-ออกแล็บนี้อย่างไรให้มีประสิทธิภาพสูงสุด?\"\u003C\u002Fstrong>\u003C\u002Fp>\u003Ch3>ตอนต่อไป | EP.143: RESTful vs. RPC: ศึกชิงเจ้าแห่งการสื่อสารกับ AI Models\u003C\u002Fh3>\u003Cp>เมื่อเราต้องส่งข้อมูลปริมาณมหาศาล (เช่น Vector Data หรือ Long Context) การเลือก Protocol สื่อสารไม่ใช่แค่เรื่องความถนัด แต่คือเรื่องของ \u003Cstrong>Performance\u003C\u002Fstrong> และ \u003Cstrong>Scalability\u003C\u002Fstrong> ครับ\u003C\u002Fp>\u003Cp>\u003Cstrong>สิ่งที่เราจะมาหาคำตอบกันใน EP.143:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>RESTful API:\u003C\u002Fstrong> ยังเป็นราชาอยู่ไหม? เมื่อต้องรับส่งข้อมูล Streaming นานๆ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>gRPC \u002F ConnectRPC:\u003C\u002Fstrong> ทำไมเหล่า AI Engineer ถึงเริ่มเปลี่ยนมาใช้ Protocol แบบ Binary\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Latency Matters:\u003C\u002Fstrong> เปรียบเทียบความเร็วในการดึงข้อมูลจาก AI Model ระหว่าง JSON กับ Protobuf\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Implementation:\u003C\u002Fstrong> สอนเขียน Go เพื่อสร้าง Gateway สื่อสารกับ AI แบบไหนที่โค้ดสะอาดและจัดการง่ายที่สุด\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>เตรียมตัวให้พร้อม แล้วมาอัปเกรดช่องทางสื่อสารให้ระบบ AI ของคุณในตอนหน้าครับ!\u003C\u002Fp>\u003Cp>\u003Cstrong>ฝากกดติดตามพวกเราได้ที่ Superdev Academy\u003C\u002Fstrong> ในทุกช่องทางนะครับ!\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>Superdev Academy Thailand\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(อัปเดตข่าวสารและบทความใหม่)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 YouTube: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\">\u003Cstrong>Superdev Academy Channel\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(ติวเข้มแบบวิดีโอ)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(เกร็ดความรู้สั้นๆ และเบื้องหลังการทำงาน)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(Tips &amp; Tricks ฉบับย่อยง่าย)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"http:\u002F\u002Fsuperdevacademy.com\">\u003Cstrong>superdevacademy.com\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(คลังบทความและคอร์สเรียนฉบับเต็ม)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>","39k8vyn0mwq_g0ztrnxfey.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Faaknpsn3315zo66\u002F39k8vyn0mwq_g0ztrnxfey.png","2026-05-11 04:57:58.993Z","",{"keywords":15,"locale":46,"school_blog":56},[16,23,28,33,37,41],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:44:18.652Z","jr5zczy6qrxmd88","Docker","2026-04-10 16:12:43.264Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":34,"updated_by":13},"2026-05-11 04:57:35.566Z","phwca73gad24kb4","AI Microservice",{"collectionId":17,"collectionName":18,"created":38,"created_by":13,"id":39,"name":40,"updated":38,"updated_by":13},"2026-05-11 04:57:42.175Z","xpsrw991lozzu5h","Multi-stage Build",{"collectionId":17,"collectionName":18,"created":42,"created_by":13,"id":43,"name":44,"updated":45,"updated_by":13},"2026-03-04 08:31:29.142Z","hrqdq7kjl5lzjmi","AI","2026-04-10 16:07:41.358Z",{"code":47,"collectionId":48,"collectionName":49,"created":50,"flag":51,"id":52,"is_default":53,"label":54,"updated":55},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":57,"collectionId":58,"collectionName":59,"created":60,"expand":61,"id":75,"slug":76,"updated":77,"views":78},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs","2026-05-11 04:57:58.796Z",{"category":62},{"blogIds":63,"collectionId":64,"collectionName":65,"created":66,"created_by":13,"id":57,"image":67,"image_alt":13,"image_path":68,"label":69,"name":70,"priority":71,"publish_at":72,"scheduled_at":13,"status":73,"updated":74,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":70,"th":70},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","v8fnxcrvfcvy974","golang-ai-lab-docker-setup-guide","2026-05-11 16:33:38.967Z",124,"aaknpsn3315zo66",[20,25,30,35,39,43],"2026-05-11 11:01:36.066Z","เตรียม Infrastructure ให้พร้อมสำหรับโปรเจกต์ AI! เรียนรู้วิธีเซ็ตอัป Docker Image ขนาดเล็กแบบ Multi-stage และการใช้ Go 1.22+ เพื่อควบคุมระบบให้เสถียรระดับ Production","Golang The Series EP.142: Setting up the AI Lab: จัดการ Environment ด้วย Docker และ Go 1.2x","2026-05-11 11:01:36.068Z",{"th":76,"en":76}]