Tutorial

จัดการ Docker Container ง่าย ๆ ด้วย Portainer

By - 12 เมษายน 2024

จัดการ Docker Container ง่าย ๆ ด้วย Portainer

Docker เป็นเครื่องมือที่เราน่าจะได้ใช้งานกันเยอะมาก ๆ ในปัจจุบันละ ปัญหาคือ เมื่อเราต้องการจัดการ Container ที่สร้างขึ้นมา ปกติ เราอาจจะต้องทำผ่าน Docker Desktop หรือ Docker CLI ยิ่งถ้าเรามีหลายเครื่อง ก็ต้อง Remote Desktop หรือ SSH เข้าไปทำทีละเครื่องอีก มันจะดีกว่ามั้ย หากเรามีเครื่องมือที่ช่วยให้เราจัดการ Container ทั้งหมดได้แบบง่าย ๆ ผ่านหน้าเว็บกันเลย วันนี้เราจะพาทุกคนไปรู้จักกับ Portainer และวิธีการติดตั้งกัน

Portainer คืออะไร ?

Portainer คือ Software สำหรับการจัดการ Docker Container ที่ทำให้เราสามารถเข้าถึง และจัดการ Container ผ่านทาง Web GUI ได้โดยตรง สามารถใช้งานได้ในหลากหลายลักษณะเช่น การใช้งานใน Cloud, ระดับ Data Centre หรือการจัดการอุปกรณ์ IoT ทั้งหลาย เรียกว่า ทำงานได้ค่อนข้างยืดหยุ่นมาก ๆ

ปกติ หากเราทำงานกับ Docker Container เราจำเป็นต้องทำงานผ่าน Docker CLI เป็นหลัก หรือ สำหรับเครื่องไหนที่มี Desktop Environment เราสามารถใช้ Docker Desktop ได้เช่นกัน ซึ่งแน่นอนว่า มันมีข้อจำกัด และ การใช้งานที่ยุ่งยากหลายอย่าง

ตัวอย่างที่เจอกันเยอะ เช่น เมื่อเราต้องการจะสร้าง Container ใหม่ เราจะต้องรันคำสั่งชื่อว่า docker run แล้วใส่ Argument อีกเยอะบลา ๆ ตั้งแต่การตั้งชื่อ Container, การตั้งค่า Network และการ Mount Directory ยังไม่นับถึงพวกการใส่ Argument ต่าง ๆ เข้าไปอีก ทำครั้งเดียวว่าเหนื่อยแล้ว ในอนาคตเผื่อต้องอัพเกรด Version เราก็ต้องมานั่ง Pull Image แล้วสั่งสร้าง Container ใหม่อีก เลยบอกว่ามันเป็นเรื่องที่ปวดหัวมาก ๆ ยังไม่นับเรื่องการเช็คสถานะการทำงาน

หากเรามีเครื่องเพียงเครื่องเดียว มันยังไม่เดือดร้อนเท่าไหร่ แต่ถ้าเรามีมากกว่านั้นละ เช่นเราเองในบ้านเรามี Docker Instance อยู่ทั้งหมด 4 ตัวด้วยกัน การที่จะจัดการแต่ละตัวนั้น เราจำเป็นต้อง SSH เข้าไปทีละเครื่องเพื่อเช็คสถานะ ทำให้มันเป็นเรื่องที่เสียเวลามาก ๆ

ซึ่งปัญหาที่เราว่ามาทั้งหมด Portainer สามารถเข้ามาช่วยเราได้หมดเลย มันเหมือนเป็น Centralised Tool สำหรับการจัดการ Docker Container ได้หมด ไม่ว่าเราจะมี Docker Instance ที่ไม่ว่าจะอยู่กันคนละเครื่อง ใน Local Network เดียวกันหรือไม่ก็ตาม

การติดตั้ง Portainer

การติดตั้ง Portainer นั้นง่ายมาก ๆ จริง ๆ มันทำงานเป็น Docker Container ตัวนึงได้เลย ดังนั้นก่อนอื่น ไม่ว่าเราจะใช้งานบนเครื่องไหน ให้เราติดตั้ง Docker ให้เรียบร้อยก่อนตาม วิธีการของแต่ละ OS

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

จากนั้นให้เราทำการรันคำสั่งสำหรับสร้าง Container ของ Portainer ขึ้นมา โดยเราจะเห็นว่า เราสั่งให้ Bind Port ทั้งหมด 2 ตัวคือ 8000 สำหรับการเข้าใช้งานผ่าน HTTP Web GUI และ 9443 สำหรับการเข้าใช้งานผ่าน HTTPS ดังนั้นก่อนที่เราจะรันคำสั่งนี้ต้องมั่นใจก่อนว่า เครื่องของเราไม่ได้ Bind Port ทั้งสองนี้อยู่ หรือถ้ามีใช้งานอยู่ เราเปลี่ยน Port ของ Portainer ในคำสั่งนี้ได้เลย และอีกส่วนที่สำคัญคือ การ Mount Directory จะเห็นว่า มีการ Mount ทั้งหมดสองตัว ตัวแรกคือ Docker Socket ก้อนนี้แหละสำคัญมาก ๆ เป็นไฟล์ที่ทำให้ Portainer สามารถติดต่อกับ Docker ในเครื่องของเราได้ สำหรับการติดตั้งบน Linux ทั่ว ๆ ไป เราสามารถใช้ Directory นี้ได้เลย แต่สำหรับ OS อื่น ๆ ไปเช็คว่ามันอยู่ตรงไหน

