Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore cloud_computing

cloud_computing

Published by Thalanglibrary, 2020-11-05 02:56:19

Description: cloud_computing

Search

Read the Text Version

พีคงที่ การตั้งชื่อโฮสตเพิ่มจะหายไป ดังนั้น หากตองการทั้งตั้งชื่อโฮสตเพิ่มและที่อยูไอพีคงที่ จะตองระบุทั้ง สองพารามิเตอรไปพรอมกันในคำสั่งเดียวกัน คือ เมื่อยกเลิกการเชื่อมตอจาก alpine-custom-net แลว หรือ ยงั ไมไดเ ชอื่ มตอกบั เครือขาย alpine-customer-net สามารถใชค ำสง่ั # docker network connect --alias ac1 --ip 192.168.100.20 alpine-custom-net alpine1 13.7 การยกเลกิ การเช่อื มตอคอนเทนเนอรกบั เครอื ขา ยเสมอื น แมการอยใู นเครือขายเสมือนเครือขายใดเครือขา ยจะเปน เง่ือนไขทสี่ ำคญั ในการสรา งและเปดการทำงาน คอนเทนเนอร แตดวยการแกไขการตั้งคาเครือขายเสมือนในโปรแกรมด็อกเกอรไมสามารถดำเนินการไดใน คำสัง่ บรรทัดเดียว ทำใหค อนเทนเนอรที่เปดการทำงานมา ณ ชวงเวลาหน่ึงสามารถเชื่อมตอตั้งแต 1 เครือขาย ขึ้นไป หรือไมมีการเชื่อมตอเครือขายเสมือนเลย ดังนั้น หากตองการยกเลิกการเชื่อมตอเครือขาย alpine- custom-net จากคอนเทนเนอร alpine1 สามารถใชค ำส่ัง # docker network disconnect alpine-custom-net alpine1 ในบางครั้ง หากคอนเทนเนอรมแี อปพลิเคชนั ที่เช่ือมตอหรือจองอนิ เตอรเฟสเครือขายอยู ผูอานสามารถ บงั คบั ยกเลิกการเชื่อมตอคอนเทนเนอรไ ดด ว ยคำสั่ง # docker network disconnect -f alpine-custom-net alpine1 13.8 การเชื่อมตอระหวางคอนเทนเนอรในเครือขา ยเสมอื น เครือขายเสมือนในด็อกเกอรถูกสรางขึ้นมาเพื่ออนุญาตใหคอนเทนเนอรสามารถเชื่อมตอหากันได โดย คอนเทนเนอรที่สามารถเชื่อมตอหากันไดจะตองอยูใ นเครอื ขายเดียวกัน หนึ่งคอนเทนเนอรสามารถเขารวมได หลายเครอื ขาย วิธีการเชอื่ มตอ กนั ระหวา งคอนเทนเนอรม ีอยู 2 วธิ ี คอื 1) การเช่ือมตอ ผา นท่ีอยูไอพี วธิ กี ารนเี้ หมาะสมกับเครือขายทีส่ รางขึน้ มาเอง และระบซุ ับเน็ต ชวงของ ที่อยูไอพี และเกตเวยใหกับเครือขาย เมื่อสรางคอนเทนเนอรดวยคำสั่ง docker run หรืออัพเดท สถานะทางเครือขายดวยคำสั่ง docker network connect จะตองระบุที่อยูไอพีในพารามิเตอร --ip ดวย ซอฟตแวรที่จะใชการเชื่อมตอประเภทนี้มักมีลักษณะจำเพาะวาตองไปที่อยูไอพีวงท่ี กำหนดเทานั้น วิธีการนี้เปนวิธีการที่ไมยืดหยุนและไมรองรับการทำงานเมื่อใชฟเจอรของ ด็อกเกอรส วอรมจงึ ไมเปน ที่นยิ ม 2) การเชื่อมตอผานช่ือโฮสต วธิ กี ารนีเ้ หมาะสำหรับเม่ือสรางคอนเทนเนอรดวยคำสั่ง docker run ช่ือ โฮสตจะถูกสรางอัตโนมัติตามชื่อของคอนเทนเนอรโดยสามารถระบุชื่อของคอนเทนเนอรไดจาก พารามิเตอร --name และเมื่ออัพเดทสถานะทางเครือขายดวยคำสั่ง docker network connect จะตองระบุชื่อโฮสตในพารามิเตอร --alias ดวยทุกครั้ง ซอฟตแวรที่ใชสามารถกำหนดการเชื่อมตอ ผานชื่อโฮสตไวลวงหนา และใชชื่อโฮสตนั้นกำหนดเปนชื่อคอนเทนเนอรเวลาสรางคอนเทนเนอร วิธีการน้ีเปนวิธีการทีย่ ืดหยุนเพราะการสรางเครือขายโดยที่ไมระบุซบั เน็ตทำใหส ามารถวิธกี ารปรับ 231

ใชง านไปตดิ ตัง้ ทเี่ ครื่องด็อกเกอรโ ฮสตอื่นได การเชอื่ มตอ ผานชื่อโฮสตเปนวิธีการท่ีสนับสนุนในด็อก เกอรส วอรม ผูอานสามารถทดลองการเชือ่ มตอกันระหวางคอนเทนเนอรดวยการเขาถึงคอนโซลของคอนเทนเนอรท ี่ กำลงั ทำงานอยู หรอื สรา งโพรเซสเชลลเขาไปไหม ดวยคำส่ัง # docker exec -it <ชือ่ คอนเทนเนอร> sh เมอ่ื เขา ถึงเชลลสามารถใชคำส่งั คำสงั่ ping <ชอ่ื โฮสต> หากโฮสตอ ยใู นเครือขายเดยี วกัน ผลลพั ธ ping จะประสบผลสำเรจ็ ดงั ภาพท่ี 13.6 ดวยขนั้ ตอนตอไปนี้ 1) สรา งโพรเซสเชลลใ หก ับคอนเทนเนอร alpine1 # docker exec -it alpine1 sh 2) พิมพคำส่งั ping ไปทช่ี ือ่ โฮสตอีกชอ่ื ของ alpine1 คอื a1 # ping -c 2 a1 3) พมิ พค ำสัง่ ping ไปทช่ี อื่ โฮสต alpine2 จะปรากฏผลลพั ธเปนทอี่ ยไู อพีคงท่ี 192.168.100.10 # ping -c 2 alpine2 4) พมิ พคำส่ัง ping ชอ่ื โฮสต alpine3 จะประกฎผลลพั ธเ ปนทอี่ ยไู อพที ี่จดั สรรอตั โนมัติ # ping -c 2 alpine3 ภาพที่ 13.6 หนา จอผลลัพธคำส่ังตรวจสอบเครือขายระหวางคอนเทนเนอร 232

13.9 การเชอ่ื มตอระหวา งคอนเทนเนอรก บั เครือ่ งคอมพิวเตอรระยะไกล การเชื่อมตอระหวางคอนเทนเนอรกับเครื่องคอมพิวเตอรระยะไกลนั้น คอนเทนเนอรจำเปนตองเปด ชองทางการเชื่อมตอใหเครื่องคอมพิวเตอรอื่นสามารถเชื่อมตอมาได ดวยเครือขายเสมือนในเทคโนโลยีบรรจุ ภัณฑ คอนเทนเนอรจำเปนตองใชที่อยูไอพีเดียวกับด็อกเกอรโฮสต แตใชพอรตที่ยังวางอยู พอรตที่ยังวาง คือ พอรตที่ไมถูกใชโดยคอนเทนเนอรหรือโฮสต เชน หากสรางคอนเทนเนอร httpd โดยจองพอรต 80 ไว ผูอาน จะไมสามารถสรางอกี คอนเทนเนอรท จี่ องพอรต 80 หรอื เครอื่ งด็อกเกอรโฮสตไมสามารถตดิ ตง้ั เว็บเซิรฟเวอรใช พอรต 80 ไดในเวลาเดียวกัน นอกจากน้ี การจองพอรตยังไมอนญุ าตใหใ ชง านพอรตแมขอบเขตของที่อยูไอพีจะ ไมเหมือนกันก็ตาม เชน หากจองพอรตของด็อกเกอรโฮสตที่มีขอบเขต 127.0.0.1:80 จะไมสามารถจองพอรต ของดอ็ กเกอรโฮสตท ี่มขี อบเขตเปน 0.0.0.0:80 หรอื 192.168.1.2:80 ไดเ ชน กัน อยางไรก็ตามการตั้งคาการเชื่อมตอระหวางคอนเทนเนอรกับเครื่องคอมพิวเตอรระยะไกลในโปรแกรม ด็อกเกอรมีขอจำกัดที่การตั้งคาสามารถกระทำไดเฉพาะตอนที่สรางคอนเทนเนอรดวยคำสั่ง docker create หรือ docker run เทานั้น คำสั่ง docker create จะสรางคอนเทนเนอรแตยังไมเปดการทำงาน สวนคำส่ัง docker run จะสรางคอนเทนเนอรและเปดการทำงาน หากไมไดตั้งคาหรอื ตั้งคาผดิ พลาดจะตองลบและสราง คอนเทนเนอรใหมอกี ครงั้ เทาน้ัน พารามิเตอรสำหรับเชื่อมตอพอรตของดอกเกอรโฮสตกับคอนเทนเนอรคือ -p เชน หากตองการสราง คอนเทนเนอรเ วบ็ เซิรฟเวอร Apache จากอมิ เมจ httpd โดยเชื่อมตอ พอรต 80 ของคอนเทนเนอรไปยังพอรต 5000 ของด็อกเกอรโฮสต # docker run -d -v /root/website:/usr/local/apache2/htdocs -p 5000:80 httpd เม่อื พมิ พค ำสงั่ ด็อกเกอรโ ฮสตจะสรางกฎของไฟรว อลลโดยอัตโนมตั ิ ผอู านสามารถตรวจสอบพอรตและ ขอบเขตท่ถี ูกจองโดยดอ็ กเกอรโฮสต ดว ยคำสง่ั # ss -pant | egrep \"docker-proxy|$\" 233

เมื่อพิมพคำสั่ง จะปรากฏผลลัพธดังภาพที่ 13.7 แสดงโพรเซส docker-proxy ไดจองพอรต 5000 ที่มี ขอบเขตเปน 0.0.0.0 ไวเรียบรอย นอกจากนี้ ด็อกเกอรโฮสตยังสรางกฎของไฟรวอลลเพื่อยายเชื่อมตอพอรต กับคอนเทนเนอรต ามคำส่ัง ดงั ภาพท่ี 13.8 โดยสามารถตรวจสอบไดดวยคำส่งั ตรวจสอบการยายขอมลู ไปยังคอนเทนเนอร # iptables -S DOCKER ตรวจสอบพอรต ทจ่ี องท่ดี ็อกเกอรโ ฮสต # iptables -L DOCKER -n ภาพที่ 13.7 หนาจอผลลัพธคำสง่ั แสดงโพรเซส docker-proxy ภาพที่ 13.8 หนาจอผลลพั ธคำส่ังแสดงรายการท่ีอนญุ าตของไฟรวอลล 234

บทสรุป เครือขา ยเสมือนในด็อกเกอรมีไดรเ วอรอยู 5 ประเภท 1) บริดจ (Bridge) ไดรเวอรนี้เหมาะสมหากตองการใหคอนเทนเนอรสามารถเชื่อมตอเครื่องภายนอก หรอื อนิ เทอรเน็ต 2) โฮสต (Host) เปนไดรเ วอรเครอื ขา ยท่เี ชือ่ มตอเฉพาะคอนเทนเนอรก บั โฮสตเทา น้นั 3) โอเวอรเลย (Overlay) เปนไดรเวอรที่เชื่อมเครื่องคอมพิวเตอรที่ติดตั้งด็อกเกอรโฮสตหลายเครื่อง เขาดว ยกนั 4) แมควีแลน (Macvlan) เปนไดรเวอรที่อนุญาตใหระบุที่อยูทางกายภาพของอินเตอรเฟสเครือขาย (MAC address) ใหก ับอินเตอรเฟสเครอื ขายของคอนเทนเนอรได 5) ไมม ี (None) ไมมีไดรเ วอรแ ละไมสามารถเช่อื มตอเครือขายได เมื่อเครือขายเสมือนในด็อกเกอรถูกสราง ระบบปฏิบัติการลีนุกซจะสรางเครือขายที่ใชใน ระบบปฏิบัติการควบคูก ันไปดวย โดยสามารถกำหนดขอบเขตของที่อยูไอพีใหกับเครือขายเสมือนที่ถูกสรางได โดยมเี ฉพาะคอนเทนเนอรเทา นัน้ ทส่ี ามารถนำเครอื ขายเสมือนไปใชง านได คอนเทนเนอรหนึง่ สามารถเขารวมเครือขายเสมือนไดกีเ่ ครือขายก็ได สามารถระบุคุณสมบัติเบื้องตนใน ขณะที่สรางคอนเทนเนอร หรือแกไขในภายหลังได ในกรณีที่ตองการอัพเดทการตั้งคาการเชื่อมตอไปยัง เครือขายเสมือนของคอนเทนเนอรโดยไมหยุดการทำงานของคอนเทนเนอร ผูอานสามารถทำไดโ ดยยกเลิกการ เชื่อมตอ และเช่ือมตอใหมอ กี คร้ัง วิธีการปฏิสัมพันธระหวางคอนเทนเนอรในเครือขายเดียวกันที่เหมาะสม คือ การใชชื่อคอนเทนเนอรท่ี ระบุในพารามิเตอร --name เมื่อสรางคอนเทนเนอร เนื่องจากการอางอิงจากที่อยูไอพีอาจไมเสถียร และการ กำหนดที่อยูไอพีคงที่ทำใหการบริหารจัดการยุง ยากขึ้น เครื่องคอมพิวเตอรอื่นภายนอกจะสามารถเชื่อมตอไป ยังคอนเทนเนอรทท่ี ำงานภายในไดโ ดยผา นพอรตทีร่ ะบใุ หเ ชอ่ื มตอ กนั 235

สรปุ คำส่ังที่นา สนใจ คำสง่ั หรอื ช่ือคำสัง่ ทีเ่ กี่ยวขอ ง เนือ้ หา # docker network ls # docker network create --driver bridge แสดงรายการเครือขายเสมือนจากด็อกเกอรโ ฮสต alpine-net สรา งเครอื ขายเสมอื น # docker network create สรา งเครือขายเสมือนโดยระบุทอ่ี ยูไ อพขี องเครือขาย --driver bridge --subnet 192.168.100.0/24 และท่ีอยไู อพีทแ่ี จกอตั โนมตั ิ --ip-range 192.168.100.0/24 --gateway 192.168.100.1 alpine-custom-net ตรวจสอบรายละเอียดของเครือขายเสมือน # docker network inspect alpine-net ตรวจสอบซบั เนต็ ของเครือขายและเกตเวยของ # docker network inspect alpine-net -f เครอื ขาย \"{{json .IPAM.Config}}\" | jq ตรวจสอบคอนเทนเนอรท่ถี ูกสรางในเครือขายและที่ # docker network inspect alpine-net -f อยูไ อพีท่ีไดร บั \"{{json .Containers}}\" | jq สรางคอนเทนเนอรพรอมเครือขายเสมือน # docker run -dit --name alpine1 สรางคอนเทนเนอรพรอ มเครือขา ยเสมือนและระบุท่ี --network alpine-net alpine sh อยไู อพี # docker run -dit --name alpine2 ตรวจสอบสถานะของเครอื ขา ยเสมอื นของคอนเทน --network alpine-custom-net เนอร --ip 192.168.100.10 alpine sh ตรวจสอบคอนเทนเนอรจากมุมมองของเครือขาย # docker inspect -f '{{json เช่ือมตอ คอนเทนเนอรก บั เครือขายเสมือน .NetworkSettings.Networks}}' alpine1 | jq # docker network inspect alpine-net -f ยกเลิกการเช่ือมตอเครือขาย \"{{json .Containers}}\" | jq ตรวจสอบพอรตและขอบเขตทถี่ ูกจองโดยดอ็ กเกอร # docker network connect โฮสตตรวจสอบพอรต ทจี่ องท่ีดอ็ กเกอรโ ฮสต --alias ac1 --ip 192.168.100.20 alpine-custom-net alpine1 # docker network disconnect alpine- custom-net alpine1 # ss -pant | egrep \"docker-proxy|$\" # iptables -S DOCKER # iptables -L DOCKER -n 236

