พีคงที่ การตั้งชื่อโฮสตเพิ่มจะหายไป ดังนั้น หากตองการทั้งตั้งชื่อโฮสตเพิ่มและที่อยูไอพีคงที่ จะตองระบุทั้ง สองพารามิเตอรไปพรอมกันในคำสั่งเดียวกัน คือ เมื่อยกเลิกการเชื่อมตอจาก 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; 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
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336