เมื่อเราสั่งรันมันจะไปโหลด Image กับเริ่มสร้าง Container ให้เราเรียบร้อยเลย จากนั้นให้เราใช้ Web Browser เข้าไปที่ IP Address ของเครื่องที่เราสร้าง Container เอาไว้ พร้อม Port 9443 โดยมันจะ Warning ว่า SSL Certificate เรามีปัญหา แต่ไม่เป็นไร เพราะมันเป็น Self-Signed ให้เรา Ignore ไปเลย แล้วให้เราเลือกตั้งค่าใหม่ทั้งหมดม มันจะให้เราตั้งค่าพวก Administration Account สำหรับการเข้าไปจัดการ Container และเมื่อเข้ามาให้เราเลือก Get Started

มันจะสร้าง Environment สำหรับเรียก Docker Instance ผ่าน Local Docker Instance ที่เรา Bind Docker Socket File ไว้ตอนที่สั่งสร้าง Container ไป ชื่อที่มันสร้างมาให้ครั้งแรกชื่อว่า local แต่เราสามารถเข้าไปเปลี่ยนได้ ตัวอย่างเช่นของเรา เปลี่ยนเป็น LMS VM

เท่านี้ การติดตั้ง Portainer ก็เสร็จเรียบร้อยแล้ว จะเห็นว่า ถ้าเราทำกันจริง ๆ ใช้เวลาไม่ถึง 3-4 นาทีเท่านั้นเอง เอาเข้าจริง หากติดตั้ง Docker ไว้ในเครื่องอยู่แล้ว มันแค่รันคำสั่งสำหรับสร้าง Container เท่านั้นเอง ถือว่าง่ายมากจริง ๆ

Connecting with other Docker instance

Killer Feature ที่ทำให้เราถูกใช้ Portainer มาก ๆ คือ ความสามารถในการเชื่อมต่อ และควบคุม Docker Instance อื่น ๆ ได้ด้วย หากในองค์กร หรือบ้านของเรามี Docker Instance หลาย ๆ ตัว ติดตั้งอยู่ในหลาย ๆ เครื่อง เราสามารถที่จะเชื่อมเข้ามาใน Portainer ตัวเดียว แล้วคุมผ่าน Portainer อันเดียวได้เลย เราไม่ต้องไปติดตั้งหลาย ๆ ตัว

โดยเราสามารถนำเข้า Environment ได้หลายวิธี เช่น Docker API ที่เราต้องเข้าไปเปิดใน Docker แต่วิธีการที่ง่าย และเราแนะนำมาก ๆ คือ การใช้ Portainer Agent การติดตั้งง่ายมาก ๆ ให้เราเลือก Agent แล้วมันจะมีคำสั่งสำหรับการสร้าง Container ที่เครื่องปลายทางให้เรา เราก็แค่ก๊อป ไปแปะในเครื่องปลายทาง จากนั้น เราก็ตั้งชื่อ และใส่ Address พร้อมกับ Port ได้เลย โดยพื้นฐานเป็น Port 9001

เมื่อเราเพิ่ม Environment เข้ามา เราจะเห็นว่า มันสามารถทำได้เหมือนกันกับ Environment ที่เราเชื่อมต่อผ่าน Docker Socket ทุกประการ

จากตัวอย่างนี้ เรารัน Agent Container ลงไปใน Synology NAS ของเรา ทำให้เราสามารถควบคุมการทำงานของ Docker บน Synology NAS ได้ตรง ๆ โดยไม่ต้องผ่าน Container Manager เราบอกเลยว่า มันทำให้เราทำงานได้ง่ายกว่าเดิมมาก ๆ

ทำให้เราสามารถติดตั้ง Portainer ได้หลายรูปแบบมาก ๆ ง่ายที่สุดคือ เราติดตั้ง Portainer ลงบนเครื่องและเชื่อมต่อกับ Docker ผ่าน Socket ปกติ หรือถ้าเรามี Docker Instance ที่ต้องจัดการจำนวนเยอะ ๆ เราสามารถติดตั้ง Portainer ผ่านเครื่องสักตัว และค่อยใช้ Agent บน Instance ที่เหลือต่อเข้ามาก็ได้เหมือนกัน ทำให้ Portainer เป็น Centralised Tool ในการจัดการ Container ได้เลยทีเดียว

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที
ปกติหากเราต้องการจะเปิดเว็บสักเว็บ เราจำเป็นต้องมี Web Server ตั้งอยู่ที่ไหนสักที่หนึ่ง ต้องใช้ค่าใช้จ่าย พร้อมกับต้องจัดการเรื่องความปลอดภัยอีก วันนี้เราจะมาแนะนำวิธีการที่ง่ายแสนง่าย ปลอดภัย และฟรี กับ Cloudflare Tunnel ให้อ่านกัน