แบบฝก หดั บทที่ 13 1. บอกประเภทของเครอื ขายเสมอื นในด็อกเกอร 2. บอกความสมั พันธร ะหวางซับเน็ต และชว งของทอี่ ยูไอพใี นเครือขายเสมอื น 3. บอกวธิ กี ารตรวจสอบทอี่ ยูไอพขี องคอนเทนเนอร 4. บอกวิธกี ารตรวจสอบทีอ่ ยูไอพขี องคอนเทนเนอรท ง้ั หมดในเครอื ขายเสมอื น 5. คอนเทนเนอรสามารถเชอื่ มตอเครือขายเสมือนไดก ีเ่ ครอื ขา ย 237

6. อธบิ ายหลักการของคำส่งั docker network connect และ docker network disconnect 7. หากเช่ือมตอคอนเทนเนอรเ ขากบั เครือขายเสมือนอนื่ การเชื่อมตอคอนเทนเนอรกับเครือขา ยเสมอื นเดมิ จะ ยงั คงอยูหรือไม 8. หากตอ งการเปล่ยี นท่ีอยูไ อพีของคอนเทนเนอรในเครือขา ยเสมือนจะตองทำอยางไร 9. หากยกเลิกการเชือ่ มตอ และเชื่อมตอคอนเทนเนอรเ ขา กับเครอื ขา ยเสมือนใหมอีกครงั้ จำเปนตองระบุ พารามิเตอรการตัง้ คาเดิมท้ังหมดกอนการยกเลิกการเช่ือมตอหรอื ไม เพราะเหตุใด 10. บอกคำสัง่ ทใ่ี ชแ สดงกฎของไฟรวอลลท ่ีเชือ่ มตอพอรตกบั คอนเทนเนอร 238

การสรางอมิ เมจ บทนำ การสงมอบซอฟตแวรในรปู แบบของอิมเมจเปนปจจัยพ้ืนฐานสำคัญของการดึงประโยชนจากเทคโนโลยี บรรจภุ ัณฑไดอ ยา งสูงสุด คอื นอกจากการดาวนโหลดอิมเมจมาตรฐานจากรีจสี ตรีมาใชง านแลว ผูอานสามารถ สรางอิมเมจ และอัพโหลดอิมเมจท่ีสรางขึ้นเก็บไวท ี่รจี ีสตรีไดเชนกัน หลักการของการสรางอิมเมจเบื้องตน คือ การระบุคำสั่งสำหรับการติดตั้งแพ็คเกจหรือคัดลอกแฟมขอมูลที่จำเปนสำหรับการสงมอบซอฟตแวร อยางไรก็ตาม อิมเมจสามารถอางอิงอิมเมจไดเพื่อสรางชั้นขอมูลบนอิมเมจที่อางอิงอีกที ดังนั้น ผูอานไม จำเปนตอ งเขียนคำส่งั ตดิ ตั้งแพ็คเกจเว็บเซิรฟเวอร เพอ่ื ปรบั ใชงานเว็บแอปพลิเคชันที่พัฒนาข้ึนมา แตสามารถ อา งองิ อิมเมจของเวบ็ เซิรฟ เวอร เพอื่ คอมไพลห รอื คัดลอกเฉพาะแฟมขอมลู ของเว็บแอปพลเิ คชันก็ได 14.1 โครงสรางของ Dockerfile แฟมขอมูล Dockerfile เปนแฟมขอมูลที่ระบุคำสั่งสำหรับสรางอิมเมจใหม แฟมขอมูล Dockerfile ไมไดใชเก็บแฟมขอมูลของแอปพลิเคชันที่ตองการบรรจุในคอนเทนเนอร แตประกอบดวยลำดับของชุดคำส่ัง พรอ มคำส่งั และพารามิเตอร ชดุ คำส่ัง คอื คำสัง่ เฉพาะในรปู แบบคียเวริ ดท่ีกำหนดโดยโปรแกรมด็อกเกอร สวน คำสง่ั คือ คำส่งั ทส่ี ามารถพิมพบ นเชลลของลีนุกซหรอื วินโดวสได รปู แบบคำสัง่ ท่ีนิยมใชใน Dockerfile มีอยู 2 รูปแบบ คอื 1) รูปแบบของเชลล เปนรูปแบบคำสั่งที่เหมือนกับการพิมพคำสั่งบนเชลลของลีนุกซหรือวินโดวส แต ละสวนคั่นดวยการเวนวรรค หากมหี ลายพารามิเตอร แตล ะพารามิเตอรจ ะคน่ั ดว ยการเวนวรรค จะ โดยจะมีรูปแบบเปน <ชุดคำสัง่ > <คำสงั่ > <พารามเิ ตอรข องคำสง่ั > 2) รูปแบบด็อกเกอร เปนรูปแบบคำสั่งที่ออกแบบโดยด็อกเกอร นิยมใชคำสั่งหรือพารามิเตอรที่มี เวนวรรค ถูกเขียนใหอยูในรูปแบบคลายอารเรยในภาษาเขียนโปรแกรมคือมีเคร่ืองหมาย อัญประกาศครอบแตล ะคำสงั่ และพารามิเตอร หากมหี ลายพารามเิ ตอรแตล ะพารามิเตอรจะคั่นดวย เครอื่ งหมายจลุ ภาค (,) โดยจะมีรูปแบบเปน <ชุดคำสั่ง> [\"คำสัง่ \",\"พารามิเตอร1\",\"พารามิเตอร2 \",…] ในปจจุบัน ผูอานสามารถใชรูปแบบใดรูปแบบหนึ่งสำหรับเขียนชุดคำสั่งใน Dockerfile หรือจะเขียน ผสมกนั ระหวา งสองรูปแบบตามความถนัด เชน คำส่ังแรกใชร ูปแบบเชลล อกี คำสง่ั ใชรูปแบบด็อกเกอร เปนตน ในกรณีที่ตองการคอมเมนตชุดคำสั่งบรรทัดไหนสามารถพิมพเครื่องหมาย # ใหอยูตนบรรทัด บรรทัดนั้นท้ัง บรรทัดจะไมถูกประมวลผลในขณะที่สรางอิมเมจ ดวยเหตุนี้ โครงสรางของ Dockerfile จึงเปนลักษณะท่ี สนใจบรรทดั (Line sensitive) และไมมีตัวคนั่ บรรทัดอยางเคร่ืองหมาย semi-colon (;) เหมอื นในภาษาเขียน โปรแกรมอยางภาษาซี และหากชุดคำสั่งในรูปแบบของเชลลมีความยาวมากสามารถขึ้นตนบรรทัดใหมดวย เครอ่ื งหมายทับขวา (\\) ยกตัวอยา งดังภาพท่ี 14.1 239

1 FROM centos:8 2 # บรรทัดนค้ี อนเมน 3 RUN yum install wget \\ 4 unzip 5 CMD [\"wget\",\"http://server/file.zip\"] ภาพท่ี 14.1 ตัวอยางแฟมขอมูล Dockerfile บรรทัดแรกมีชุดคำสั่ง FROM พารามิเตอรเปน centos:8 บรรทัดที่สองเปนบรรทัดที่มีเครื่องหมาย # หมายถึงคอมเมน คอื ไมม กี ารประมวลผล บรรทัดทสี่ ามเปน มชี ุดคำสงั่ เปน RUN และมคี ำส่ัง yum เพ่ือติดตั้ง แพ็คเกจ คำสั่ง yum มีความยาว 2 บรรทัดและทำงานเหมือนเปนคำสัง่ บรรทัดเดียวเพราะทา ยบรรทัดที่สองมี เครื่องหมายทับขวา คำสั่ง yum นี้มีพารามิเตอรเปน install wget unzip จำนวน 3 พารามิเตอร บรรทัดที่ 5 ชุดคำส่ังเปน CMD มคี ำส่ัง wget และพารามิเตอรจำนวน 1 พารามิเตอร คือ http://server.file.zip 14.2 คำสงั่ ท่ใี ชงานใน Dockerfile ชดุ คำส่ังทใ่ี ชงานใน Dockerfile ทีจ่ ำเปน สำหรับสรางอมิ เมจมีทั้งหมด 9 คำสง่ั คือ 1) ชดุ คำสั่ง FROM ชุดคำสั่ง FROM ใชเริ่มตนสรางอิมเมจโดยการตั้งคาอิมเมจพื้นฐานสำหรับเพิ่มชุดคำสั่งอื่นตามมา สามารถหาไดจ ากรีจีสตรีมาตรฐาน สามารถใชเปนระบบปฏบิ ตั ิการ หากตอ งการติดต้งั โปรแกรมอื่น ที่เกี่ยวของกับซอฟตแวรเอง หรือใชเปนเฟรมเวิรก หากตองการคอมไพลหรือเปดการทำงาน ซอฟตแวรโดยใชเครื่องมือที่อาศัยจากเฟรมเวิรก หรือใชเปนแอปพลิเคชันที่ติดตั้งพรอม หากตองการคัดลอกแฟมขอมูลที่จำเปนสำหรับเปดการทำงานแอปพลิเคชัน ชุดคำสั่ง FROM สามารถใชตั้งชื่ออิมเมจภายใน Dockerfile เดียวกันเพื่อใชอางอิงเวลาคัดลอกแฟมขอมูลระหวาง อิมเมจ ตัวอยางชุดคำสั่ง FROM centos:8 As builder หมายถึงเริ่มตนสรางอิมเมจโดยใชอิมเมจของ ระบบปฏิบตั กิ าร Centos 8 เปนอิมเมจเร่มิ ตน 2) ชุดคำสง่ั RUN ชุดคำสั่ง RUN จะรับคำสัง่ ในรูปแบบเชลล คำสั่งที่รับเปนคำส่ังทีใ่ ชสั่งงานโปรแกรม เชน การติดตง้ั แพ็คเกจ การคอมไพลแอปพลิเคชัน เปนตน ผลลัพธของการใชคำสั่งนี้จะไดชั้นขอมูลเพิ่ม 1 ชั้น ตอ 1 ชุดคำส่งั และบันทกึ ผลลัพธนัน้ ทันที ตวั อยา งชดุ คำส่งั RUN yum -y update หมายถงึ อพั เดทแพ็คเกจดว ยโปรแกรม yum พารามิเตอร -y จะชวยตอบรบั คำถามวา ใช หากขึน้ คำถามใด ๆ จากการใชโ ปรแกรม yum 3) ชดุ คำสงั่ EXPOSE ชุดคำสั่ง EXPOSE เปนคำสั่งที่แจงใหด็อกเกอรโฮสตทราบวา คอนเทนเนอรนี้จะมีพอรตอะไรให เชื่อมตอเมื่อตอนเปดการทำงาน ผูอานสามารถระบุโพรโตคอลเปน TCP หรือ UDP แตหากไมระบุ 240

โพรโตคอลเริ่มตนจะเปน TCP อยางไรก็ตามแม EXPOSE จะแจงด็อกเกอรโฮสตวาเมื่อสรางคอน เทนเนอรจากอิมเมจนี้สมควรจะเปดพอรตใด แตก็ไมไดเผยแพรพอรตนั้นไปยังด็อกเกอรโฮสตอยูดี ดังนั้น หากตองการเผยแพรพอรตของคอนเทนเนอรไปยังด็อกเกอรโฮสตใหใชพารามิเตอร -p เมื่อ สรา งคอนเทนเนอร ดงั นน้ั ชุดคำสั่ง EXPOSE เปนชดุ คำสงั่ เสริม หากมจี ะทำใหคนที่นำอิมเมจไปใช เขา ใจการใชง านไดด ขี น้ึ ตัวอยางชุดคำสั่ง EXPOSE 80 หมายถึง เมื่อสรางคอนเทนเนอรจากอิมเมจนี้ คอนเทนเนอรควร เช่ือมตอพอรต 80 กับด็อกเกอรโ ฮสต 4) ชุดคำสง่ั ADD ชดุ คำสงั่ ADD คัดลอกแฟมขอ มลู ไดเรกทอรีท่ีอยทู องถิน่ หรอื ทอ่ี ยรู ะยะไกลจาก URL เขาไปเก็บไว ในอิมเมจโดยการสรางชั้นขอมูลใหมและบันทึกทันที การคัดลอกแฟมขอมูลหรือไดเรกทอรีที่จะ คัดลอกจากดอ็ กเกอรล ูกขา ย หากแฟมขอมูลทองถนิ่ ทค่ี ัดลอกเปนแฟม ขอมูลบบี อัด เชน มีนามสกุล .tar.gz .zip .tgz เม่ือคดั ลอกเสร็จ ดอ็ กเกอรจ ะแยกแฟมขอมูลนน้ั ใหกลายเปนไดเรกทอรี ในกรณีที่ เปนท่ีอยรู ะยะไกลรองรับโพรโตคอล http https และ ftp ตัวอยางชุดคำสั่ง ADD https://www.download.com/file.zip /root หมายถึงดาวนโหลด แฟมขอมูล file.zip จาก URL แยกแฟมขอมูลไวที่ไดเรกทอรี file และบันทึกไวที่ไดเรกทอรี /root ของอิมเมจ 5) ชุดคำสัง่ COPY ชุดคำสั่ง COPY คัดลอกแฟมขอมูล ไดเรกทอรี หรือแฟมขอมูลที่อยูจากอิมเมจอื่นเขาไปเก็บไวใน อิมเมจโดยการสรางชัน้ ขอมูลใหมและบันทึกทันที การคัดลอกแฟมขอมูลหรือไดเรกทอรีจะคัดลอก จากด็อกเกอรลูกขาย หากแฟมขอมูลทองถิ่นที่คัดลอกเปนแฟมขอมูลบีบอัดด็อกเกอรจะไมแยก แฟมขอมูลใหกลายเปนไดเรกทอรี ในกรณีที่แฟมขอมูลอยูที่อิมเมจอื่นสามารถใชพารามิเตอร -- from <ช่อื อมิ เมจ> ตัวอยางชุดคำสั่ง COPY --from=builder /release /app หมายถึงคัดลอกไดเรกทอรี /release จากอิมเมจช่อื builder ไปยังไดเรกทอรี /app ของอิมเมจทก่ี ำลังทำงานอยู 6) ชุดคำส่งั CMD ชุดคำสั่ง CMD ระบุคำสั่งท่ีจะทำงานเมื่อสรางคอนเทนเนอรจากอิมเมจนี้ และจะไมถูกสั่งใหทำงาน ในระหวางการสรางอิมเมจ การระบุชุดคำสั่ง CMD ควรระบุไวในบรรทัดสุดทายของ Dockerfile หากระบุไวหลายที่เฉพาะชุดคำสั่ง CMD ในบรรทัดทายสุดจะทำงาน ชุดคำสั่ง CMD จะทำงานก็ ตอเมือ่ ไมมคี ำสง่ั เร่ิมตน การทำงานทร่ี ะบุในขณะทส่ี รางคอนเทนเนอร ตวั อยางชดุ คำส่งั CMD [\"httpd\",\"-DFORGROUND\"] หมายถึง เม่ือสรา งคอนเทนเนอรจ ากอิมเมจนี้ โดยไมระบุคำสั่งเริ่มตนการทำงาน เมื่อคอนเทนเนอรเปดการทำงานจะทำคำสั่ง httpd - DFORGROUND แตหากระบุคำส่ังเริ่มตนการทำงานเชน bash หรือ sh เพอ่ื เขาถงึ เชลลในคอนเทน เนอรข ณะสรางคอนเทนเนอร คำส่ัง httpd -DFORGROUND จะไมทำงาน 241

