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...

การสร้าง SSD Storage Pool บน Synology DSM

การสร้าง SSD Storage Pool บน Synology DSM

สำหรับคนที่ใช้ Synology NAS บางรุ่นจะมีช่อง M.2 สำหรับเสียบ NVMe SSD โดยพื้นฐาน Synology บอกว่ามันสำหรับการทำ Cache แต่ถ้าเราต้องการเอามันมาทำเป็น Storage ละ มันจะทำได้มั้ย วันนี้เราจะมาเล่าวิธีการทำกัน...

Multiprogramming, Multiprocessing และ Multithreading

Multiprogramming, Multiprocessing และ Multithreading

หลังจากที่เรามาเล่าเรื่อง malloc() มีคนอยากให้มาเล่าเรื่อง pthread เพื่อให้สามารถยัด Content ที่ละเอียด และเข้าใจง่ายในเวลาที่ไม่นานเกินไป เลยจะมาเล่าพื้นฐานที่สำคัญของคำ 3 คำคือ Multiprogramming, Multitasking, Multiprocessing และ Multithreading...

Synology NAS และ SSD Cache จำเป็นจริง ๆ เหรอ เหมาะกับระบบแบบใด

Synology NAS และ SSD Cache จำเป็นจริง ๆ เหรอ เหมาะกับระบบแบบใด

ใน Synology NAS มีความสามารถนึงที่น่าสนใจคือ การใช้ SSD เป็น Cache สำหรับระบบ ที่ทำให้ Performance ในการอ่านเขียน เร็วขึ้นกว่าเดิมมาก ๆ แน่นอนว่า เราลองละ วันนี้เราจะมาเล่าให้อ่านกันว่า หากใครคิดที่จะทำ มันเหมาะ หรือ ไม่เหมาะกับการใช้งานของเรา...

ฮาวทูย้าย Synology Add-on Package ไปอีก Volume

ฮาวทูย้าย Synology Add-on Package ไปอีก Volume

เรื่องราวเกิดจากการที่เราต้องย้าย Add-on Package ใน DSM และคิดว่าหลาย ๆ คนน่าจะต้องประสบเรื่องราวคล้าย ๆ กัน วันนี้เราจะมาเล่าวิธีการว่า เราทำยังไง เจอปัญหาอะไร และ แก้ปัญหาอย่างไรให้ได้อ่านกัน...