สิ่งที่สนุกกว่านั้นคือ หากเรามี Docker Instance หลาย ๆ สาขา เราสามารถเชื่อมต่อมันเข้ามาผ่าน VPN หรือการใช้พวก Cloudflare Tunnel ได้อีก เราเขียนพวกวิธีการสร้าง และติดตั้ง Cloudflare Tunnel ไว้แล้ว กลับไปอ่านบทความได้

Managing Container Lifecycle

พอมันเป็น Container Management Tool นั่นแปลว่า มันต้องสามารถควบคุม และ จัดการ Container ได้ ตั้งแต่ การสร้าง Container จนไปถึงการลบจบ Container เลยทีเดียว

เช่น การสร้าง Container เราสามารถกด Add Container มันจะมีหน้า GUI สำหรับการรัน Container มาให้เราเลย เลิกแล้วกับการรัน Command ที่ผิดพลาดได้ง่าย Config ได้หมดตั้งแต่ชื่อ ยันไปพวก Port, Volume Mounting, Network, Environment Variable และอื่น ๆ อีกมากมาย

เมื่อสร้างแล้ว ยังสามารถควบคุม เปิด, ปิด, Restart ได้อย่างอิสระ ตั้งแต่ทำทีละ Container จนไปถึง Bulk Selection ติ๊กเลือก แล้วกดสั่งทีเดียว สำหรับเคสที่ต้องการทำหลาย ๆ Container พร้อม ๆ กัน

เรื่องที่เราชอบมาก ๆ และ Docker CLI ทำไม่ได้คือ การแก้ไขการตั้งค่าใน Container เช่น เราอยากจะเปลี่ยน Path ที่เรา Mount ไป หากเป็น CLI เดิม เราจำเป็นต้องปิด และ ลบ Container นั้นก่อน แล้วสั่งสร้างใหม่ หากเรามีพวก Volume Mount เยอะ ๆ เขียน Path ยาว ๆ มันไม่น่าสนุกเท่าไหร่นะ เราเคยต้องแก้แค่ Image ของ Gitlab นิดเดียว คือนั่งทำอยู่นานมาก ๆ ต้องมานั่งเขียน Command แล้วค่อย ๆ ไล่ลบ ไล่แก้ไปเรื่อย ๆ เพียงเพื่อจะ Upgrade เป็น Version ล่าสุด

แต่ใน Portainer เราสามารถกด Duplicate/Edit แล้วมันจะก๊อป Config ของ Container นั้น ๆ มาให้เราเลย ทำให้เราไม่ต้องมานั่งใส่ Config ทั้งหมดใหม่ แก้แค่ส่วนที่ต้องแก้เท่านั้นแล้วกด Deploy ได้เลย ล่นเวลากับลดความผิดพลาดได้มหาศาล

Feature ที่เราอยากได้มาก ๆ คือ หากเราใช้ latest Tag อยู่ หากมี Image Version ใหม่กว่าเข้ามา เราอยากให้มันเช็ค แล้วมีปุ่ม Upgrade มาก ๆ ไว้ขอไปหาเพิ่มก่อน ถ้าเจอวิธีดี ๆ แล้วเดี๋ยวจะมาเล่าให้อ่านอีกที

สรุป

Portainer เป็นเครื่องมือที่ทำให้การจัดการ Docker Container นั้นง่ายและเร็วกว่าเดิมมาก ๆ นอกจากที่เราจะสามารถควบคุมมันจาก GUI ที่ลดความผิดพลาด และความยุ่งยากในการทำงานเมื่อเทียบกับ Docker CLI ได้แล้ว มันยังทำให้เราสามารถรวมการควบคุม Docker Instance ไว้ในที่เดียว เราไม่จำเป็นต้องค่อย ๆ SSH เข้าไปจัดการทีละเครื่องอีกแล้ว ทำในหน้าเว็บที่เดียวจบสบาย นอกจากนั้น มันยังสามารถจัดการพวก Docker Swarm ได้อีก ก็คือ สนุกเลยทีนี้ ทำได้เยอะมาก ๆ ถูกใจสุด ๆ รู้งี้ใช้นานละจริง

Read Next...

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

นอกจากการทำให้ Application รันได้แล้ว อีกเรื่องที่สำคัญไม่แพ้กันคือการวางระบบ Monitoring ที่ดี วันนี้เราจะมาแนะนำวิธีการ Monitor การทำงานของ MySQL ผ่านการสร้าง Dashboard บน Grafana กัน...

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

จากตอนที่แล้ว เราเล่าในเรื่องของการ Harden Security ของ SSH Service ของเราด้วยการปรับการตั้งค่าบางอย่างเพื่อลด Attack Surface ที่อาจจะเกิดขึ้นได้ หากใครยังไม่ได้อ่านก็ย้อนกลับไปอ่านกันก่อนเด้อ วันนี้เรามาเล่าวิธีการที่มัน Advance มากขึ้น อย่างการใช้ fail2ban...