7) ชุดคำสั่ง ENTRYPOINT ชุดคำสั่ง ENTRYPOINT ระบุคำสั่งที่จะทำงานเมื่อสรางคอนเทนเนอรจากอิมเมจนี้ และจะไมถูกส่ัง ใหทำงานในระหวางการสรางอิมเมจ การระบุชุดคำสัง่ ENTRYPOINT ควรระบุไวในบรรทัดสุดทาย หรือบรรทัดกอนชดุ คำส่งั CMD หากระบุไวห ลายท่ีเฉพาะชุดคำสั่ง ENTRYPOINT ในบรรทดั สดุ ทาย จะทำงาน ชุดคำสั่ง ENTRYPOINT มีความแตกตางจากชุดคำสั่ง CMD ตรงที่ชุดคำส่ัง ENTRYPOINT จะทำงานเสมอแมระบุคำสั่งเพิ่มเติมในขณะที่สรางคอนเทนเนอร หากใชชุดคำส่ัง CMD รว มดวยกับชุดคำสั่ง ENTRYPOINT คำสง่ั ในชุดคำสง่ั ENTRYPOINT จะกลายเปน คำสั่ง สวน คำสั่งในชุดคำสั่ง CMD จะกลายเปนพารามิเตอร เชนเดียวกัน หากระบุคำสั่งเริ่มตนการทำงานใน ขณะที่สรางคอนเทนเนอร ชุดคำสั่งใน CMD จะไมทำงาน แตคำสั่งเริ่มตนการทำงานจะกลายเปน พารามเิ ตอรของชดุ คำส่ัง ENTRYPOINT แทน ตัวอยางชุดคำสั่ง ENTRYPOINT [\"docker-endpoint.sh\"] หมายถึง เมื่อสรางคอนเทนเนอรจาก อิมเมจนี้โดยไมระบุคำสั่งเริ่มตนการทำงาน เมื่อคอนเทนเนอรเปดการทำงานจะทำคำส่ัง docker-endpoint.sh แตหากระบุคำสั่งเริ่มตนการทำงานหรือระบุคำสั่ง CMD เปนคำสั่งถัดมาวา CMD [\"httpd\"] เม่อื คอนเทนเนอรเ ปดการทำงานจะทำคำสัง่ docker-endpoint.sh httpd 8) ชุดคำสั่ง VOLUME ชุดคำสั่ง VOLUME เปนคำสั่งที่สรางที่เก็บขอมูลที่ด็อกเกอรโฮสตตางหากโดยจะเชื่อมตอกับที่อยู ไดเรกทอรีที่ระบุไวในชุดคำสั่ง ในกรณีที่คอนเทนเนอรถูกสรางดวยพารามิเตอร -v และเชื่อมตอ ไดเรกทอรใี นชุดคำสง่ั นี้ ดอ็ กเกอรโ ฮสตจะเชื่อมตอไดเรกทอรีของด็อกเกอรโฮสตและไดเรกทอรีของ คอนเทนเนอร แตหากไมไดระบุไดเรกทอรีในชุดคำสั่งนี้ในพารามิเตอร -v ด็อกเกอรโฮสตจะสราง ไดเรกทอรีเฉพาะและเชื่อมตอกบั ไดเรกทอรขี องคอนเทนเนอร ซง่ึ ไดเรกทอรีเฉพาะน้ีจะไมถูกลบเมื่อ คอนเทนเนอรถูกลบ ทอี่ ยขู องไดเรกทอรีเฉพาะสามารถตรวจสอบไดจ ากคำสั่ง docker inspect ตัวอยางชุดคำสั่ง VOLUME /database หมายถึง สรางไดเรกทอรีเฉพาะที่ด็อกเกอรโฮสตและ เชือ่ มตอ กบั ทอ่ี ยูไดเรกทอรี /database ของคอนเทนเนอร 9) ชดุ คำส่งั WORKDIR ชุดคำสั่ง WORKDIR ระบุคำสั่งเปนไดเรกทอรีของคอนเทนเนอร มีไวเพื่อใชเปลี่ยนไดเรกทอรีของ คอนเทนเนอรแ ทนคำสั่ง cd 14.3 การใชตวั แปรสภาพแวดลอม การระบุคำสั่งและพารามิเตอรใน Dockerfile นัน้ สามารถระบคุ ำส่ังไดสองรูปแบบ คอื ระบโุ ดยการพิมพ ขอความลงไป หรือระบุชื่อตัวแปรที่สามารถระบุคาตัวแปรในขณะที่สั่งสรางอิมเมจ โดยคาของตัวแปรจะไป เปลี่ยนแปลงการทำงานของ Dockerfile โดยที่ไมตองแกไข Dockerfile การใชตัวแปรสภาพแวดลอมเหลานี้ เหมาะสมเมื่อมีการเปลี่ยนแปลงเวอรชันของซอฟตแวร และตองการคัดลอกแฟมขอ มูลท่ีมชี ่ือตามเวอรชันใหม ไปเพื่อสรางชั้นขอมูลของอิมเมจดวยกระบวนการเดิม หรือที่ตำแหนงที่ตองอางอิงคาที่เหมือนกันใน 242

Dockerfile เชน Dockerfile เขียนคำสั่งดาวนโหลดแฟมขอมูล https://server/version1.0.0.zip เม่ือ ซอฟตแวรม กี ารอัพเดทเปน 1.0.1 แทนทจ่ี ะไปแกไ ข Dockerfile ใหม ใหอา งอิง version1.0.0.zip จากตัวแปร แทน ทำใหเมื่อมีการอัพเดทอิมเมจ ผูอานสามารถสงผานตัวแปรใหมเขาไปไดทันที โดยด็อกเกอรสนับสนุนตัว แปรสภาพแวดลอ มอยู 2 ประเภท คอื 1) ชุดคำสั่ง ARG ใชเพื่อประกาศตวั แปรสภาพแวดลอมท่ีสามารถรับคาผา นคำสั่ง docker build และ คาของตวั แปรที่ประกาศในชุดคำส่ังนีจ้ ะคงอยใู นขณะทีส่ รางอิมเมจเทา น้นั 2) ชุดคำสั่ง ENV ใชเพือ่ ประกาศตัวแปรสภาพแวดลอ มท่มี ีคา คงอยใู นขณะที่สรา งอมิ เมจ และในขณะท่ี นำอมิ เมจนี้ไปสรา งคอนเทนเนอร แตจ ะไมสามารถรับคาผานคำส่ัง docker build ได ตัวอยางเชน หากระบุชุดคำส่ัง ARG version 5 และ ENV patch 6 ใน Dockerfile ผูอานสามารถ เปลี่ยนคาของตัวแปร version ไดจากการระบุคา ใหมใ นพารามิเตอร แตไ มส ามารถเปลยี่ นคาตัวแปร patch ได โดยไมแกไข Dockerfile ยกตัวอยางเชน ในขณะที่สรางอิมเมจ หากนำตัวแปรนี้ไปอางอิงกับชุดคำสั่งอ่ืน เชน ADD http://server/${version}/program-${patch}.zip /root จ ะ ด า ว น  โ ห ล ด แ ฟ  ม ข  อ ม ู ล จ า ก http://server/5/program-6.zip ไปเกบ็ ไวท ีไ่ ดเรกทอรี /root ของคอนเทนเนอร 14.4 ตวั อยางการสราง Dockerfile สำหรับเว็บแอปพลิเคชนั รูปแบบของเว็บแอปพลิเคชนั เปนหน่ึงในรูปแบบทนี่ ิยมปรบั ใชง านดวยเทคโนโลยบี รรจุคอนเทนเนอร แม ตัวอยางจะเปนการสรางอิมเมจสำหรับเว็บแอปพลิเคชัน ก็แตสามารถประยุกตใชกับแอปพลิเคชันประเภทอ่ืน ได ลำดับการสรางอมิ เมจของเว็บไซตประกอบขนั้ ตอนหลัก 3 ขน้ั ตอน คือ ขนั้ ตอนแรกตดิ ตัง้ แพ็คเกจซอฟตแวร ที่จำเปนตอการใชง าน ข้ันตอนที่ 2 คดั ลอกแฟม ขอมูลเว็บไซตท ีพ่ ัฒนาข้ึนไปที่อิมเมจ และข้นั ตอนสุดทา ย ส่ังให โปรแกรมทำงานเม่ือเริม่ เปดการทำงานคอนเทนเนอร สำหรับตัวอยางนี้เปนตัวอยางการปรับใชเว็บแอปพลิเคชันที่เขียนดวยภาษา PHP โดยเริ่มตนกอนการ สราง Dockerfile ใหเ ตรยี ม index.php ตวั อยา ง ไวใ นไดเรกทอรยี อย website ดงั น้ี # mkdir website # echo \"<?php phpinfo(); ?>\" > website/index.php จากนน้ั จึงเริม่ สรา งแฟม Dockerfile ตามภาพที่ 14.2 243

1 FROM centos:8 2 RUN yum -y install epel-release 3 https://rpms.remirepo.net/enterprise/remi-release-8.rpm 4 RUN yum -y module enable php:remi-7.4 5 RUN yum -y install php php-cli php-common php-mysql httpd 6 WORKDIR /var/www/html 7 COPY website/ . 8 RUN mkdir -p /run/php-fpm 9 CMD php-fpm -D && httpd -DFOREGROUND ภาพที่ 14.2 ตวั อยา ง Dockerfile ของแอปพลิเคชนั เวบ็ ไซต จาก Dockerfile ในภาพท่ี 14.2 ประกอบดว ยคำส่ังทง้ั หมด 9 บรรทดั เรียงลำดับต้ังแต FROM ถึง CMD อธิบายไดวา บรรทัดที่ 1 FROM centos:8 หมายถึง อางอิงอิมเมจของระบบปฏิบัติการ CentOS 8 บรรทัดที่ 2 ถึง บรรทัดท่ี 4 เปนคำสั่ง yum สำหรับติดตั้งแพ็คเกจที่จำเปนสำหรับการทำงาน PHP 7.4 และ เว็บเซิรฟเวอร Apache จากนั้นบรรทัดท่ี 5 เปลี่ยนไดเรกทอรีของคอนเทนเนอรไปที่ /var/www/html เพื่อที่จะคัดลอกทุกแฟมขอมูลในไดเรกทอรี website ฝงด็อกเกอรลูกขายไปยัง ไดเรกทอรีปจจุบันของ คอนเทนเนอรซึ่งก็คือ /var/www/html ในบรรทัดท่ี 6 จากนั้นบรรทัดที่ 7 คัดลอกแฟมขอมูลจากไดเรกทอรี website ไปใสในอิมเมจไดเรกทอรีปจจุบัน (/var/www/html) สุดทายเตรียมการสำหรับใหโพรเซสสำหรับ ประมวลผล PHP และเวบ็ เซริ ฟ เวอรท ำงานในบรรทดั ที่ 8 และ 9 14.5 ตัวอยางการสราง Dockerfile สำหรบั คอนโซลแอปพลิเคชัน รูปแบบของคอนโซลแอปพลิเคชันเปนหนึ่งในรูปแบบที่นิยมปรับใชงานดวยเทคโนโลยีบรรจุคอนเทน เนอรแมหัวขอนี้จะอธิบายคอนโซลแอปพลิเคชันที่ตองคอมไพลรหัสตนฉบับกอนการทำงาน แตก็สามารถ ประยุกตใชกบั แอปพลิเคชันรปู แบบอนื่ ท่ีตองอาศัยการคอมไพลรหัสตนฉบบั กอนอยางเว็บแอปพลิเคชัน ลำดับ ของการสรา งอิมเมจของคอนโซลแอปพลิเคชันประกอบดว ยขั้นตอนหลัก 4 ข้นั ตอน คอื ขน้ั ตอนแรก คือ เลือก อิมเมจที่บรรจุเครื่องมือสำหรับคอมไพลแอปพลิเคชัน และคัดลอกแฟมขอมูลรหัสตนฉบับ ขั้นตอนที่สอง คือ คอมไพลรหัสตนฉบับดวยเครื่องมือที่จำเปน และกำหนดไดเรกทอรีที่บันทึกรหัสตนฉบับไว ขั้นตอนที่สาม คือ เลือกอิมเมจที่บรรจุเฉพาะเครื่องมือสำหรับใหแอปพลิเคชันทำงาน และคัดลอกแฟมขอมูลที่คอมไพลแลวจาก ข้นั ตอนทส่ี อง ขัน้ ตอนสุดทาย คือ ส่ังใหโปรแกรมทำงานเม่อื เร่ิมเปดการทำงานคอนเทนเนอร เนื่องจากแอปพลิเคชนั ท่ีตองคอมไพลน ัน้ มีคณุ สมบตั คิ ือ ขอ มลู ตัง้ ตนเปนรหสั ตนฉบับซง่ึ ผูอ านไมตองการ เก็บไวในคอนเทนเนอรดวยเหตุผลหลายประการเชน ลิขสิทธิ์ซอฟตแวร ความลับทางการคา และขนาดของ อิมเมจที่ใหญเนื่องจากเก็บขอมูลที่ไมจำเปน ดังนั้น การสราง Dockerfile สำหรับแอปพลิเคชันประเภทน้ี จะตองอางอิงอิมเมจอยางนอย 2 ครั้ง โดยครั้งแรก เปลี่ยนรหัสตนฉบับเปนโคดไบนารีกอน และครั้งตอไป นำโคดไบนารีมาบรรจุในอิมเมจที่มีเฉพาะเครื่องมือสำหรับเปดการทำงาน เนื่องจากเครื่องมือสำหรับคอมไพล ไมมีความจำเปน และยังทำใหอ ิมเมจมขี นาดเล็กลงอกี ดว ย 244

สำหรับตัวอยางนี้เปนตัวอยางการปรับใชคอนโซลแอปพลิเคชันท่ีเขียนดว ย .Net Core โดยเริ่มตนกอน การสราง Dockerfile ดวยการติดต้ังแพ็คเกจสรางโปรเจคของ .Net Core และสรางโปรเจคตวั อยา งดวยคำสง่ั dotnet new ดังน้ี # yum install dotnet-sdk-3.1 # mkdir aspnetapp # cd aspnetapp # dotnet new console # cd .. เมื่อดำเนนิ การเสรจ็ ใหส ราง Dockerfile ตามภาพที่ 14.3 ในไดเรกทอรปี จจุบนั 1 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env 2 WORKDIR /app 3 COPY aspnetapp . 4 RUN dotnet publish -c Release -o out 5 FROM mcr.microsoft.com/dotnet/core/runtime:3.1 6 WORKDIR /app 7 COPY --from=build-env /app/out . 8 ENTRYPOINT [\"dotnet\", \"aspnetapp.dll\"] ภาพท่ี 14.3 ตวั อยาง Dockerfile ของคอนโซลแอปพลเิ คชนั จาก Dockerfile ในภาพท่ี 14.3 ประกอบดว ยคำสง่ั ท้ังหมด 8 บรรทัดแบงออกเปนสองกลุมโดยแยกกัน ดวยบรรทัดที่มีชุดคำสั่ง FROM ดังนี้ บรรทัดที่ 1 หมายถึง ใชอิมเมจ sdk แท็ก 3.1 จากเซิรฟเวอรให ไมโครซอฟทมาใชอางอิงและตั้งช่ืออมิ เมจน้ีวา build-env บรรทดั ท่ี 2 เปลย่ี นไดเรกทอรีของอิมเมจไปท่ี /app และคัดลอกแฟมขอมูลทั้งหมดจากด็อกเกอรลูกขายไปยังอิมเมจในบรรทัดที่ 3 จากนั้นในบรรทัดท่ี 4 สั่งงาน คอมไพลร หสั ตน ฉบับ และใหเก็บแฟมไบนารีไวท ไ่ี ดเรกทอรี out จากทอี่ ยปู จจบุ ันซงึ่ ก็คอื /app/out สำหรับกลุมท่ี 2 บรรทัดที่ 5 หมายถึงใชอิมเมจของ runtime แท็ก 3.1 จากเซิรฟเวอรใหไมโครซอฟท มาใช บรรทัดที่ 6 ถึง 7 เปลี่ยนไดเรกทอรีของอิมเมจไปที่ /app และคัดลอกแฟมขอมูลไบนารีจาก /app/out ในอิมเมจ build-env ไปยังไดเรกทอรีปจจุบัน (/app) ของอิมเมจ runtime บรรทัดที่ 8 เตรียมการให แอปพลิเคชันทำงานเมื่อเปด การทำงานของคอนเทนเนอร 14.6 เคร่อื งมือที่ใชส รา งอิมเมจ การสรางอิมเมจในด็อกเกอรนั้นสามารถดำเนินการไดโดยไมจำเปนตองดาวนโหลดเครื่องมือตัวอื่น นอกจากด็อกเกอรลูกขาย ขั้นตอนการสรางอิมเมจเริ่มตนจากเปลี่ยนไดเรกทอรีปจจุบันใหไปไดเรกทอรีที่เก็บ Dockfile กอน จากนน้ั หากตองการสรา งอิมเมจชอ่ื myapp แท็ก 1.0 สามารถใชพ ารามเิ ตอร -t ดงั น้ี # docker build -t myapp:1.0 . 245

เมื่อดำเนินการสรางเสร็จ อิมเมจที่สรางจะถูกเก็บไวที่ด็อกเกอรโฮสต ผูอานสามารถตรวจสอบรายการ อิมเมจไดจ ากคำสัง่ docker image ls อยางไรก็ตาม การสรางอิมเมจน้ันอาจเกิดขอผิดพลาดไดงาย การไดม าขอแตล ะคำสง่ั น้ันเกิดจากความรู ความชำนาญในคำสั่งที่เกี่ยวกับการสงมอบซอฟตแวรที่ตองการบรรจุในคอนเทนเนอรเปนสำคัญ ในกรณีท่ี คำสั่งผิดพลาดหรือตองการทดลอง ผูอานสามารถใชคำสั่ง docker run จากอิมเมจที่ตองการอางอิง และ ทดลองพิมพคำสั่งและจดบันทึกคำสั่งที่ใหผลลัพธถูกตองเพื่อมาเขียนเปน Dockerfile ซึ่งกระบวนการนี้จะทำ ใหผูอานพิมพคำสั่ง docker build จำนวนหลายครั้ง และอาจเกิดขึ้นผิดพลาดไดเนื่องจากด็อกเกอรโฮสต พยายามจะแคชคำสั่งที่พิมพอยูเดิมทำใหการแกไขไมอัพเดท ดังนั้น หากตองการใหด็อกเกอรบังคับไมแคช อมิ เมจระหวางคำสง่ั สามารถใชพารามเิ ตอร --no-cache ดังน้ี # docker build --no-cache -t myapp:1.0 . หากซอฟตแวรทีส่ งมอบอา งอิงอิมเมจท่มี ีการอัพเดทโดยใชแท็กเดมิ เชน centos:8 หากระบบปฏิบัติการ CentOS ไมเปลี่ยนเวอรชันเปน 9 ผูดูแลอิมเมจจะยังคงใชแท็ก centos:8 เหมือนเดิม ในบางครั้งด็อกเกอร พยายามแคชอิมเมจท่ีอา งอิงโดยไมสอบถามวามีอิมเมจท่ีอา งอิงเวอรชนั ใหมกวาหรือไม ในกรณีน้ี การใชอิมเมจ ของ centos:8 ทใี่ หมก วา จะทำใหมีการแกไขขอบกพรองที่อาจเกี่ยวกับความมั่นคงปลอดภัย ดังน้ัน เพื่อบังคับ ในขั้นการสรางอิมเมจใหด็อกเกอรตรวจสอบเวอรชันใหมของอิมเมจที่อางอิงจากชุดคำสั่ง FROM สามารถใช พารามิเตอร --pull ดงั น้ี # docker build --pull --no-cache -t myapp:1.0 . แมก ารใชพารามเิ ตอรมิเตอรที่เพ่ิมข้ึนมาจะชวยใหเกิดความม่ันคงปลอดภยั และผลลพั ธที่คงเสนคงวา แต ก็ทำใหระยะเวลาในการสรางอิมเมจนานขึ้นมาก ดังนั้น หากอยูในชวงที่แกไขหรือสราง Dockerfile ที่ถูกตอง ผอู านจะไมจำเปนตอ งใชพารามิเตอร --pull และพารามเิ ตอร --no-cache เสมอทุกครัง้ 14.7 การสรา งอมิ เมจจาก Dockerfile ในการสรางอิมเมจจาก Dockerfile แมดูวาลำดับของคำสั่งบางอยาง หรือการเขียนคำสั่งแยกเปนคำสง่ั สั้นใหเขาใจงายจะสรางอิมเมจไดหลายรูปแบบและยังสามารถทำงานไดเหมือนกัน แตผลลัพธของอิมเมจที่ได น้นั จะแตกตางกัน ในหวั ขอนีจ้ ะกลาวถงึ แนวทางการเขียน Dockerfile ทด่ี ี 3 แนวทาง ดังน้ี แนวทางแรก จากตัวอยาง Dockerfile ของคอนโซลแอปพลิเคชัน หากผูอานใชอิมเมจเดยี วเพือ่ คัดลอก รหัสตน ฉบบั และคอมไพล จากน้ันกร็ ะบุคำส่ังเม่ือคอนเทนเนอรเปด การทำงาน อมิ เมจผลลพั ธท ไ่ี ดยังคงทำงาน เหมือนกับการแยกอิมเมจและไปอางองิ อิมเมจ runtime แทน แตผลลัพธ คือ อิมเมจจะมีขนาดใหญขึ้นโดยไม จำเปน ดังนั้น การอางอิงอิมเมจหลายตวั อาจทำให Dockerfile ดูซับซอน แตจะทำใหขนาดของอิมเมจมีขนาด เล็กโดยเก็บขอมูลเทาที่จำเปน และมีความปลอดภัยเนื่องจากอิมเมจที่สรางใหมเก็บขอมูลเฉพาะแฟมขอมูลท่ี คอมไพล ไมใชร หัสตนฉบบั รวมอยูด วย 246

แนวทางที่สอง จากนิยามของชุดคำสั่ง RUN ใน Dockerfile จะสรางชั้นขอมูลใหมอีกชั้นหนึ่ง การแยก คำสั่ง RUN ออกมาหลายคำสั่งในกรณีการตดิ ตัง้ แพ็คเกจหรือคัดลอกแฟมขอ มูลอาจดูเหมอื นชวยใหแบงขอมูล แพ็คเกจออกเปนชั้นขอมูลหลายชั้นและงายตอการอัพโหลด แตในความเปนจริง คำสั่งติดตั้งแพค็ เกจลำดับถดั มาจะมีผลที่เกิดขึ้นอางอิงจากชั้นขอมูลกอนหนา เชน ใหหากมีชุดคำสั่ง RUN yum install จำนวน 3 คำสั่ง และมแี พ็คเกจท่ีอยูในคำส่งั แรกอัพเดทเวอรชันใหมจะทำใหช น้ั ขอมูลถัดไปทั้งหมดความแตกตางกันทันที สงผล ใหอิมเมจผลลัพธจะมีจำนวนชั้นขอมูลที่เพิ่มขึ้น และยังมีความแตกตางของชั้นขอมูลที่เพิ่มขึ้นดวย ซึ่งความ แตกตางนสี้ งผลการแบนวธิ ดและการสง มอบอิมเมจในกรณที ่ีมีผูดาวนโหลดจำนวนมาก ดงั นน้ั จงึ ควรรวมคำสั่ง หลายคำสง่ั ไวใ นคำสงั่ RUN เพียงคำสง่ั เดียว สงผลใหจ ำนวนช้ันขอมลู ของอิมเมจมีจำนวนท่ีลดลง เม่ือเวลาผูใช ดาวนโ หลดอมิ เมจจากรีจิสตรีผใู ชจ ะดาวนโหลดจำนวนชน้ั เฉพาะชัน้ ขอมูลทีม่ คี วามแตกตา งกนั นอยลงตาม แนวทางทสี่ าม การจดั รปู แบบของ Dockerfile ใหอ า นงา ยจะชว ยใหการดแู ลรกั ษา Dockerfile งา ยและ ลดความผิดพลาดท่ีอาจจะเกิดขึ้นเมื่อตองการอัพเดทเวอรช ันของซอฟตแวร เชน การใชต วั แปรสภาพแวดลอม แทนคาที่ตองเปลี่ยนหลายที่เพื่อใหแกไขคาเพียงที่เดียว และการใชเครื่องหมายทับขวาเพื่อใหบรรทัดหนึ่งมี ตัวอักษรไมเกิน 80 ตวั อักษร และการเช่อื มคำสงั่ ในชุดคำส่ัง RUN ดวยเครื่องหมาย && เชน จากชุดคำส่งั RUN yum -y install package_a package_b RUN yum -y install package_c package_d เปน RUN yum -y install package_a package_b package_c package_d หรือในบางกรณีเชนคำสั่ง yum update และแพ็คเกจ epel-release จะตองติดตั้งใหเสร็จกอนติดตั้ง แพ็คเกจอนื่ และตอ งแยกคำส่งั กัน แตยงั สามารถรวมอยูในชุดคำส่ัง RUN เพียงคำสง่ั เดยี วได ดังนี้ RUN yum -y update && \\ yum -y install package_a && \\ yum -y install package_b package_c package_d 14.8 การเปด บัญชอี อนไลนสำหรับบริการคลังอมิ เมจ บริษัทผูพัฒนาด็อกเกอรมีระบบรีจีสตรีที่อนุญาตใหทุกคนสามารถสรางอิมเมจและอัพโหลดอิมเมจเก็บ ไวไดฟรีชื่อด็อกเกอรฮับ โดยสามารถเขาถึงผานเว็บไซต https://hub.docker.com เมื่อเขาเว็บจะปรากฎ แบบฟอรม สมคั รสมาชิกดงั ภาพท่ี 14.4 โดยรหสั ด็อกเกอร (Docker ID) จะตองไมซ ำ้ กับคนอ่ืน 247

ภาพที่ 14.4 บางสวนของหนา เวบ็ ไซตด อ็ กเกอรฮบั ในรีจีสตรีที่ใหบริการฟรีนั้นมีขอแลกเปลี่ยนวา อิมเมจที่ผูอานอัพโหลดขึ้นไปจะตองเปนสาธารณะ หมายถึงใครก็สามารถคนหาและดาวนโหลดได หากตองการใหอิมเมจนั้นเปนสวนตัว ผูอานจะตองกำหนด คลังอมิ เมจ (Repository) ใหเ ปนสว นตวั จงึ จะมีแคบ ญั ชีเจา ของเทานนั้ ท่สี ามารถดาวนโหลดได เมื่อสมัครสมาชิกเรยี บรอย ผูอานจะตอ งใชเพ่มิ สิทธิ์การเขาถึงบัญชีที่ด็อกเกอรลูกขายกอน โดยรหัสผูใช และรหสั ผานจะถูกเก็บไวท ี่เครือ่ งของด็อกเกอรลูกขายเทาน้ัน โดยใชคำสงั่ # docker login จากนัน้ กรอกรหัสผูใชและรหัสผา นใหถูกตอง เมื่อดำเนินการเสร็จจะปรากฏผลลัพธดังภาพที่ 14.5 อน่ึง ในขณะที่พิมพรหัสผาน เคอเซอรจะไมแสดงตัวอักษรและจำนวนตัวอักษรที่เปนรหัสผานขึ้นหนาจอใหผูอาน พิมพต อ ไปไดเลย ภาพที่ 14.5 หนาจอผลลพั ธคำสง่ั ล็อกอนิ ดอ็ กเกอรฮบั 248

14.9 การอพั โหลดอิมเมจไวทค่ี ลังอิมเมจมาตรฐาน การอัพโหลดอมิ เมจนั้นมีวธิ กี ารอพั โหลดอยู 2 แนวทางดวยกนั ดงั น้ี 1) ในกรณีที่อิมเมจนั้นจะเปนสาธารณะ ผูอานสามารถอัพโหลดอิมเมจโดยที่ยังไมไดสรางคลังอิมเมจ โดยที่รีจีสตรีจะดำเนินการสรางคลังอิมเมจใหโดยอัตโนมัติ ผูอานสามารถล็อกอินเขาไปแกไข รายละเอียดหรือขอมูลเพิ่มเติมในภายหลังได หรือเขาไปสรางคลังอิมเมจพรอมระบุรายละเอียดท่ี จำเปน จากนัน้ จึงอพั โหลดอมิ เมจตามภายหลังได 2) ในกรณีที่อิมเมจนั้นจะเปนสวนตัว ผูอานจะตองสรางคลังอิมเมจกอน และตั้งคาคลังอิมเมจนั้นเปน สวนตัวโดยคลกิ ที่เมนู Settings และเลีอก Make Private ดังภาพที่ 14.6 กอนการอัพโหลดอิมเมจ ทกุ คร้ัง มิเชนนั้น คลงั อมิ เมจจะเปนสาธารณะจนกวาจะมาตง้ั คา ใหเปน คลงั อิมเมจสว นตัว ภาพที่ 14.6 หนา จอการตง้ั คาความเปน สวนตวั ของอิมเมจ เมอ่ื ผูอา นสรางอิมเมจในเครอ่ื งผอู า น ผูอ า นสามารถอพั โหลดไปยังรจี สี ตรใี นนามของผอู านไดพรอมต้ังชื่อ และแท็กตามรูปแบบ <รหัสด็อกเกอร>/<ชื่ออิมเมจ>:<แท็ก> เชน utarn/myapp:1.0 เปนตน โดยสามารถ ระบุในคำส่งั docker build ดงั นี้ # docker build -t utarn/myapp:1.0 . ในกรณีที่กอนหนานี้ผูอานไดสรางอิมเมจไว แตไมไดระบุใหเปนชื่อรหัสด็อกเกอร ผูอานไมจำเปนตอง สรางอิมเมจใหมอีกครั้งในชื่อที่ขึ้นตนดวยรหัสด็อกเกอรแตสามารถตั้งชื่ออิมเมจเดิมวา อิมเมจน้ันมีสองชื่อได เชน หากตองการตั้งชอ่ื อมิ เมจ myapp:1.0 ใหม ีชอ่ื utarn/myapp:1.0 ดวยสามารถใชค ำสั่ง # docker tag myapp:1.0 utarn/myapp:1.0 อยางไรก็ตามอิมเมจนั้นมีแท็กเริ่มตนคือ latest ดังนั้นไมวาผูอานจะตั้งชื่อแท็กอะไรก็ตาม ผูอานควร สรา งแท็ก latest ดว ยทุกครง้ั ดวยการต้งั ชอ่ื เพมิ่ ที่มีแท็กเปน latest เพราะจะทำใหค ำส่งั ดาวนโหลดอิมเมจส้ัน และกระชบั # docker tag utarn/myapp:1.0 utarn/myapp:latest 249

อยางไรก็ตาม คำสั่งแท็กคือการตั้งชื่อเพิ่ม แตยังไมไดอัพโหลดอิมเมจใหรีจีสตรี หากตองการอัพโหลด อมิ เมจใหร ีจีสตรีสามารถใชค ำส่งั # docker push utarn/myapp:1.0 # docker push utarn/myapp:latest แมคำสั่ง docker tag จะชวยตั้งชื่ออิมเมจเดียวกันใหมีหลายชื่อ แตคำสั่ง docker push จะอัพโหลด เฉพาะอิมเมจและแท็กที่พิมพคำสั่งเทานั้น และสามารถตรวจสอบผลลัพธการอัพโหลดอิมเมจไดที่เว็บไซต https://hub.docker.com/r/<รหัสด็อกเกอร>/<ชื่ออิมเมจ> เชน https://hub.docker.com/r/utarn/ myapp 250

บทสรปุ Dockerfile เปนแฟม ขอ มูลท่รี ะบคุ ำสัง่ สำหรับสรางอิมเมจใหม มีรูปแบบคำส่ัง 2 รปู แบบ คอื 1) รูปแบบของเชลล เปนรูปแบบคำสัง่ ที่เหมอื นกับการพิมพค ำสง่ั บนเชลลของลนี ุกซห รือวินโดวส 2) รูปแบบดอ็ กเกอร เปน รูปแบบคำสง่ั ท่ถี กู เขยี นใหอยใู นรูปแบบคลายอารเ รยในภาษาเขียนโปรแกรม การใชงานตัวแปรสภาพแวดลอมจะชวยลดความผิดพลาดของการระบุหรืออางอิงคาเดิมซ้ำไปซ้ำมาใน Dockerfile แนวทางการสรา งอิมเมจจาก Dockerfile ทด่ี ี 1) ใชหลายอิมเมจเพื่อคัดลอกเฉพาะแฟมขอมูลที่ถูกคอมไพลไปเก็บไว เพื่อลดขนาดของอิมเมจและ ปอ งกนั การเขาถึงรหสั ตนฉบับ 2) รวมคำส่ัง RUN ADD และ COPY ไวใ นบรรทัดเดียวกนั ดวยการใชเครอื่ งหมาย && 3) จัดรปู แบบ Dockerfile ใหอานงา ยดวยการข้นึ บรรทัดใหมของคำสงั่ เดียวกันดว ยการใชเคร่ืองหมาย \\ 251

สรปุ ชุดคำส่ังใน Dockerfile ความหมาย คำส่งั ท่ีใชงานใน Dockerfile ใชเริ่มตนสรางอิมเมจโดยการตั้งคาอิมเมจพื้นฐานสำหรับเพิ่มชุดคำสั่ง FROM อ่ืนตามมา RUN คำสั่งที่ใชสั่งงานโปรแกรม เชน การติดตั้งแพ็คเกจ การคอมไพลแอป EXPOSE พลเิ คชนั เปนตน ADD แจงใหด็อกเกอรโฮสตทราบวา คอนเทนเนอรนี้จะมีพอรตอะไรใหเชื่อม COPY ตอเม่อื ตอนเปดการทำงาน CMD คัดลอกแฟมขอมูล ไดเรกทอรี หรือที่อยูระยะไกลจาก URL เขาไปเก็บ ไวในอิมเมจโดยการสรางชัน้ ขอมูลใหมและบันทึกทนั ที ENTRYPOINT คดั ลอกแฟมขอมูล ไดเรกทอรี หรอื แฟมขอมูลท่ีอยูจากอิมเมจอื่นเขาไป เกบ็ ไวใ นอิมเมจโดยการสรางชั้นขอมูลใหมและบนั ทึกทันที VOLUME ระบุคำสั่งที่จะทำงานเมื่อสรา งคอนเทนเนอรจากอิมเมจน้ี และจะไมถูก ARG สั่งใหทำงานในระหวางการสรางอิมเมจ ชุดคำสั่ง CMD จะทำงานก็ ตอ เมอ่ื ไมมีคำส่ังเริ่มตน การทำงานทร่ี ะบุในขณะทสี่ รา งคอนเทนเนอร ENV ระบุคำสั่งที่จะทำงานเมื่อสรา งคอนเทนเนอรจากอิมเมจนี้ และจะไมถูก สั่งใหทำงานในระหวางการสรางอิมเมจ ชุดคำสั่ง ENTRYPOINT จะ กลายเปน คำส่งั สว นคำสง่ั ในชุดคำส่ัง CMD จะกลายเปนพารามิเตอร สรางที่เก็บขอมูลที่ด็อกเกอรโฮสตตางหากโดยจะเชื่อมตอกับที่อยู ไดเรกทอรีทรี่ ะบไุ วใ นชุดคำสั่ง ใชเ พ่อื ประกาศตวั แปรสภาพแวดลอมที่สามารถรับคาผานคำส่งั docker build และคา ของตัวแปรที่ประกาศในชุดคำส่ังน้ีจะคงอยูใ นขณะที่สราง อมิ เมจเทา น้ัน ใชเพื่อประกาศตัวแปรสภาพแวดลอมที่มีคาคงอยูในขณะที่สรางอิมเมจ และในขณะที่นำอิมเมจนี้ไปสรางคอนเทนเนอร แตจะไมสามารถรับคา ผา นคำสง่ั docker build ได 252

สรุปคำสงั่ ท่ีนาสนใจ คำสง่ั หรอื ช่ือคำสัง่ ทเี่ ก่ียวของ เนื้อหา # docker build -t myapp:1.0 . # docker build --no-cache -t myapp:1.0 . คำสัง่ สรา งอิมเมจชอื่ myapp แทก็ 1.0 # docker build --pull --no-cache -t คำสั่งสรา งอิมเมจชือ่ myapp แท็ก 1.0 และบังคบั myapp:1.0 . ไมแคชอิมเมจระหวา งคำสงั่ คำสั่งสรางอิมเมจชือ่ myapp แท็ก 1.0 บังคบั ในข้นั # docker login การสรางอิมเมจใหด็อกเกอรตรวจสอบเวอรชนั ใหม # docker tag myapp:1.0 utarn/myapp:1.0 ของอิมเมจทอ่ี างอิงจากชดุ คำสั่ง FROM และบงั คบั # docker push ไมแ คชอมิ เมจระหวางคำสัง่ อพั โหลดหรือเขาถึงอมิ เมจในบัญชีรจี สี ตรี อมิ เมจ myapp:1.0 ใหม ีช่อื utarn/myapp:1.0 อพั โหลดอิมเมจใหรจี สี ตรี 253

แบบฝกหัดบทที่ 14 1. อธิบายลกั ษณะโครงสรางของ Dockerfile 2. ยกตัวอยางชุดคำส่ังท่ีใชง านใน Dockerfile และอธิบายตัวอยางน้ันมาอยางนอย 5 ตวั อยา ง 3. อธิบายความแตกตา งระหวางชุดคำสง่ั ADD และชดุ คำส่งั COPY 4. อธบิ ายความแตกตา งระหวางชดุ คำสั่ง CMD และชุดคำส่งั RUN 5. อธบิ ายความแตกตา งระหวา งชดุ คำส่ัง ARG และชดุ คำสั่ง ENV 254

6. บอกพารามเิ ตอรทส่ี ำคญั ของคำสง่ั docker build 7. บอกแนวทางการสรางอิมเมจจาก Dockerfile ทด่ี ีมาอยางนอ ย 3 แนวทาง 8. อธบิ ายความสำคัญของการอางองิ อิมเมจหลายตัวในกระบวนการสรา งอิมเมจจาก Dockerfile 9. การลดจำนวนช้นั ขอ มูลของอิมเมจจงึ สง ผลดีหรอื ไม อยางไร 10. อธบิ ายขน้ั ตอนการต้ังชอื่ อิมเมจและอัพโหลดอิมเมจไปยังรีจีสตรี 255

256

ตัวอยางการนำไปประยกุ ตใ ชงานจริง บทนำ หลังจากที่ไดเรียนรูเรื่องการประมวลผลกลุมเมฆ เทคโนโลยีเสมือน และเทคโนโลยีบรรจุคอนเทนเนอร ในบทเรียนนี้จะเลาถึงการนำทั้ง 3 องคความรูมาประมวลและใชรวมกันเพื่อทำใหงานสำเร็จลุลวงไดโดยงาย โดยเฉพาะในโครงการวิจัยทางวิทยาการคอมพิวเตอร ซึ่งนักวิจัยจะตองพัฒนาหรือคิดคนสิ่งใหม เชน อัลกอริทึมใหม และตองการการทดสอบอัลกอริทึมที่นำเสนอใหมเปรียบเทียบกับอัลกอริทึมที่มีอยูเดิมใน สภาพแวดลอ มเดียวกันเพ่ือใหไ ดผลลพั ธทถี่ กู ตองแมน ยำและใชร ายงานในผลการทดลองของงานวิจัยได รูปแบบการผสมผสานเครอ่ื งมือเพือ่ การพฒั นาและการปรับปรุงซอฟตแวรอยา งรวดเร็ว รูปแบบการผสมผสานเครื่องมือเพื่อการพัฒนาและการปรับปรุงซอฟตแ วรอยา งรวดเร็วนี้ เปนรูปแบบที่ ผูเขียนใชพัฒนาโปรแกรมและปรับปรุงการทำงานของโปรแกรมไดอยางรวดเร็ว เนื่องจาก ผูเขียนพัฒนารหัส ตนฉบับที่เคร่ืองคอมพิวเตอรสวนตัวโดยใชระบบปฏิบัตกิ ารวินโดวส แตทดสอบการทำงาน และบันทึกผลลพั ธ ของการทำงานของโปรแกรมท่ีเครื่องคอมพิวเตอรเสมือนท่ีทำงานดวยระบบปฏิบัติการลีนุกซ แมวาภาษาเขียน โปรแกรมและเฟรมเวริ ก ทีใ่ ชโปรแกรมจะสามารถสนับสนนุ การทำงานขามแพลตฟอรม (Cross-platform) แต โปรแกรมที่พัฒนาขึน้ มา คอมไพลสำเร็จ และทำงานสำเร็จในระบบปฏิบัตกิ ารวินโดวส อาจจะคอมไพลไมผาน หรือเกิดขอผิดพลาดในระบบปฏบิ ัติการลีนุกซก็ได ดงั น้ัน การผสมผสานเครื่องมือใหชว ยตรวจสอบและสงมอบ ซอฟตแวรที่พรอมเปดการทำงานที่ลีนุกซ เมื่อแกไขรหัสตนฉบับในเครื่องวนิ โดวสเสร็จจะชวยใหลดระยะเวลา ในการพัฒนาโปรแกรมอยางมาก เพื่อแกไขปญหาดังกลาว ผูเขียนจึงไดนำเสนอแบบจำลองการผสมผสาน เคร่ืองมือเพอื่ การพฒั นาและการปรบั ปรงุ ซอฟตแ วรอยา งรวดเร็ว การทำงานของแบบจำลองการผสมผสานเครื่องมือเพื่อการพัฒนาและการปรับปรุงซอฟตแวรอยาง รวดเร็วเริ่มตนจากผูพัฒนาซอฟตแวรเขียนรหัสตนฉบับไวขอมูลในไวเครื่องของผูพัฒนา จากนั้นผูพัฒนา อัพโหลดรหัสตน ฉบับท่ีบันทกึ ไวในเครื่องไปเก็บไวท ี่คลังรหัสตนฉบับบนคลาวด ซึ่งผูใหบริการคลงั รหัสตนฉบับ จะมีตัวตรวสอบโคด และสั่งงานเพื่อสแกนดูคลังรหัสตนฉบับในทุกครั้งที่มีการอัพโหลดขอมูลใหมวา มีคำส่ัง ทำงานอัตโนมัติหรือไม หากมีตัวตรวจสอบโคดจะคัดเลือกเครื่องคอมพิวเตอรเสมือนที่ถูกสรางไวอยูกอนแลว เพื่อรองรับชุดคำสั่งที่ตองดำเนินการ เครื่องคอมพิวเตอรเสมือนนี้จะดาวนโหลดรหัสตนฉบับจาก คลังรหัสตนฉบับบนคลาวดเพื่อคอมไพล และสรางเปนด็อกเกอรอิมเมจโดยเก็บด็อกเกอรอิมเมจไวท่ี ด็อกเกอรฮับหรือรีจิสตรีสวนตัว เมื่ออมิ เมจถูกสรางเรียบรอยแลว ผพู ฒั นาซอฟตแ วรส ามารถทดสอบโปรแกรม ไดโดยสรางเครื่องคอมพิวเตอรเสมือนสำหรับประมวลผล เครื่องคอมพิวเตอรสำหรับประมวลผลนี้จะ ดาวนโหลดอิมเมจจากรจี ิสตรีและสรางคอนเทนเนอร คอนเทนเนอรจะเริม่ ตนทำงานตามคำสั่งที่ระบุไวข ณะที่ สรางอิมเมจ เมื่อคอนเทนเนอรท ำงานเสรจ็ ผูพัฒนาซอฟตแวรสามารถคัดลอกผลลพั ธท่ีไดจากการประมวลผล จากเครื่องคอมพิวเตอรเสมือนสำหรับประมวลผลมาเก็บไว และนำขอมูลที่ไดไปประมวลผลเพื่อทำรายงาน ตอ ไป 257

ผูพัฒนาซอฟตแวร ผใู หบ รกิ ารคลังรหัสตนฉบบั รหัสตนฉบับทบี่ นั ทึก อัพโหลด คลงั รหัสตนฉบับบน อานคาํ ส่ังทํางานอตั โนมัติ ตัวตรวจสอบ ไวใ นเครอ่ื ง คลาวด โคด และสง่ั ทํางาน สง ชุดคาํ สง่ั ท่ีตอ งดําเนนิ การ ผลลพั ธท ไี่ ดจากการ ดาวนโหลด เครือ่ ง ประมวลผล คอมพิวเตอร เสมือน คัดลอกจาก ดาวนโ หลด สรา ง เคร่อื ง ดอ็ กเกอรอิมเมจทส่ี รา งขึน้ คอมพวิ เตอร เสมือนสาํ หรบั ประมวลผล ด็อกเกอรฮ ับหรอื รีจสิ ตรีสว นตวั ภาพที่ 15.1 แบบจำลองการผสมผสานเครอ่ื งมือเพื่อการพฒั นาและการปรบั ปรงุ ซอฟตแ วรอยา งรวดเรว็ การพฒั นาโปรแกรมและบนั ทกึ ไวท ค่ี ลงั รหสั ตน ฉบบั ตัวอยางในบทเรียนนี้ เปนโปรแกรมที่พัฒนาจากสวนหนึ่งของงานวิจัย [x] ที่ทำงานโดยสุมสรางวัตถุ จำนวนหลายลานวัตถุโดยที่แตละรอบจำนวนของวัตถุที่สุมสรางขึ้นมาจะเพิ่มขึ้นเรื่อย ๆ แตละวัตถุ ประกอบดวยพิกัดตำแหนง 2 มิติ ขอมูลวัตถุเหลานี้จะถูกบันทึกบนดิสก จากนั้น โปรแกรมจะโหลดขอมูล เหลา นจี้ ากดสิ กไ ปสรา งเปน Attributed-based IR-Tree [x] โดยที่ วิธีท่ี 1 โหลดขอมูลทั้งหมดไปไวในหนวยความจำหลัก จัดเรียงวัตถุในหนวยความจำหลักและสราง โครงสรางขอ มูล Attributed-based IR Tree และบนั ทกึ โครงการของขอ มลู ไวใ นดสิ ก วิธีท่ี 2 แบงการโหลดขอมูลจากดิสกเปนสวน (Chunk) และทยอยจัดเรียงขอมูลในปริมาณของ หนวยความจำที่กำหนด และทยอยบันทึกขอมูลเปนสวน ๆ กลับไปที่ดิสก จนกระทั่งไดโครงสรางขอมูล Attributed-based IR Tree ทั้งวิธีท่ี 1 และวิธีท่ี 2 จะไดโครงสรางขอมูลสุดทายเหมือนกันทุกประการ แตดำเนินการดวยวิธีการท่ี แตกตางกัน ซึ่งในงานวิจัยของผูเขียนไดทำการศึกษา คนควา และทดลองเพื่อรายงานผลออกมาเปนกราฟ เปรียบเทียบท้ัง 2 วิธี โดยผูเขียนพัฒนารหัสตนฉบบั ดวยภาษา C# ในโปรแกรม Visual Studio Community Edition (Microsoft Inc. 2008) เพ่ือดำเนินการบรรจรุ หัสตนฉบับไวใ นคลัง ในกรณที ่ีเคร่อื งผูอ านติดตง้ั โปรแกรม Visual Studio อยแู ลว เครื่องผูอานจะมีโปรแกรม git โดยอัตโนมัติ แตถาไมมีผูอานสามารถดาวนโหลดโปรแกรม git ไดจาก 258

https://git-scm.com/downloads จะปรากฏหนาเว็บดังภาพที่ 15.2 ผูอานสามารถคลิกท่ี Download 2.28.0 for Windows เพื่อติดตั้งโปรแกรม git หรือเลือกระบบปฏิบัติการที่ผูอานกำลังใชงานอยู แตถาเปน ระบบปฏบิ ัติการลีนุกซ CentOS ผอู านสามารถตดิ ต้ังโปรแกรม git ดว ยคำสง่ั # yum install git ภาพที่ 15.2 สวนหนึ่งของหนาเว็บดาวนโ หลดโปรแกรม git เมื่อไดโปรแกรม git ที่ใชซิงคระหวางรหัสตนฉบับบนเครื่องกับคลังรหัสตนฉบับแลว ขั้นตอนถัดไป คือ การสมัครเว็บไซตที่ใหบริการคลังรหัสตนฉบับ ซึ่งทางผูเขียนเลือก https://www.gitlab.com เนื่องจาก Gitlab.com เปนเว็บไซตที่อนุญาตใหผูใชงานสรางคลังรหัสตนฉบับแบบสวนตัวไดไมจำกัด และมีเครื่อง ใหบ รกิ ารคอมไพลรหัสตน ฉบบั เพ่ือสรางเปนอิมเมจในโปรแกรมด็อกเกอรโ ดยไมมคี าใชจา ยมาต้งั แต พ.ศ. 2558 (GitLab Inc. 2020) ขั้นตอนการสมัครใชงาน Gitlab ผูอานสามารถเขาไปเว็บไซต https://www.gitlab.com และคลิกที่ Register ท่ีมุมขวาบนของเว็บ จากนนั้ จะปรากฏแบบฟอรมดงั ภาพที่ 15.3 ใหก รอกลงทะเบียน 259

ภาพที่ 15.3 สวนหนึ่งของหนา เวบ็ แบบฟอรมลงทะเบียนสมคั รสมาชิก เมื่อลงทะเบียนเสร็จเรียบรอย ผูอานจำเปนตองยืนยันบัญชีสมาชิกผานการคลิกลิงกที่สงไปทางอีเมล ตามที่อยูอีเมลที่ผูอานสมัครสมาชิก เพื่อมาล็อกอินที่เว็บไซต ขั้นตอนการล็อกอินคือ เขาไปที่เว็บไซต https://www.gitlab.com และคลกิ ท่ี Login มุมขวาบน จากน้ันกรอกรหสั ผูใช และรหสั ผานใหถูกตอ ง เมือ่ ลอ็ กอินแลว ผูอ า นจะพบปุมทมี่ ีเคร่อื งหมายบวก (+) ท่ีมุมกลางบนของหนาเวบ็ เลือก New Project จะปรากฏแบบฟอรมใหผอู า นกรอกรายละเอยี ดของคลงั รหสั ตน ฉบบั ทตี่ องการสรา งดงั ภาพท่ี 15.4 ภาพที่ 15.4 สวนหนึ่งของหนาเว็บแบบฟอรมสรางคลังรหัสตนฉบับ 260

ขอมูล Project name ใชก รอกชื่อโครงการ สามารถมีเวน วรรคได ขอ มลู Project slug ใชเ ปนทีอ่ ยู URL ท่ีใชเ ขาถงึ คลังรหัสตน ฉบบั ไมสามารถมีเคร่ืองหมายเวน วรรคได ขอมลู Project description ใชร ะบุรายละเอียดของโครงการ หรือคลงั รหัสตนฉบับ ตัวเลือก Visibility Level เปนตัวเลือกระดับความเปนสวนตัวของโครงการ ในกรณีที่ผูอานพัฒนา โปรแกรมที่ใชในเชิงการคา หรือไมตองการเปดเผยใหผูอื่นเขาถึงได ใหผูอานเลือก Private แตถาตองการ เปดเผยโครงการใหผูอานสามารถเขาถึงได ใหผูอานเลือก Public จากตัวอยางขางตน ผูเขียนสรางคลังรหัส ตนฉบับที่เปดเผยใหผูอานสามารถเขาถึงไดจาก https://gitlab.com/utarn/nway-air-tree จากนั้นคลิกที่ Create Project เพื่อสรางโครงการ เมื่อสรางโครงการ ทาง Gitlab จะแสดงคำสั่งที่ใชเชื่อมโยงคลังรหัส ตนฉบับในเครอื่ งกับบนเว็บไซต Gitlab เมื่อผูเขียนพัฒนาโปรแกรมเสร็จแลว ผูเขียนสามารถไปที่ไดเรกทอรีของโปรแกรมที่พัฒนา จากนั้นกด ปุม Shift แลวคลิกขวาเลือก Open Windows Powershell here หรือ Open Command Line here เพื่อ เปดหนาตา งบรรทัดคำส่งั ขัน้ ตอนแรก ผอู า นตอ งกำหนดใหไ ดเรกทอรปี จ จุบันเปนคลังรหสั ตน ฉบับ ดว ยคำสง่ั # git init เมื่อพิมพคำสั่งเสร็จ โปรแกรม git จะสรางไดเรกทอรี .git ขึ้นมา จากนั้นใหเพิ่มที่อยูคลังรหัสตนฉบับ จากทาง Gitlab ดว ยคำส่ัง # git remote add origin https://gitlab.com/utarn/nway-air-tree ข้นั ตอนตอจากน้ี จะใชซ้ำไปมาเม่ือผูอานไดแกไขขอมลู ท่ีอยูในไดเรกทอรีน้ี และตองการสงตอการแกไข ไปยงั เว็บไซต Gitlab # git add -A # git commit -m \"<message>\" # git push -u origin master โดยท่ี <message> เปนขอความที่บรรยายการเปลี่ยนแปลงของคลังรหัสตนฉบับ เพื่อความงายตอการ เขาใจในภายหลัง หลังจากที่พิมพ git push แลว เมื่อผูอานกลับมาที่หนาเว็บ https://gitlab.com /utarn/nway-air-tree จะพบวา แฟมขอมูลที่อยูในไดเรกทอรีของเครื่องไดปรากฎในเว็บไซต Gitlab แลวดัง ภาพที่ 15.5 261

ภาพที่ 15.5 สวนหนึ่งของหนา เวบ็ แบบคลงั รหัสตน ฉบับ การสรางคอนเทนเนอรอตั โนมัติหลังการบนั ทึกรหสั ตนฉบบั นอกจากคุณสมบตั ิการบนั ทึกประวตั ิการแกไขรหัสตนฉบบั แลว เว็บไซต Gitlab ยังสนับสนุนการทำงาน ของ Continuous Integration/Continuous Development (CI/CD) โดยอนญุ าตใหด ำเนนิ การโดยอัตโนมัติ กับรหัสตนฉบับนที่ถูกสงไปยัง Gitlab เชน การคอมไพลรหัสตนฉบับ ในกรณีนี้ ผูเขียนเลือกที่จะสรางอิมเมจ ของโปรแกรมด็อกเกอร โดยสรางแฟมขอมูลชื่อ Dockerfile และ .gitlab-ci.yml ไวที่ไดเรกทอรีหลังของคลัง รหัสตน ฉบบั โดย Dockerfile ระบขุ ัน้ ตอนคอมไพลรหัสตน ฉบับและการสรา งอิมเมจ สว น .gitlab-ci.yml ระบุ ข้นั ตอนหลงั จากอัพโหลดรหัสตนฉบับจากเคร่ืองไปที่ Gitlab 1 FROM mcr.microsoft.com/dotnet/core/runtime:3.1 AS base 2 WORKDIR /app 3 VOLUME /app/result 4 5 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build 6 WORKDIR / 7 COPY . . 8 RUN dotnet restore \"ExternalOMT-Core/ExternalOMT-Core.csproj\" 9 WORKDIR \"/ExternalOMT-Core\" 10 RUN dotnet build \"ExternalOMT-Core.csproj\" -c Release -o /app/build 11 12 FROM build AS publish 13 WORKDIR \"/ExternalOMT-Core\" 14 RUN dotnet publish \"ExternalOMT-Core.csproj\" -c Release -o 15 /app/publish 16 17 FROM base AS final 18 WORKDIR /app 19 COPY --from=publish /app/publish . 20 COPY --from=build /script.sh . 21 RUN chmod +x /app/script.sh 22 CMD /app/script.sh ภาพท่ี 15.6 เน้อื หาแฟมขอมูล Dockerfile 262

แฟมขอมลู Dockerfile ภาพที่ 15.6 กำหนดวธิ ีการสรา งอิมเมจไวด งั น้ี บรรทัดที่ 1 – 3 กำหนดอิมเมจที่ติดตั้งเฉพาะไลบรารี่ที่จำเปนสำหรับสั่งใหแอปพลิเคชัน .Net Core ทำงานชื่อ base จากนั้นกำหนดไดเรกทอรีปจจุบันเปน /app และกำหนดไดเรกทอรีที่เชื่อมตอขอมูลเปน /app/result ซึ่งในโปรแกรมของผูเขียนจะสรางแฟมผลลัพธของการประมวลผลไวที่ไดเรกทอรียอย result ของโปรแกรม บรรทัดท่ี 5 - 7 กำหนดอิมเมจท่ีใชค อมไพลร หัสตนฉบับของแอปพลเิ คชนั .Net Core ชื่อ build จากนน้ั กำหนดไดเรกทอรีที่ทำงานปจจุบันเปนรูท / และคัดลอกแฟมขอมูลทั้งหมดจากไดเรกทอรีคลังรหัสตนฉบับที่ เครอ่ื งไปไวในอมิ เมจ บรรทัดที่ 8 - 10 สั่งตรวจสอบวาไลบรารีที่จำเปนสำหรับโปรแกรมสามารถดาวนโหลดไดครบหรือไม จากนั้นเปลี่ยนไดเรกทอรีเขาไปในโปรแกรม และสั่งคอมไพลโปรแกรม โดยมีผลลัพธเก็บไวที่ไดเรกทอรี /app/build อันที่จริงทั้งสามบรรทัดนี้สามารถเขียนไดดวยบรรทัดที่ 10 เพียงบรรทัดเดียว แตที่ผูเขียนแยก บรรทดั ที่ 8 และบรรทดั ท่ี 10 ออกจากกนั เพราะวา หากระหวางการพัฒนาโปรแกรมมีการแกไขแฟมขอ มูลท่ีไม เกี่ยวของกับไลบรารีของโปรแกรม การทำ dotnet restore จะไดชั้นขอมูลเดิมทำใหยนยอระยะเวลาในการ สรางอิมเมจ บรรทัดที่ 12 – 15 กำหนดอิมเมจใหมที่ใชคอมไพลรหัสตนฉบับของแอปพลิเคชัน .Net Core ชื่อ publish วิธีการกำหนดแบบนี้ทำใหไมตองพิมพยาวเหมือนในบรรทัดท่ี 5 จากนั้นเปลี่ยนไดเรกทอรีไปที่ ไดเรกทอรีของโปรแกรม และสั่งสงออกโปรแกรมไปไวที่ /app/publish ตัวคอมไพลเลอรของ .Net Core จะ คัดลอกแฟมขอมูลที่คอมไพลจากบรรทัดที่ 10 และแฟมขอมูลอื่นของระบบปฏิบัติการที่จำเปนไปไวท่ี /app/publish บรรทัดที่ 17 - 20 กำหนดอิมเมจจากบรรทัดท่ี 1 – 3 ชื่อ final จากนั้นเปลี่ยนไดเรกทอรีปจจุบันเปน /app คัดลอก /app/publish จากอิมเมจ publish มาไวที่อิมเมจ final คัดลอก /script.sh ซึ่งเปนคำสั่งท่ี ผเู ขียนระบุพารามิเตอรไวสงั่ ใหโ ปรแกรมทำงานหลายรอบ เพื่อเก็บผลตามตัวแปรตาง ๆ จากอมิ เมจ build มา ไวท ีอ่ ิมเมจ final บรรทัดท่ี 21 – 22 กำหนดให script.sh สามารถสั่งการทำงานได และสั่งให script.sh ทำงานเมื่อ เริม่ ตนคอนเทนเนอร 263

1 image: docker:latest 2 3 stages: 4 - build 5 6 services: 7 - name: docker:dind 8 9 build: 10 only: 11 - master 12 stage: build 13 script: 14 - docker login -u utarn -p $DOCKER_HUB_TOKEN 15 - NEWTAG=$(date +%Y%m%d-%H%M) 16 - docker build --no-cache --pull -t utarn/nway-air-tree:$NEWTAG . 17 - docker tag utarn/nway-air-tree:$NEWTAG utarn/nway-air- tree:latest 18 - docker push utarn/nway-air-tree:latest 19 - docker push utarn/nway-air-tree:$NEWTAG ภาพท่ี 15.7 เนื้อหาแฟม ขอมลู .gitlab-ci.yml แฟมขอมูล .gitlab-ci.yml ใชกำหนดการสั่งงานหลังจากที่อัพเดทรหัสตนฉบับในคลังรหัสตนฉบับ สามารถสรางขึ้นโดยโปรแกรมแกไ ขขอความท่ัวไปเชน Notepad ในวินโดวส หรือ vi ในลีนุกซ หลังการสำคัญ ของแฟมขอมูลประเภท YAML คือ รายการยอยของรายการหลกั ใชวิธีการยอ หนา การยอหนาสามารถยอหนา ดวยการเคาะเวนวรรค หรือการกดแท็บก็ได แตยอหนาเดียวจะตองใชปุมที่เหมือนกัน ยกตัวอยางเชน หาก บรรทัดที่ 14 จากภาพที่ 15.7 ใชเวนวรรค 4 ครั้ง ในบรรทัดที่ 15 จะไมสามารถใชปุมแท็บได แมจะเวนวรรค 4 ตัวอักษรเทากันก็ได ดังนั้น ผูอานสามารถเลือกใชการเคาะหรือการกดแท็บก็ได แตตองใชวิธีการเดียวกัน ตลอดทง้ั แฟม ขอ มลู เน้ือหาแฟมขอ มลู จากภาพท่ี 15.7 มีความหมายดงั นี้ บรรทัดที่ 1 ระบุใชอ มิ เมจของดอ็ กเกอรเ วอรช ันลา สุด บรรทดั ท่ี 3 – 4 ระบใุ หดำเนินการเปน ขั้นตอน ซง่ึ แฟมขอ มลู ตัวอยา งนีม้ ีขนั้ ตอนเดียวคือ build บรรทัดที่ 6 – 7 ระบุใหใชบริการของ docker in the docker (dind) เปนขอกำหนดของ Gitlab ให ระบุไว บรรทดั ที่ 9 ระบุวา เนอ้ื หาตอไปนีเ้ ปนคำสงั่ ท่จี ะสั่งใหด ำเนินการ บรรทดั ท่ี 10 ระบุวา จะดำเนินการเฉพาะ branch ของ git ทก่ี ำหนด บรรทัดที่ 11 ระบุวาจะดำเนินการเฉพาะ master branch เทานั้น ซึ่งใน git นั้น master branch เปน คาเริม่ ตนอยูแ ลว บรรทัดท่ี 12 ระบวุ าสวนของคำสัง่ นใี้ ชกบั ขน้ั ตอน build ซงึ่ จะเช่อื มโยงกับขอความในบรรทดั ที่ 4 บรรทดั ท่ี 13 ระบุวาตอไปน้ีคือคำสงั่ ใหป ระมวลผลตาม บรรทดั ที่ 14 ระบุวา ใหล ็อกอนิ docker ในผูใ ช utarn และรหัสผา นจากตัวแปร $DOCKER_HUB_TOKEN ซง่ึ จะกำหนดไวใ นภายหลงั 264

บรรทัดท่ี 15 สรางตัวแปรชื่อ NEWTAG จากคำสั่งของลีนุกซเปนปเดือนวัน และเวลา เพื่อใชกำหนด แท็กวาถูกสรางเมื่อไหร และตั้งชื่อแท็กใหกับอิมเมจเบื้องตนวา ทุกครั้งที่มีการแกไขรหัสตนฉบับ อิมเมจที่ถูก สรางข้ึนใหมจ ะไมเขียนทบั อมิ เมจเดมิ บรรทัดที่ 16 ใชคำสั่ง docker build เพื่อสรางอิมเมจที่ระบุไวใน Dockerfile และเก็บไวที่คลังอิมเมจ ของด็อกเกอรฮบั บรรทัดท่ี 17 แท็กอิมเมจทีส่ รา งลาสดุ ไวท่อี มิ เมจแทก็ latest ดว ย บรรทัดที่ 18 – 19 อัพโหลดอิมเมจไปยงั ดอ็ กเกอรฮับ เมื่อสรางแฟมขอมูล Dockerfile และ .gitlab-ci.yml แลวใหผูอานอัพเดทไปยังคลังรหัสตนฉบับของ Gitlab ดว ยวธิ ใี นหวั ขอ กอ นหนา ในขั้นตอนถัดไป ผูอานจะตองรหัสผานใหมของด็อกเกอรฮับ เรียกวา โทเคน (Token) ซึ่งทำหนาที่เปน รหัสผานเขาถงึ บัญชีด็อกเกอรฮบั ของผูอาน แตสามารถมีไดหลายอันและสามารถยกเลิกได และนำคาทีส่ รางนี้ ไปเก็บไวในตัวแปร $DOCKER_HUB_TOKEN ซึ่งจะใชเก็บรหัสผา นไวท ีเ่ ว็บของ Gitlab แทนการเก็บรหัสผา น ไวในรหัสตนฉบบั หากมีผูใ ชเพียงคนเดียววิธีการนี้อาจไมมปี ญ หา แตถ า มีผใู ชงานคลงั รหัสตน ฉบบั รวมกันหลาย คน อาจทำใหผูอื่นนำรหสั ผา นของเจา ของคลังรหัสตนฉบับไปใชงานในทางทีไ่ มดี ดังนั้น การใชตัวแปรแทนคา จะชว ยใหผูท ่เี ขา ถึงคลงั รหัสตน ฉบบั ไมทราบรหสั ผา นด็อกเกอรฮับของเจา ของคลงั รหสั ตนฉบับ การสรางโทเคนของด็อกเกอรฮบั สามารถทำไดโดยใหผูอา นล็อกอนิ ท่เี วบ็ ไซตของด็อกเกอรฮับ จากนั้นที่ มุมขวาบนคลิกทีชื่อบัญชี และเลือก Account Settings จะปรากฏหนาจอตั้งคาบัญชี ใหคลิกที่แท็บซายมือ Security และคลิกท่ี New Access Token จะปรากฏหนาตางดังภาพที่ 15.8 จากนั้นตั้งชื่อตามตองการและ คลิก Create ภาพท่ี 15.8 หนาตา งสรา งโทเคนใหม จากนั้นจะปรากฎหนาตางแสดงโทเคนที่สรางใหมดังภาพที่ 15.9 ขอความ 96cb2658-16f4-4bf1- 865f-63d4283f8ce0 เปนรหัสผานสำหรับเขาถึงบัญชีแทนรหัสผาน และเว็บด็อกเกอรฮับจะแสดงคานี้เพียง ครง้ั เดยี วเทานน้ั ใหผูอ านคดั ลอกเก็บไวกอ น จากนั้นคลกิ Copy and Close 265

ภาพที่ 15.9 หนาตางแสดงโทเคนท่ีสรางใหม เมอื่ สรางโทเคนแลว จะปรากฎรายการโทเคนดงั ภาพท่ี 15.10 ภาพที่ 15.10 สวนหนง่ึ ของหนา จอความมัน่ คงปลอดภยั ทบี่ ญั ชี Github จากน้ันกลบั ไปทคี่ ลงั รหัสตนฉบับของ Gitlab เชน https://gitlab.com/utarn/nway-air-tree ตรงเมนู ฝงซายเลือก Settings > CI/CD จากนั้นกด Expand ที่ตัวขอ Variables จะปรากฏรายการใหเพิ่มตัวแปรดัง ภาพท่ี 15.11 ใหผ ูอานเพิ่มตัวแปร DOCKER_HUB_TOKEN ในชอ ง Key และคาโทเคนจากเว็บด็อกเกอรฮับที่ คัดลอกมาที่ชอ ง Value จากน้ันคลิก Protected และ Masked เพ่ือปองกันไมใหเครื่องที่ใหบ ริการของ Gitlab เห็นขอมลู น้ี 266

ภาพท่ี 15.11 สวนหนง่ึ ของหนาจอความมนั่ คงปลอดภยั ท่ีบญั ชี Github เพียงเทานั้น ทุกครั้งที่ผูอานแกไขรหัสตนฉบับ เว็บ Gitlab จะสั่งให .gitlab-ci.yml ทำงาน ซึ่ง แฟมขอมูลนี้ระบุใหสรางอิมเมจตามขอกำหนดของ Dockerfile และเก็บไวที่ด็อกเกอรฮับ เมื่อกลับไปที่เว็บด็ อกเกอรฮ บั ผูอานจะพบวาอมิ เมจไดถกู สรางข้ึนดงั ภาพที่ 15.12 ภาพท่ี 15.12 สวนหน่ึงของหนา จอคลัง nway-air-tree ของด็อกเกอรฮับ การสรา งเครือ่ งคอมพิวเตอรเ สมือนโดยกำหนดปริมาณทรพั ยากรท่ตี องการ เนื่องจากโปรแกรมที่ผูเขียนพัฒนาขึ้นมาเพื่อใชทดสอบอัลกอริทึมที่นำเสนอในงานวิจัยนั้น จะพยายาม เพิ่มจำนวนวตั ถุขึน้ เรือ่ ย ๆ จนกระทั่งหนวยความจำไมเ พยี งพอ และเริ่มระบบปฏิบัติการเริม่ Page swapping กระบวนการนี้จะทำใหประสิทธิภาพการทำงานของโปรแกรมชาลงมาก เพราะการทำ Page swapping ระบบปฏิบัติการจะสลับพักขอมูลที่ไมไดใชง านในหนวยความจำหลักมาไวท ี่ดิสก และสลับขอมูลที่พักไวที่ดิสก และจำเปนตองการใชโหลดกับเขาหนวยความจำหลัก วิธีการนี้ทำใหประสิทธิภาพเครื่องชาลงมากเนื่องจาก 267

ดิสกมีความเร็วตางจากหนวยความจำหลักมาก ดังนั้น เพื่อใหการทดสอบโปรแกรมอยูในสภาพแวดลอมท่ี หนวยความจำหลักถูกจำกัด ผูอานจำเปนจะตองสรางเครื่องคอมพิวเตอรเสมือนเขามาใชงานเองและกำหนด ปริมาณหนวยความจำหลักใหจ ำกัด คือ 1024 เมกะไบต ซึ่งมีความเปนไปไดสูง ที่เครื่องที่ผูอานใชงานอยูจะมี หนวยความจำหลักเหลอื มากกวา 1024 เมกะไบต ในกรณีที่ใชระบบปฏิบัติการวินโดวส ผูอานอาจไมจำเปนตองใชการทำเสมือนซอนก็ได โดยผูอานอาจ สรางเคร่อื งคอมพิวเตอรเ สมือนจากโปรแกรม Hyper-V หรือ VMWare Workstation Player โดยกำหนดใหมี หนวยความจำหลักเปน 1024 เมกะไบต จากน้ันติดต้ังระบบปฏิบตั ิการลนี กุ ซ CentOS และโปรแกรมด็อกเกอร เพ่อื เตรยี มพรอ มการทดสอบโปรแกรม ในกรณีที่ใชร ะบบปฏบิ ัติการลีนุกซ ผูอ านสามารถใชโปรแกรม KVM เพอื่ สรา งเครอื่ งคอมพวิ เตอรเสมือน และกำหนดหนวยความจำหลักเปน 1024 เมกะไบต จากนั้นติดตั้งระบบปฏิบัติการลีนุกซ CentOS และ โปรแกรมดอ็ กเกอรเพือ่ เตรยี มพรอมการทดสอบโปรแกรม หรือผูอานอาจเลือกใหบริการรูปแบบสถาปตยกรรมเปนบริการจากผูใหบริการคลาวด และเลือกสราง เคร่อื งคอมพวิ เตอรเ สมือนพรอมกำหนดคุณสมบัติตามกำหนด อยางไรก็ตาม คาเริ่มตนของการติดตั้งระบบปฏิบัติการลีนุกซนิยมต้ังคาเริ่มตนของขนาดพารทติชัน Swap จะอยูท่ี 2 เทาของปริมาณหนวยความจำหลัก คือ 2048 เมกะไบต แตการทำงานของโปรแกรมของ ผูเขียนนี้ใชปริมาณ Swap ถึง 8192 เมกะไบต ดังนั้น ผูอานจึงควรใชพื้นที่ดิสกจัดสรรพื้นที่ Swap เพิ่มเติม โดยผอู า นสามารถตรวจสอบขนาดของพารท ตชิ นั Swap ดว ยคำสั่ง # free -h จากนน้ั จึงสรา งแฟมขอ มูลวา งเปลา สำหรับเก็บขอมูล Swap แทนการสรา งพารทติชัน ตามขนาดทเี่ หลือ เชน หากปจจุบันขนาดของพารทติชัน Swap มีขนาด 2048 กิ๊กกะไบต ผูอานควรสรางขนาดอยางนอย 6144 เมกะไบต ดงั น้ี # fallocate -l 6144M /swapfile จากน้ันตัง้ คา ใหเฉพาะบญั ชผี ูใช root สามารถเขา ถึงไฟลน ไ้ี ด ดว ยคำสัง่ # chmod 600 /swapfile จากน้ันตง้ั คา แฟม ขอ มูล swap และเปด การทำงานของ /swapfile # mkswap /swapfile # swapon /swapfile เม่อื พมิ พเ สร็จจะไดผลลัพธดังภาพที่ 15.13 และเมอ่ื ตรวจสอบขนาดพารท ติชนั Swap อีกคร้ัง ผูอานจะ ไดข นาดของพารทติชนั Swap เปน 8192 เมกะไบต 268

ภาพที่ 15.13 หนาจอแสดงผลลพั ธก ารสรางแฟมขอ มลู Swap การทดสอบโปรแกรมที่สรางจากคอนเทนเนอร หลงั จากที่เตรียมพรอมอิมเมจสำหรบั การประมวลผล เครื่องคอมพวิ เตอรเสมือนที่มีทรัพยากรจำกัด และ การตงั้ คา ที่จำเปนสำหรับระบบปฏิบัติการแลว ผอู า นสามารถทดสอบการทำงานของโปรแกรมไดโดยดึงอิมเมจ จากด็อกเกอร และสรางคอนเทนเนอร เมื่อคอนเทนเนอรเริ่มดำเนินการ โปรแกรมของผูเขียนจะบันทึกผลลัพธเปนแฟมขอมูล data.txt ไวที่ ไดเรกทอรี /app/result ของคอนเทนเนอร ดังนั้น ในขั้นตอนสรางคอนเทนเนอร ผูอานจำเปนจะตองเชื่อม ไดเรกทอรีของเครื่องกับไดเรกทอรี /app/result ของคอนเทนเนอร เพื่อใหสะดวกในการเขาถึงแฟมขอมูล data.txt ดว ยคำสั่ง # docker pull utarn/nway-air-tree # docker run -it -v /root/result:/app/result utarn/nway-air-tree เมอ่ื พิมพคำสั่งแลว โปรแกรมจะเรม่ิ ประมวลผล และบนั ทึกขอ มูลไวที่ /root/result/data.txt ดังภาพท่ี 15.14 เน่ืองจากโปรแกรมที่ผูเขียนเขยี นใชเ วลาหลายชั่วโมงในการประมวลผล ผอู า นสามารถกด CTRL+C เพื่อ หยุดการทำงาน และทดสอบนำขอ มลู ออกจากเครอ่ื งลนี ุกซใ นหวั ขอถดั ไป ภาพที่ 15.14 หนา จอแสดงผลลพั ธสงั่ ใหโ ปรแกรมของผูเขยี นทำงาน 269

การบนั ทกึ ผลลัพธเ พ่ือนำไปประมวลผลตอไป เมื่อการประมวลผลเสร็จสิ้น แฟมขอมูลที่ประมวลผลนั้นจะอยูในเครื่องคอมพิวเตอรเสมือน และ ระบบปฏบิ ัติการลนี ุกซ ผอู านสามารถใชโ ปรแกรม pscp.exe ท่ีดาวนโ หลดแยกหรอื ทม่ี าพรอมกับแพ็คเกจ MSI Windows Installer ที่ดาวนโหลดจากบทท่ี 4 จากนั้นตรวจสอบที่อยูไอพีของเครื่องคอมพิวเตอรเสมือน เชน หากเครื่องคอมพิวเตอรเสมือนมีที่อยูไอพีเปน 192.168.138.100 ผูอานสามารถคัดลอกแฟมขอมูลมาที่เครื่อง ของวนิ โดวส ดวยคำสง่ั # pscp [email protected]:/root/result/data.txt c:\\Data เมื่อพิมพคำสั่งโปรแกรม pscp จะถามรหัสผานของบัญชี root และเมื่อปอนรหัสผานสำเร็จ โปรแกรม pscp จะคัดลอกแฟมขอมูล /root/result/data.txt ออกมาที่ c:\\Data ซึ่งผูอานสามารถกำหนดไดเรกทอรีฝง วินโดวสไดตามตองการ เพียงเทานี้ ผูอานก็สามารถนำแฟมขอมูล data.txt ไปเปดในโปรแกรม Microsoft Excel เพ่อื ประมวลผลขอ มลู ตอ ไป 270

บทสรุป ดวยเทคโนโลยีการประมวลผลกลุมเมฆในปจจุบัน หากผูอานรูจักเลือกใชบริการบนคลาวดที่มีอยูและ นำมาใชงานรวมกับทักษะการใชงานเทคโนโลยีเสมือนและเทคโนโลยีบรรจุคอนเทนเนอร ผูอานจะไดรับ ประโยชนจากทำงานท่ีตอ งการใหบรรลุลลุ ว งไดอยา งสะดวกและมปี ระสิทธภิ าพ 271

แบบฝกหดั บทท่ี 15 1. แฟม ขอมูล Dockerfile มคี วามสมั พันธกับแฟมขอมลู .gitlab-ci.yml อยางไร 2. คำสงั่ git ใดทีใ่ ชเ พิ่มคลงั รหัสตนฉบับบนคลาวดเชอื่ มกบั ไดเรกทอรีบนเครอ่ื ง 3. เพราะเหตุใดคำสง่ั docker login จึงรบั ตัวแปร $DOCKER_HUB_TOKEN แทนรหสั ผา น 4. ในดอ็ กเกอรฮบั รหัสผา นและโทเคนมคี วามเหมอื นและแตกตา งกนั อยางไร 5. เพราะเหตุในการทำ Page swapping ของระบบปฏบิ ตั ิการจงึ ทำใหประสิทธภิ าพของเคร่อื งชา ลง 272

เอกสารอา งอิง Al-Dhuraibi, Yahya, Fawaz Paraiso, Nabil Djarallah, and Philippe Merle. 2018. “Elasticity in Cloud Computing: State of the Art and Research Challenges.” IEEE Transactions on Services Computing 11(2):430–47. Amazon Web Service Inc. 2020. “Amazon Web Services (AWS) – บริ การประมวลผลบนระบบ คลาวด.์ ” Retrieved June 15, 2020 (https://aws.amazon.com/th/). Bacon, David F., Susan L. Graham, and Oliver J. Sharp. 1994. “Compiler Transformations for High-Performance Computing.” ACM Computing Surveys (CSUR) 26(4):345–420. Bashari Rad, Babak, Harrison John Bhatti, and Mohammad Ahmadi. 2017. “An Introduction to Docker and Analysis of Its Performance.” IJCSNS International Journal of Computer Science and Network Security 17(3):228–35. Chandrasekaran, K. 2014. “Essentials of Cloud Computing.” Che, Jianhua, Yong Yu, Congcong Shi, and Weimin Lin. 2010. “A Synthetical Performance Evaluation of OpenVZ, Xen and KVM.” Proceedings - 2010 IEEE Asia-Pacific Services Computing Conference, APSCC 2010 587–94. Chierici, Andrea, and Riccardo Veraldi. 2010. “A Quantitative Comparison between Xen and Kvm.” Journal of Physics: Conference Series 219(1 PART 4). Chirammal, HD, P. Mukhedkar, and A. Vettathu. 2016. “Mastering KVM Virtualization.” Choung Networks. 2020. “X410 - X Server for Windows 10.” Retrieved July 5, 2020 (https://x410.dev/). Chung, Minh Thanh, Nguyen Quang-Hung, Manh Thin Nguyen, and Nam Thoai. 2016. “Using Docker in High Performance Computing Applications.” 2016 IEEE 6th International Conference on Communications and Electronics, IEEE ICCE 2016 52–57. Colin Harrison. 2020. “Xming X Server for Windows - Official Website.” Retrieved July 5, 2020 (http://www.straightrunning.com/XmingNotes/). Combe, Theo, Antony Martin, and Roberto di Pietro. 2016. “To Docker or Not to Docker: A Security Perspective.” IEEE Cloud Computing 3(5):54–62. Deshane, Todd, Zachary Shepherd, J. N. Matthews, M. Ben-Yehuda, A. Shah, and B. Rao. 2008. “Quantitative Comparison of Xen and KVM.” Xen Summit (Cli):23–25. Docker Inc. 2020a. “Docker Hub.” Retrieved July 5, 2020 (https://hub.docker.com/). Docker Inc. 2020b. “Orientation and Setup | Docker Documentation.” Retrieved June 15, 2020 (https://docs.docker.com/get-started/). 273

Docker Inc. 2020c. “Swarm Mode Overview | Docker Documentation.” Retrieved July 5, 2020 (https://docs.docker.com/engine/swarm/). Doorn, Leendert van. 2006. “Hardware Virtualization Trends Leendert van Doorn.” IBM. Retrieved June 15, 2020 (https://www.usenix.org/legacy/event/vee06/full_papers/vandoorn-keynote.pdf). Emilsson, Rasmus. 2020. Container Performance Benchmark between Docker, LXD, Podman &amp;Amp; Buildah. GitHub Inc. 2020. “Docker/Docker-Ce: Docker CE.” Retrieved July 5, 2020 (https://github.com/docker/docker-ce). GitLab Inc. 2020. “About GitLab | GitLab.” Retrieved June 15, 2020 (https://about.gitlab.com/company/#the-company). Igarashi, Yoshihide, Tom Altman, Mariko Funada, and Barbara Kamiyama. 2014a. “Parallel and Distributed Computing.” Pp. 271–82 in Computing. Igarashi, Yoshihide, Tom Altman, Mariko Funada, and Barbara Kamiyama. 2014b. “Parallel and Distributed Computing.” Pp. 271–82 in Computing. Kovari, A., and P. Dukan. 2012. “KVM & OpenVZ Virtualization Based IaaS Open Source Cloud Virtualization Platforms: OpenNode, Proxmox VE.” 2012 IEEE 10th Jubilee International Symposium on Intelligent Systems and Informatics, SISY 2012 335–39. Kumar, Krishan, and Manish Kurhekar. 2017. “Economically Efficient Virtualization over Cloud Using Docker Containers.” Proceedings - 2016 IEEE International Conference on Cloud Computing in Emerging Markets, CCEM 2016 95–100. Matthias, K., and SP Kane. 2015. “Docker: Up & Running: Shipping Reliable Containers in Production.” Mell, Peter, and Timothy Grance. 2011. “The NIST-National Institute of Standars and Technology- Definition of Cloud Computing.” NIST Special Publication 800-145 7. Microsoft Inc. 2008. “Visual Studio Community 2019 - Free IDE and Developer Tools.” Retrieved July 5, 2020 (https://visualstudio.microsoft.com/vs/community/). Microsoft Inc. 2020a. “Announcing Windows 10 Insider Preview Build 19645 | Windows Experience Blog.” Retrieved July 5, 2020 (https://blogs.windows.com/windowsexperience/2020/06/10/announcing-windows-10- insider-preview-build-19645/). Microsoft Inc. 2020b. “Cloud Computing Services | Microsoft Azure.” Retrieved June 15, 2020 (https://azure.microsoft.com/en-us/). 274

Microsoft Inc. 2020c. “Install Windows Subsystem for Linux (WSL) on Windows 10 | Microsoft Docs.” Retrieved June 15, 2020 (https://docs.microsoft.com/en-us/windows/wsl/install- win10). Microsoft Inc. 2020d. “Set-VMProcessor.” Retrieved June 15, 2020 (https://docs.microsoft.com/en-us/powershell/module/hyper-v/set- vmprocessor?view=win10-ps). Office of the National Digital Economy and Society Commission. 2020. “GDCC – Government Data Center and Cloud Service.” Retrieved June 15, 2020 (https://gdcc.onde.go.th/). OpenNode LLC. 2020. “OpenNode OS.” Retrieved June 15, 2020 (https://opennodecloud.com/products/opennode-os.html). Paraiso, Fawaz, Stéphanie Challita, Yahya Al-Dhuraibi, and Philippe Merle. 2017. “Model-Driven Management of Docker Containers.” IEEE International Conference on Cloud Computing, CLOUD 718–25. Proxmox Server Solutions GmbH. 2020. “Proxmox VE Virtualization Management Platform.” Retrieved June 15, 2020 (https://www.proxmox.com/en/proxmox-ve). RealVNC Limited. 2020. “Working Remotely with VNC Connect | VNC® Connect.” Retrieved July 5, 2020 (https://www.realvnc.com/en/connect/working-remotely-with-vnc-connect/). Red Hat Inc. 2020a. “Chapter 2. Consistent Network Interface Device Naming Red Hat Enterprise Linux 8 | Red Hat Customer Portal.” Retrieved June 15, 2020 (https://access.redhat.com/documentation/en- us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/consistent- network-interface-device-naming_configuring-and-managing-networking). Red Hat Inc. 2020b. “Ending and Archiving the Rkt Project · Issue #4024 · Rkt/Rkt.” Retrieved June 15, 2020 (https://github.com/rkt/rkt/issues/4024). RedHat Inc. 2020a. “14.12. Supported Qemu-Img Formats Red Hat Enterprise Linux 7 | Red Hat Customer Portal.” Retrieved July 5, 2020 (https://access.redhat.com/documentation/en- us/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guid e/sect-using_qemu_img-supported_qemu_img_formats). RedHat Inc. 2020b. “Getting Started with Cockpit Red Hat Enterprise Linux 7 | Red Hat Customer Portal.” Retrieved June 15, 2020 (https://access.redhat.com/documentation/en- us/red_hat_enterprise_linux/7/html- single/getting_started_with_cockpit/index?intcmp=701f20000012ngPAAQ&extIdCarryOver =true&sc_cid=701f2000001OH7TAAW). 275

RedHat Inc. 2020c. “KVM.” Retrieved June 15, 2020 (https://www.linux- kvm.org/page/Main_Page). Richardson, Tristan, Quentin Stafford-Fraser, Kenneth R. Wood, and Andy Hopper. 1998. “Virtual Network Computing.” IEEE Internet Computing 2(1):33–38. Slashdot Media. 2020. “VcXsrv Windows X Server Download | SourceForge.Net.” Retrieved July 5, 2020 (https://sourceforge.net/projects/vcxsrv/). Solomon Hykes. 2013. “The Future of Linux Containers - YouTube.” 03–21. Retrieved July 5, 2020 (https://www.youtube.com/watch?v=wW9CAH9nSLs). Stergiou, Christos, Kostas E. Psannis, Byung Gyu Kim, and Brij Gupta. 2018. “Secure Integration of IoT and Cloud Computing.” Future Generation Computer Systems 78:964–75. Sullivan, Dan. 2019. “Cloud Computing Services | Google Cloud.” Pp. 15–38 in Google Cloud Certified Associate Cloud Engineer Study Guide. Tatham Simon. 2020. “Download PuTTY: Latest Release (0.74).” Retrieved July 5, 2020 (https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html). The Apache Software Foundation. 2020. “Welcome! - The Apache HTTP Server Project.” Retrieved July 5, 2020 (https://httpd.apache.org/). The CentOS Project. 2020a. “About/Product - CentOS Wiki.” Retrieved July 5, 2020 (https://wiki.centos.org/About/Product). The CentOS Project. 2020b. “The CentOS Project.” Retrieved July 5, 2020 (https://www.centos.org/). The kernel development community. 2020. “CPU Hotplug in the Kernel — The Linux Kernel Documentation.” Retrieved July 5, 2020 (https://www.kernel.org/doc/html/latest/core- api/cpu_hotplug.html). The OpenStack Foundation. 2014. “OpenStack User Survey Insights: November 2014 - Superuser.” Retrieved June 15, 2020 (https://superuser.openstack.org/articles/openstack- user-survey-insights-november-2014/). The OpenStack Foundation. 2020. “Build the Future of Open Infrastructure.” Retrieved June 15, 2020 (https://www.openstack.org/). Triyason, Tuul, Anuchart Tassanaviboon, and Chonlamenth Arpnikanondt. 2017. “Hybrid Cloud Architecture for Connected Thai Government Agency.” Pp. 181–87 in 9th International Conference on Management of Digital EcoSystems, MEDES 2017. Vols. 2017-Janua. Varghese, Blesson, and Rajkumar Buyya. 2018. “Next Generation Cloud Computing: New Trends and Research Directions.” Future Generation Computer Systems 79:849–61. 276

VMWare Inc. 2020a. “Download VMware Workstation Player | VMware.” Retrieved July 5, 2020 (https://www.vmware.com/products/workstation-player/workstation-player- evaluation.html). VMWare Inc. 2020b. “VMware Workstation 15.5 Now Supports Host Hyper-V Mode - VMware Workstation Zealot - VMware Blogs.” Retrieved June 15, 2020 (https://blogs.vmware.com/workstation/2020/05/vmware-workstation-now-supports- hyper-v-mode.html). Xie, Xiao Lan, Peng Wang, and Qi Wang. 2018. “The Performance Analysis of Docker and Rkt Based on Kubernetes.” Pp. 2137–41 in ICNC-FSKD 2017 - 13th International Conference on Natural Computation, Fuzzy Systems and Knowledge Discovery. Institute of Electrical and Electronics Engineers Inc. Yang, Chaowei, Qunying Huang, Zhenlong Li, Kai Liu, and Fei Hu. 2017. “Big Data and Cloud Computing: Innovation Opportunities and Challenges.” International Journal of Digital Earth 10(1):13–53. Zeng, Hao, Baosheng Wang, Wenping Deng, and Weiqi Zhang. 2017. “Measurement and Evaluation for Docker Container Networking.” Proceedings - 2017 International Conference on Cyber-Enabled Distributed Computing and Knowledge Discovery, CyberC 2017 2018-Janua:105–8. Zuo, Baojing, Kai Chen, Alei Liang, Haibing Guan, Jun Zhang, Ruhui Ma, and Hongbo Yang. 2010. “Performance Tuning towards a KVM-Based Low Latency Virtualization System.” 2nd International Conference on Information Engineering and Computer Science - Proceedings, ICIECS 2010 3–6. 277

บรรณานกุ รม 1. Chandrasekaran, K. Essentials of cloud computing. CrC Press, 2014. ISBN-13: 978- 1482205435. 2. Chirammal, Humble Devassy, Prasad Mukhedkar, and Anil Vettathu. Mastering KVM virtualization. Packt Publishing Ltd, 2016. ISBN-13: 978-1784399054. 3. Konstantin Ivanov. KVM Virtualization Cookbook: Learn how to use KVM effectively in production. Packt Publishing Ltd, 2017. ISBN-13: 978-1788294676. 4. Redhat Inc., “Configuring and managing virtualization”. Retrieved June 15, 2020 (https:// access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_ and_managing_virtualization/index) 5. Matthias, Karl, and Sean P. Kane. Docker: Up & Running: Shipping Reliable Containers in Production. O'Reilly Media, Inc., 2015. ISBN-13: 978-1492036739. 6. Gabriel N. Schenker. Learn Docker - Fundamentals of Docker 19.x: Build, test, ship, and run containers with Docker and Kubernetes. Packt Publishing Ltd, 2020. ISBN-13: 978- 1838827472 7. Docker Inc., “Docker Documentation: Get Started”. Retrieved June 15, 2020 (https://docs.docker.com/get-started/) 278

ดัชนี . E .gitlab-ci.yml, 262 Edge, 185 exportfs, 158 A F Administrators, 59 Agile, 169 fdisk, 131 apache, 197 Fedora Remix, 182 appxbundle, 183 fedoraremix, 184 apt, 182 Attributed-based IR-Tree, 258 G B git, 259 Gitlab, 259 BIOS, 46 Grid Computing, 2 Bridge, 223 H C High-performance Computing, 1 CentOS 8, 54 Host, 223 Cloud Computing, 2 hostnamectl, 160 Cluster Computing, 2 Hybrid cloud, 4 cockpit, 40, 97 Hyper-V, 45, 48, 55, 179 cockpit-machines, 97 Hyper-V Administrators, 59 Community cloud, 4 Container, 169, 173 I D Image, 172 Immutable, 199 Daemon, 172 Infrastructure as a Service, 5 Data volume, 173 Intel VT-x, 77 Debian, 182 Deployment model, 4 J Distributed Computing, 1 Docker, 169 jq, 227 Docker Client, 172 Docker Desktop for Windows, 185 K Docker Host, 172 Docker Hub, 172 KVM, 39, 45, 77 Dockerfile, 239, 262 kvm.conf, 80 docker-proxy, 234 L libguestfs-tools, 151 279

libvirtd, 80 S Linux subsystem for Windows, 179 Logical disk, 131 Service Model, 4 snapshot, 148 M Software as a Service, 4 Solomon Hykes, 169 Macvlan, 224 Spice Server, 114 Microsoft Store, 182 SSH, 88 Mobile Computing, 2 Stable, 185 SVM, 77 N Swap, 268 systemd, 69 Network, 173 Network Computing, 2 T NFS, 157 nfs-server, 158 Tag, 211 O U osinfo-query, 81 Ubuntu, 182 Overlay, 223 P V Page swapping, 267 VcXsrv, 104 Parallel Computing, 1 vfio, 39 Platform as a Service, 4 virsh, 40 podman, 169 virsh console, 87 Powershell, 180 virt, 79 preallocation, 128 virt_content_t, 82 Private cloud, 4 virt_use_nfs, 159 pscp.exe, 70, 270 virt-clone, 154 Public cloud, 4 virt-diff, 156 Putty, 70, 179 virt-host-validate, 79 putty.exe, 70 virt-install, 40, 79, 83 virtio, 39 Q virt-manager, 109 virt-sysprep, 151 Qcow2, 127 virt-viewer, 79 QEMU, 39 Vmdk, 127 Quantum Computing, 2 VMWare Workstation Player, 49 VNC, 85, 87 R VNC Server, 114 VNC Viewer, 85 Raw, 127 Registry, 172 X rkt, 169 X Windows, 104 2


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook