ภาพที่ 10.1 หนาจอการตดิ ตัง้ คณุ สมบตั ิระบบยอยลีนกุ ซสำหรบั วนิ โดวส หลังจากที่รีบูตเครื่องมาแลว ใหผูอานเปดหนาตาง Powershell โดยมีสิทธิ์ผูดูแลระบบ เพื่อตั้งคาใหใช ระบบยอ ยลนี กุ ซของวนิ โดวสเวอรช นั 2 เปน เวอรชันเรมิ่ ตน ดวยคำส่ัง # wsl --set-default-version 2 ในกรณีที่การตั้งคาไมถกู ตอง เชน ติดตั้งคุณสมบัตขิ องระบบปฏิบัติการไมครบ หรือไมไดเปด การทำงาน ของการทำเสมือนที่ไบออสจะแสดงขอความเหมือนภาพที่ 10.2 แตถาการตั้งคาถูกตองและครบถวนสมบูรณ หลงั พมิ พค ำส่ังจะแสดงขอความเหมอื นภาพที่ 10.3 ภาพท่ี 10.2 หนา จอขอผดิ พลาดเมื่อเปลี่ยนเวอรชันระบบยอ ยลีนกุ ซสำหรับวินโดวส 181
ภาพที่ 10.3 หนา จอการเปล่ียนเวอรช นั ระบบยอยลนี กุ ซสำหรบั วนิ โดวส ำเรจ็ ข้ันตอนถัดไป คอื การติดต้งั ดิสตริบวิ ชันของระบบปฏิบัติการลนี ุกซท ่ีถูกออกแบบมาพิเศษใหใชแกนของ ลีนุกซที่ระบบปฏิบัติการวินโดวส ซึ่งสามารถคนหาไดจาก Microsoft Store โดยทั่วไป และผูอานสามารถ เลือกดิสตริบิวชันอะไรก็ไดมาติดตั้งเปนแบ็กเอนดของด็อกเกอร (Microsoft Inc. 2020c) โดยทั่วไปลีนุกซ Ubuntu จะเปนที่นิยมสำหรับนักพัฒนาซอฟตแวรที่ใชงานระบบยอยของลีนุกซเนื่องจากมีเวอรชันของ แพ็คเกจซอฟตแวรท ีค่ อ นขางทนั สมยั และดว ยการทีล่ ีนกุ ซ Ubuntu ถูกพฒั นามาจาก Debian ทำใหต ัวจัดการ แพ็คเกจเปน apt ซึ่งมีขอดีอีกอยางหนึ่ง คือ มีแพ็คเกจซอฟตแวรเปนจำนวนมากที่สุดเมื่อเทียบกับตัวจัดการ แพ็คเกจอยาง yum ในลีนุกซตระกูล CentOS หรือ Red Hat แตเนื่องจากการใชงานลีนุกซดิสตริบิวชันอื่นท่ี ไมเหมือนเดิมอาจทำใหการพิมพคำสั่งของผูอานสะดุด ทางผูเขียนจึงแนะนำใหใช Fedora Remix ซึ่งเปน ดิสตริบิวชันที่พัฒนาจากลีนุกซ Fedora และมีตัวจัดการแพ็คเกจเปน yum และที่อยูการตั้งคาของโปรแกรม ตาง ๆ เหมือนกบั CentOS แทบทง้ั หมดทำใหผูอานไดมีประสบการณที่ตอเนื่องเม่ือพิมพคำส่ังสลับกันระหวาง CentOS กับ Fedora Remix ดิสตริบิวชัน Fedora Remix สามารถดาวนโหลดผาน Microsoft Store ไดแตมีคาใชจายอยูท่ี 349 บาท แตทางผูพัฒนาไดเผยแพรดิสตริบิวชัน Fedora Remix ฟรีผานเว็บไซต github.com ซึ่งถาผูอานดาวน โหลดจากเว็บไซต github.com จะสามารถติดตั้งไดโดยไมมีคาใชจายที่ https://github.com/ WhitewaterFoundry/Fedora-Remix-for-WSL เมื่อเขาไปแลวจะปรากฎหนาเว็บดังภาพที่ 10.4 ใหคลิกที่ Release ท่ีเมนูฝง ขวามอื 182
ภาพท่ี 10.4 สวนหน่ึงของหนาเว็บไซต Remix เวอรชันในปจจุบันคือ Fedora Remix 31.5.0 ซึ่งพัฒนามาจาก Fedora 31 และเปนเวอรชันที่มีความ ใกลเคียงกับ CentOS 8 มากที่สุด จากนั้นใหคลิกดาวนโหลดแฟมขอมูลประเภท appxbundle จากสวน Assets ตามภาพท่ี 10.5 ภาพท่ี 10.5 สวนหน่ึงของหนา เวบ็ ไซตดาวนโ หลด Fedora Remix เมื่อดาวนโหลดเสร็จแลว ผูอานสามารถดับเบิ้ลคลิกเพื่อทำการติดตั้งโปรแกรม Fedora Remix โดย หลงั จากท่ตี ิดตง้ั สำเร็จ ลนี กุ ซด ิสตรบิ วิ ชันจะถามใหผ ูอานสรา งผใู ชงานสำหรับปฏสิ ัมพนั ธกบั โปรแกรม Fedora Remix ดังภาพที่ 10.6 ผูอานสามารถตั้งชื่อบัญชีผูใชและรหัสผานไดตามตองการ โดยไมกระทบตอการตั้งคา หรือติดตั้งโปรแกรมด็อกเกอรสำหรับวินโดวส แตบัญชีผูใชนี้ถูกสรางเพื่อใหผูอานสามารถใชงานลีนุกซเพ่ือ ติดตัง้ และเรยี กโปรแกรมที่มอี ยใู นลนี ุกซไ ดในภายหลัง 183
ภาพที่ 10.6 หนาจอการตงั้ คา Fedora Remix หลังเปดการใชง านครั้งแรก จากนั้นกอนการติดตั้งโปรแกรมด็อกเกอร ผูอานควรตรวจสอบคุณสมบัติของดิสตริบิวชันที่ติดต้ังลงไป โดยเขา Powershell และพิมพค ำสงั่ # wsl -l -v คำสั่งนี้จะเปนคำสั่งแสดงรายการของดิสตริบิวชันลีนุกซที่ถูกติดตั้งพรอมทั้งสถานะ และเวอรชันของ ระบบยอยลีนุกซที่ใชงานอยูดังภาพที่ 10.7 โปรแกรม Fedora Remix จะตั้งชื่อเริ่มตนใหเปน fedoraremix หากมีเครื่องหมายดอกจันทนอยูหนา fedoraremix หมายถึงดิสตริบิวชันนีเ้ ปนดิสตริบิวชันเริม่ ตนที่ด็อกเกอร จะถูกติดตั้งลงไป ในกรณีที่ผูอานมีดิสตริบิวชันอื่นกอนหนา ผูอานสามารถตั้งคาให Fedora Remix เปน ดิสตรบิ ิวชันเริม่ ตน ดวยคำสง่ั # wsl --set-default fedoraremix แตห ากเวอรชันของระบบยอยลีนุกซท ใี่ ชง านไมใ ชเวอรชนั 2 ผอู านสามารถเปลี่ยนเวอรชันไดด ว ยคำสั่ง # wsl --set-version fedoraremix 2 หากแสดงผลไดถกู ตอ ง แสดงวา การติดตั้งระบบยอยลนี กุ ซสำหรบั วินโดวสเสร็จสมบูรณ ภาพท่ี 10.7 หนาจอแสดงชื่อดิสตริบวิ ชนั และเวอรช ันของลนี ุกซ 184
10.3 การตดิ ต้งั ดอ็ กเกอรสำหรบั ระบบปฏิบัติการวินโดวส เมื่อผูอานตั้งคาแบ็กเอนดใหกับโปรแกรมด็อกเกอรสำหรับวินโดวสแลว สามารถดาวนโหลด Docker Desktop for Windows ไดจากเว็บไซตด็อกเกอรฮับที่ https://hub.docker.com/editions/community /docker-ce-desktop-windows เมื่อเขาไปเว็บไซตแลวจะปรากฎหนาเว็บดังภาพที่ 10.8 โดยด็อกเกอรมีให เลือกสองรุน คอื Stable และ Edge ด็อกเกอรรุน Stable หรือรุนเสถียรเปนด็อกเกอรที่ถูกปลอยมาใหดาวนโหลดหลังจากการทดสอบ ซอฟตแวรเบื้องตนทำใหมั่นใจวาผูอานจะสามารถใชงานไดอยางไมมีปญหา โดยรุน Stable นี้จะมีการอัพเดท ใหมทุก 3 เดือน สวนด็อกเกอรรุน Edge หรือรุนใหมเปนด็อกเกอรที่มีคุณสมบัติใหมแตยังอยูในระหวางการ พัฒนา การทดสอบการใชงาน และมีรหัสตนฉบับที่สามารถคอมไพลผาน โดยรุน Edge นี้จะมีการอัพเดทใหม ทกุ สปั ดาห วิธีการเลือกใชงานรุนของด็อกเกอร คือ สำหรับผูอานที่กำลังศึกษาด็อกเกอรและผูอานที่ตองการนำ ด็อกเกอรไปใชงานในสภาพการใชงานจริง ผูเขียนแนะนำใหผูอานใชด็อกเกอรรุน Stable เพราะโอกาสเกิด ขอผิดพลาดท่เี กิดการจากพัฒนาและยังผานการทดสอบไมครบถวนจะมีนอย สวนผูอานท่ีมีด็อกเกอรใชงานอยู ในสภาพการใชงานจริงอยูแลว และตองการศึกษาคุณสมบัติใหมข องด็อกเกอรในเคร่ืองของตนเอง เพ่ือตองการ ทดสอบและนำคุณสมบัติใหมน้ันไปใชในสภาพการใชงานจริงเมื่อคุณสมบัตนิ ัน้ ถูกยา ยมาอยูใ นรุน Stable และ ผูอา นพรอ มอพั เดทโปรแกรมด็อกเกอรเปนประจำ ในกรณีน้ี รนุ Edge จะเหมาะสมกับผูอ านมากกวา ภาพท่ี 10.8 สวนหน่ึงของหนาเว็บไซตดาวนโ หลดดอ็ กเกอรส ำหรับวนิ โดวส เมื่อดาวนโหลดตัวติดตั้งมาแลว และดับเบิ้ลคลิกเพื่อเปดการทำงานของตัวติดตั้ง ผูอานจะพบกับ หนาตางดังภาพที่ 10.9 แสดงการตั้งคาสำหรับติดตั้งด็อกเกอรสำหรับวินโดวส ใหผูอานคลิกไมเลือก Enable WSL 2 Windows Features เพราะตัวติดตั้งในบางเวอรชันอาจทำใหการติดตั้งไมสำเร็จ อยางไรก็ตามกอน การดำเนินการตอ ผูอานควรมั่นใจวาไดเตรียมพรอมแบ็กเอนดสำหรับด็อกเกอรไวเรียบรอยแลว ไมวาจะ เลือกใช Hyper-V หรือระบบยอ ยลีนุกซสำหรบั วนิ โดวส อยา งใดอยางหน่ึง หรือทั้งสองอยาง ซง่ึ ถา ผูอานมีพรอม ทั้งสองอยาง ผูอานจะสามารถสลับแบ็กเอนดหลังการติดตั้งได แตผูเขียนไมแนะนำ เพราะเพียงแคแบ็กเอนด เดียวก็เพียงพอตอการทำงานไดอยางสมบูรณ อีกตวั เลือกหนึง่ หรือ Add shortcut to desktop เปน ตัวเลือกท่ี 185
ตวั ตดิ ตั้งด็อกเกอรจ ะสรา งทางลัดเพ่ือเปดการทำงานของด็อกเกอรไวทเี่ ดกสท็อป เมื่อเลอื กไดตามตองการแลว กด Ok เพื่อดำเนนิ การติดตัง้ ภาพท่ี 10.9 หนา ตางการตงั้ คาสำหรบั ตดิ ตัง้ ดอ็ กเกอร ในกรณีที่ผูอานเตรียมแบ็กเอนดเปนระบบยอยของลีนุกซเวอรชัน 2 เมื่อติดตั้งเสร็จ ตัวติดตั้งด็อกเกอร จะถามใหกด Close เพื่อปดตัวติดตั้ง แตถาผูอานเตรียมแบ็กเอนดเปน Hyper-V เมื่อติดตั้งเสร็จ ตัวติดต้ัง ด็อกเกอรจะถามใหกด Close and Logout ดังภาพที่ 10.10 ผูอานควรมั่นใจวาไมมีโปรแกรมอื่น ๆ ที่ยังไมได บนั ทกึ ขอมลู เปดคา งไวอ ยู เพราะตวั ติดต้งั จะลอ็ กเอาตแ ละลอ็ กเอาตบ ัญชีของผูอานในวนิ โดวสใหมอีกครง้ั ภาพท่ี 10.10 หนาตางเมื่อติดตง้ั ด็อกเกอรสำหรบั วนิ โดวสสำเร็จ เมือ่ ตดิ ตง้ั เสรจ็ แลว ผูอานสามารถส่ังใหด ็อกเกอรสำหรับระบบปฏบิ ัติการวนิ โดวสทำงานไดโดยการคลิก ไอคอนทางลัดที่เดกสท็อป หรือเขาจากปุมสตารท > Docker Desktop หากผูอานเตรียมระบบยอยลีนุกซ สำหรบั วนิ โดวสเปนแบ็กเอนด โปรแกรมด็อกเกอรจ ะเร่ิมการทำงานทนั ที แตถ า ผูอานเตรียม Hyper-V ไว และ 186
ยังไมไดติดต้ังระบบยอยลีนุกซของวินโดวส ด็อกเกอรจะแสดงหนาตางสอบถามผูอา นใหยืนยันใช Hyper-V ดัง ภาพท่ี 10.11 ใหผ ูอานคลกิ เลอื ก Use Hyper-V เพือ่ ดำเนินการตอ ภาพท่ี 10.11 หนาตางสอบถามใหย ืนยันใช Hyper-V หากเครื่องของผูอานเปนวินโดวส 10 เวอรชัน 2004 ซึ่งสามารถติดตั้งระบบยอยลีนุกซสำหรับวินโดวส เวอรช นั 2 ได โปรแกรมด็อกเกอรจะแสดงหนาตางสอบถามใหผูอา นสลับไปใชระบบยอยลีนุกซสำหรับวินโดวส แทนการใช Hyper-V หรือไม ดังภาพที่ 10.12 หากผูอานเลือกใช Hyper-V ใหคลิกที่ Not now จากนั้น โปรแกรมดอ็ กเกอรจ ะเริ่มการทำงาน ภาพที่ 10.12 หนา ตา งสอบถามใหสลับไปใชระบบยอยลีนกุ ซ ในกรณีที่ผูอานเลือกใช Hyper-V หากเปดเครื่องมือ Hyper-V Manager ที่เขาถึงจากปุมสตารทและ พิมพคน หาวา Hyper-V Manager ผูอานจะพบเครอ่ื งคอมพวิ เตอรเสมือนชื่อ DockerDesktopVM ถกู สรางข้ึน และทำงานโดยอตั โนมัติ ดังภาพท่ี 10.13 187
ภาพท่ี 10.13 หนาตา งแสดงเคร่ืองคอมพิวเตอรเ สมอื น หลงั จากทโ่ี ปรแกรมด็อกเกอรสำหรับวนิ โดวสไดถูกติดตงั้ และเปดการทำงานแลว ผูอานสามารถทดสอบ การทำงานของด็อกเกอรวาพรอมใชงานหรือไม ไดโดยการเปดหนาตาง Powershell หรือ Command Prompt และพมิ พค ำสัง่ # docker version ถาหากการติดตั้งและการเปดการทำงานสำเร็จ หลังจากพิมพคำสั่งจะแสดงผลลัพธดังภาพที่ 10.14 ที่ แสดงเวอรช ันของด็อกเกอรล ูกขา ย และด็อกเกอรแ มขาย หากการติดตัง้ สำเร็จและไมไดเ ปดการทำงาน ผลลพั ธ ที่แสดงจะแสดงเฉพาะเวอรชันของด็อกเกอรลูกขายเทานั้น ในกรณีนี้แสดงวาผูอานลืมคลิกไอคอน Docker Desktop เพ่ือเปด การทำงานของด็อกเกอรแมขาย ภาพที่ 10.14 หนาตา งแสดงเวอรชนั ของด็อกเกอรล ูกขา ยและด็อกเกอรแ มขา ย 188
10.4 การติดต้งั ด็อกเกอรสำหรับระบบปฏบิ ัตกิ ารลีนุกซ ตั้งแตเริ่มมีการพัฒนาโปรแกรมด็อกเกอร โปรแกรมด็อกเกอรไดถูกพัฒนาใหทำงานไดบน ระบบปฏิบัติการลีนุกซอยูแลว ดังนั้น การติดตั้งโปรแกรมด็อกเกอรในระบบปฏิบัติการลีนุกซสามารถ ดำเนนิ การไดท ันที และมีข้นั ตอนไมซ บั ซอ น ดังนี้ 1) เนื่องจากแพ็คเกจของด็อกเกอรไมไดอยูกับระบบปฏิบัติการ ผูอานจำเปนตองเพิ่มคลังแพ็คเกจ (Repository) ใหกับตวั จดั การแพค็ เกจของระบบปฏิบตั ิการกอน ดวยคำสั่ง # yum install -y yum-utils # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 2) หากเปนระบบปฏิบัติการ CentOS 7 หรือเกากวา เมื่อเพิ่มแหลงที่มาของแพ็คเกจจะสามารถตดิ ตง้ั Docker Community Edition ไดด วยคำส่ัง # yum install docker-ce หากเปนระบบปฏิบัติการ CentOS 8 หรือใหมกวา เมื่อเพิ่มแหลงที่มาของแพ็คเกจจะตองติดต้ัง แพ็คเกจ containerd.io กอน โดยผูอานสามารถหาเวอรชันลาสุดไดจากลิงก https:// download.docker.com/linux/centos/7/x86_64/stable/Packages/ ซึ่งเวอรชันที่ลาสุด ณ ชวงเวลาที่ผูเขียนเขียนตำราเลมนี้ คือ containerd.io-1.2.13-3.2.el7.x86_64.rpm ดังนั้น ผูอาน จะสามารถติดต้งั แพ็คเกจ containerd.io เวอรชนั ลาสดุ ไดด วยคำส่ัง # yum install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ containerd.io-1.2.13-3.2.el7.x86_64.rpm หรือผูอา นสามารถใชส คริปตทีค่ น หาเวอรช ันสุดทา ยของแพ็คเกจ containerd.io ไดดวยคำสงั่ # latest=$(curl -s https://download.docker.com/linux/centos/7/ x86_64/stable/Packages/ | awk -F'\"' '/containerd.io/ {print $2}' | sort -V | tail -1) # yum install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ $latest จากสามารถตดิ ตง้ั โปรแกรม Docker Community Edition ไดด วยคำส่งั # yum install docker-ce ในกรณีที่ไมต องการติดตัง้ containerd.io เวอรชนั ลาสุด ระบบปฏิบัตกิ าร CentOS 8 ยังมีแพ็คเกจ containerd.io เวอรชนั ท่ีมาพรอมกับระบบปฏิบัตกิ าร ซ่ึงสามารถติดต้ังอัตโนมัตไิ ดด วยคำส่งั 189
# yum install docker-ce --nobest พารามิเตอร nobest ใชเฉพาะกับระบบปฏิบัติการ CentOS หรือ RHEL เวอรชัน 8 เนื่องจาก ระบบปฏิบัติการ CentOS หรือ RHEL เวอรชัน 8 ไดพัฒนาแอปพลิเคชันบรรจุคอนเทนเนอรขึ้นมา ตางหาก ทำใหเกิดปญหาระหวางทีมผูพัฒนา ทำใหทีมผูพัฒนาด็อกเกอรไมคอมไพลแพ็คเกจบาง แพ็คเกจอยาง containerd.io ใหกับระบบปฏิบัติการ CentOS หรือ RHEL 8 หรือใหมกวา โดยเฉพาะ ในระหวางการติดตั้งโปรแกรม yum อาจสอบถามใหผูอานยืนยันการใชกุญแจสาธารณะของ คลังแพ็คเกจดอ็ กเกอรเพื่อตรวจสอบแพค็ เกจ ใหต อบ y เพื่อดำเนนิ การตอ 3) เม่ือติดตั้งเสรจ็ จะตองส่งั ใหโปรแกรมดอ็ กเกอรทำงานทนั ที และทำงานเมือ่ รบี ูตเครื่อง ดว ยคำสัง่ # systemctl start docker # systemctl enable docker 4) ผูอานสามารถตรวจสอบไดวาติดตั้งโปรแกรมด็อกเกอรเสร็จสมบูรณและด็อกเกอรโฮสตทำงานอยู หรอื ไม ดวยคำสงั่ # docker version หากปรากฎผลลัพธแสดงเวอรชันทั้ง Client และ Server ดังภาพที่ 10.15 แสดงวาโปรแกรม ดอ็ กเกอรพ รอ มใชงาน 5) เปดการทำงานของไฟรวอลลโดยอนุญาตใหคอนเทนเนอรที่สรางจากด็อกเกอรสามารถเชื่อมตอ อินเทอรเน็ตได โดยปกติด็อกเกอรจะเพิ่มอินเตอรเฟสเครือขายเริ่มตนไวที่โซนสาธารณะ (Public zone) อยูแ ลว สามารถอนุญาตใหแพกเกตวงิ่ ผาน โดยใชคำสง่ั # firewall-cmd --zone=public --add-masquerade --permanent # firewall-cmd --reload 190
ภาพที่ 10.15 หนาจอผลลพั ธค ำสง่ั แสดงเวอรช ันโปรแกรมดอ็ กเกอร 191
บทสรปุ ขัน้ ตอนการติดตง้ั โปรแกรมดอ็ กเกอรมีความแตกตา งกันระหวางระบบปฏบิ ัตกิ าร ในกรณีที่ระบบปฏิบัติการเปนวินโดวส 10 โปรแกรมด็อกเกอรจำเปนตองใชแบ็กเอนดเปน ระบบปฎิบัติการลีนุกซซ่ึงมวี ิธีการตดิ ตัง้ 3 แนวทาง คือ 1) ใชโ ปรแกรม Hyper-V เปน แบก็ เอนด เหมาะสำหรับ วินโดวส 10 ที่ไมไดอัพเดทเปนเวอรชัน 2004 แตเปนรุนที่สูงกวาโฮมอิดิชัน 2) ใชระบบยอยลีนุกซเปนแบ็ก เอนด เหมาะสำหรบั วินโดวส 10 ท่ไี ดอัพเดทเปนเวอรชัน 2004 หรอื เปนรุนโฮมอิดิชัน และมหี นวยประมวลผล กลางเปน AMD และการเลือกดสิ ตริบิวชันสามารถเลือกดสิ ตริบิวชนั ไดหลากหลายตามความถนัดของผูอาน 3) สรางเครื่องคอมพิวเตอรเสมือนดวยโปรแกรม Hyper-V หรือ VMWare Workstation Player แลวติดต้ัง โปรแกรมดอ็ กเกอรสำหรับระบบปฏบิ ตั กิ ารลีนกุ ซ ในกรณีที่ระบบปฏิบัติการเปนลีนุกซ ผูอานสามารถติดตั้งโปรแกรมด็อกเกอรไดโดยตรง โดยหากเปน ระบบปฏิบัติการ CentOS 8 หรือ Red Hat Enterprise Linux 8 หรือใหมกวา ผูอานควรติดตั้งแพ็คเกจ containerd.io ดวยตนเองกอ นการตดิ ตั้งด็อกเกอร 192
สรปุ คำส่งั ท่ีนาสนใจ เนื้อหา คำส่ังหรอื ช่ือคำส่งั ท่เี กี่ยวขอ ง คำส่ังตดิ ตั้งระบบยอยลีนุกซผาน cmd # dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart คำสั่งตดิ ต้ังระบบยอยลนี ุกซผาน # Enable-WindowsOptionalFeature -Online - Powershell FeatureName Microsoft-Windows-Subsystem-Linux -All -NoRestart # Enable-WindowsOptionalFeature -Online - FeatureName VirtualMachinePlatform -All -NoRestart เปลี่ยนเวอรช ันของระบบยอยลีนกุ ซเปน # wsl --set-default-version 2 เวอรชนั 2 แสดงรายการดสิ ตรบิ วิ ชนั ลนี กุ ซท่ถี ูก # wsl -l -v ตดิ ตัง้ ตั้งคา ดสิ ตรบิ ิวชนั เร่มิ ตน # wsl --set-default fedoraremix เปล่ียนเวอรช ันของดสิ ตริบวิ ชัน # wsl --set-version fedoraremix 2 ตรวจสอบการติดตั้งด็อกเกอร # docker version ดาวนโหลดด็อกเกอรสำหรับวินโดวส https://hub.docker.com/editions/community /docker- ce-desktop-windows ติดต้งั ดอ็ กเกอรสำหรบั ลีนุกซ # yum install -y yum-utils # yum-config-manager --add-repo https://download .docker.com/linux/centos/docker-ce.repo หากเปน CentOS 7 หรอื เกา กวา # yum install docker-ce หากเปน CentOS 8 หรอื ใหมกวา # latest=$(curl -s https://download.docker.com/ linux/centos/7/ x86_64/stable/Packages/ | awk -F'\"' '/containerd.io/ {print $2}' | sort -V | tail -1) # yum install https://download.docker.com/linux /centos/7/x86_64/stable/Packages/$latest หรือ # yum install docker-ce --nobest 193
เนอื้ หา คำสงั่ หรือช่ือคำสัง่ ท่เี ก่ียวขอ ง เปด การทำงานของด็อกเกอร # systemctl start docker ต้งั คาไฟรว อลลใหค อนเทนเนอรในด็อก # systemctl enable docker เกอรส ามารถเช่อื มตอ อินเทอรเนต็ ได # firewall-cmd --zone=public --add-masquerade -- permanent # firewall-cmd --reload 194
แบบฝกหดั บทท่ี 10 1. บอกแนวทางการติดต้ังด็อกเกอรส ำหรบั ระบบปฏบิ ตั ิการวินโดวส หากเครื่องของผอู านมีหนวย ประมวลผลกลางเปน AMD หรอื ใชวนิ โดวส รนุ โฮมอิดชิ นั 2. บอกช่อื คณุ สมบัติทีจ่ ำเปน สำหรบั การทำงานระบบยอยลีนกุ ซส ำหรับวินโดวส 3. ในกรณที ีเ่ วอรช นั ของระบบยอยลีนุกซท่ีใชงานเปนเวอรชัน 1 จะสามารถเปลี่ยนเปน เวอรช นั 2 โดยไมต อ ง ตดิ ต้ังดสิ ตรบิ วิ ชันของลนี ุกซใหมไดหรอื ไม อยา งไร 4. บอกความแตกตา งระหวา งดอ็ กเกอรสำหรับวนิ โดวส รนุ Stable และรนุ Edge 5. การตดิ ตั้งด็อกเกอรส ำหรับลนี ุกซในระบบปฏิบตั กิ าร CentOS 7 ตา งจาก CentOS 8 อยางไร 195
196
การใชงานเบอื้ งตนแอปพลิเคชนั เทคโนโลยบี รรจคุ อนเทนเนอร บทนำ หน่งึ ใหเ หตุผลหนง่ึ ทีท่ ำใหด อ็ กเกอรเ ปนโปรแกรมที่นา สนใจ คือ การท่ีดอ็ กเกอรเปน ระบบท่มี ีระบบนิเวศ ขนาดใหญ มีแอปพลิเคชันที่ถูกสรางเปนอิมเมจจำนวนมาก และอัพเดทใหทันสมัยอยูเสมอ ผูอานสามารถ เรียกใชอิมเมจที่ถกู สรางโดยผูพ ัฒนาโดยมาสรางเปนคอนเทนเนอรไดตามความตองการ โดยที่สามารถควบคุม การทำงานคอนเทนเนอรไ ดโดยไมสง ผลกระทบตอเครอ่ื งแมขาย 11.1 การคน หาและเรียกใชงานอิมเมจมาตรฐาน อิมเมจมาตรฐาน คือ อิมเมจของซอฟตแวรที่ผูพัฒนาซอฟตแวรเปนผูจัดทำขึ้นมาและดูแลรักษาดวย ตัวเอง ขอดีของอิมเมจมาตรฐานคืออิมเมจที่ใหใชงานจะเปนอิมเมจที่ทันสมัย เพราะเมื่อผูพัฒนาซอฟตแวร ปลอยซอฟตแวรในรูปแบบปกติหรือแฟมขอมูลไบนารีแลว ผูพัฒนาซอฟตแวรจะสามารถปลอยซอฟตแวรใน รูปแบบอิมเมจไปพรอมกันดวย เมื่อการตองการใชงานอิมเมจมาตรฐาน ผูอานสามารถคนหาอิมเมจมาตรฐาน ไดจากรจี ีสตรสี าธารณะของดอ็ กเกอรท ่เี ว็บไซต https://hub.docker.com (Docker Inc. 2020a) โดยมีชองท่ี สามารถคนหาอิมเมจมาตรฐานได ยกตัวอยางเชน หากตองการคนหาโปรแกรมเว็บเซิรฟเวอร apache (The Apache Software Foundation 2020) กพ็ ิมพคำคน วา apache เปน ตน ดังภาพท่ี 11.1 ภาพท่ี 11.1 สว นหนึ่งของหนาเวบ็ ไซตด อ็ กเกอร 197
ภาพท่ี 11.2 ผลลัพธก ารคนหาอิมเมจ จากภาพที่ 11.2 แสดงผลลัพธอิมเมจที่เกี่ยวของกับคำคน apache โดยอิมเมจมาตรฐานของโปรแกรม Apache มชี ื่อ httpd ปจ จุบันมยี อดดาวนโ หลดมากกวา 10 ลานคร้ัง เมอื่ คลกิ เขาไปจะแสดงรายละเอียดของ อิมเมจมาตรฐาน httpd ดังภาพที่ 11.3 ผูอานสามารถเลือกแพลตฟอรมทางฝงขวามือสำหรับเครื่อง คอมพวิ เตอรสว นบุคคลท่ีใชงานกันทว่ั ไปจะเลือกเปน Linux – x86-64 (latest) จะปรากฏชอื่ อิมเมจมาตรฐาน ทีเ่ หมาสมกบั แพลตฟอรมทเ่ี ลอื ก ภาพท่ี 11.3 สวนหนึ่งหนาเว็บแสดงรายละเอยี ดอิมเมจ httpd 198
ผูอานสามารถเรมิ่ ดาวนโหลดอิมเมจ httpd ท่ีเปนเวอรช ันลา สดุ มาเก็บไวในเครอื่ งได โดยใชคำส่งั # docker pull httpd ภาพที่ 11.4 หนาจอผลลพั ธคำสั่งดาวนโ หลดอิมเมจ เมื่อดาวนโหลดเสร็จสิ้น จะปรากฏขอความดังภาพที่ 10.4 วาอิมเมจไดถูกดาวนโหลดสำเร็จ ผูอาน สามารถตรวจสอบรายการอมิ เมจท่ถี ูกดาวนโ หลดมาไวในเครือ่ ง โดยใชค ำสง่ั # docker image ls ภาพท่ี 11.5 หนาจอผลลัพธคำสัง่ แสดงรายการอิมเมจ โปรแกรมด็อกเกอรจะแสดงชื่อของอิมเมจ ชอ่ื แท็ก รหสั อมิ เมจ วันท่ผี พู ัฒนาอิมเมจสรา ง และขนาดของ อิมเมจดังภาพที่ 10.5 โดยขนาดของอิมเมจเปนขนาดที่ไมถูกบีบอัด (Uncompressed) แตเมื่อถูกดาวนโหลด หรืออัพโหลดจากรีจีสตรี รีจีสตรีจะเก็บอิมเมจในรูปแบบที่บีบอัด (Compressed) และเก็บคาแฮชดวย อัลกอริทึม SHA-256 ของอิมเมจและแตละชั้นขอมูลเพื่อไวเปรียบเทียบหากมีอิมเมจหรือชั้นขอมูลซ้ำกันที่รีจี สตรี ชั้นขอมูลนั้นหรืออิมเมจนั้นจะไมถูกอัพโหลดหรือดาวนโหลดซ้ำ เพื่อลดปญหาการจราจรทางเครือขาย (Network Traffic) 11.2 การสรา งและเริ่มตน คอนเทนเนอร เมื่อผูอานดาวนโหลดอิมเมจมาแลว ดังที่ไดกลาวไวแลววาอิมเมจนั้นไมสามารถแกไขได (Immutable) แตห ากนำมาใชงาน โปรแกรมด็อกเกอรจะนำช้นั ขอมูลของอิมเมจมาเปนชน้ั ขอมูลฐาน และสรางช้ันขอมูลใหม ที่เก็บขอมูลเฉพาะแฟมที่มีความแตกตางจากชั้นขอมูลฐาน เรียกวา คอนเทนเนอร ดังนั้น อิมเมจหนึ่งอิมเมจ สามารถนำไปสรางคอนเทนเนอรไดหลายคอนเทนเนอรในเวลาเดียวกัน โดยเมื่ออางอิงแฟมขอมูลเดียวกัน โปรแกรมด็อกเกอรจ ะอานขอมูลจากดิสกท่ีบล็อกเดยี วกัน ทำใหร ะบบปฏบิ ัติการบางตัวสามารถทำแคชในบาง ดสิ กเ พ่ือเพิ่มประสทิ ธิภาพการทำงานได โดยปกติเมื่อสรางคอนเทนเนอร โปรแกรมด็อกเกอรจะเริ่มตนคอนเทนเทอรนั้นอันโนมัติ อยางไรก็ตาม คอนเทนเนอรนั้นถูกทำงานผานเครือขายเสมือนของด็อกเกอรไมสามารถติดตอกับด็อกเกอรโฮสตไดโดยตรง 199
ดังนั้น หากตองการกำหนดการเชื่อมตอคอนเทนเนอรกับด็อกเกอรโฮสตนั้น ผูอานจำเปนตองระบุคุณสมบัติ ดังกลาวตั้งแตสรางคอนเทนเนอร เพราะเมื่อสรางคอนเทนเนอรข ึ้นมาแลว พารามิเตอรสวนใหญจะไมส ามารถ เปล่ยี นแปลงได ทัง้ น้ี คอนเทนเนอรเ มื่อเชื่อมตอกับด็อกเกอรโฮสตและรักษาสถานะของขอมูลและเครือขายได แลว คอนเทนเนอรจะถูกหยดุ การทำงาน ลบแลว สรางใหมจ ากอิมเมจเดิม คอนเทนเนอรก็ยังสามารถทำงานได เหมอื นเดิม ตารางที่ 11.1 พารามเิ ตอรท่ีใชส รางคอนเทนเนอร ชอ่ื พารามเิ ตอร ความหมาย -i ทำงานในโหมดปฏิสัมพันธ -t สรางหนาจอเทียม -d ทำงานในโหมดพนื้ หลัง -e VAR=value กำหนดตัวแปรสภาพแวดลอมช่ือ VAR ใหมีคาเปน value -v /local/path:/container/path เชอ่ื มตอ ไดเรกทอรีบนเครื่องแมข า ย /local/path กับไดเรกทอรีใน คอนเทนเนอร /container/path -p host:port:containerPort เชอื่ มตอ พอรตบนเครื่องแมขา ยกบั ทอ่ี ยูไอพี host พอรต port กบั พอรตในเคร่ืองคอนเทนเนอร containerPort คาเรม่ิ ตน ของ host คอื 0.0.0.0 --name hostname กำหนดชอื่ ใหคอนเทนเนอรใ หเปน hostname --restart option กำหนดใหคอนเทนเนอรเ ปดคอนเทนอรเ องโดยอตั โนมตั ิ มตี ัวเลอื กเปน image_name no ไมร สี ตารท และเปด คอนเทนเนอรเองอัตโนมตั ิ command on-failure รสี ตารทและเปดคอนเทนเนอรเ องเม่ือการทำงานใน คอนเทนเนอรผิดพลาดจนคอนเทนเนอรปดตวั ลง always รสี ตารท และเปดคอนเทนเนอรเ องอัตโนมัติ unless-stopped รสี ตารทและเปด คอนเทนเนอรเองอตั โนมัติ จนกวาจะสั่งหยุดคอนเทนเนอร คา เร่มิ ตน คือ no กำหนดท่ีอยขู องอิมเมจด็อกเกอร ตำแหนงของพารามิเตอรน้จี ะตอง ไวห ลงั พารามเิ ตอรท ร่ี ะบคุ ุณสมบัติเทา น้ัน กำหนดคำสัง่ ท่ีทำงานเมื่อเริ่มตน คอนเทนเนอร ตำแหนง ของ พารามิเตอรน ต้ี องอยูถัดจาก image_name เทา นนั้ สำหรับการสรางคอนเทนเนอร โปรแกรมด็อกเกอรสนับสนุนพารามิเตอรหลายพารามิเตอรแสดงตาม ตารางที่ 11.1 และพารามิเตอรเหลานี้ควรกำหนดใหเสร็จกอนการสราง เนื่องจากคอนเทนเนอรนั้นถูกทำงาน ผานเครือขายเสมือนของด็อกเกอรไมสามารถติดตอกับด็อกเกอรโฮสตไดโดยตรง โดยเฉพาะใชจองพอรตไว 200
เชื่อมตอ กบั ด็อกเกอรโ ฮสต ดังนัน้ เวลาสรา งคอนเทนเนอร ผูอา นควรพิจารณาตามลำดบั เพื่อระบุพารามิเตอรท่ี จำเปนสำหรับการสรา งคอนเทนเนอร ดงั นี้ 1) คอนเทนเนอรนี้ทำงานดวยโหมดปฏิสัมพันธหรือโหมดพื้นหลัง หากเปนโหมดปฏิสัมพันธ ผูอานจะ สามารถเขาถึงเชลลและพิมพคำสั่งไดทันที แตหากเปนโหมดพื้นหลัง คอนเทนเนอรจะทำงานพ้ืน หลังโดยท่ไี มมกี ารปฏิสมั พันธก บั ผอู าน พารามิเตอร โหมดปฏิสัมพนั ธ คือ -it โหมดพ้ืนหลงั คอื -d และโหมดปฏสิ ัมพนั ธแตสั่งใหทำงานอยู พ้ืนหลงั คือ -dit พารามเิ ตอรนส้ี ามารถปรากฏไดเ พยี งคร้งั เดียวและจำเปนตองระบุ 2) คอนเทนเนอรนี้มีการสงตัวแปรสภาพแวดลอมหรือไม ตัวแปรสภาพแวดลอมที่สงไปยังคอนเทน เนอรมักเปนเงื่อนไขในการตัดสินใจการทำงานของอิมเมจ ผูอานสามารถศึกษาตัวแปร สภาพแวดลอมไดจากรีจสี ตรีอมิ เมจมาตรฐาน ซึ่งผูพฒั นาอมิ เมจจะกำหนดตัวแปรทสี่ ำคัญ เชน รหัส ผูใช รหสั ผา น ฐานขอ มูลเรม่ิ ตน เปน ตน พารามิเตอรของตัวแปรสภาพแวดลอม คือ -e <ชื่อตัวแปร>=<คาตัวแปร> หากตองการระบหุ ลาย ตวั แปร ใหใชพ ารามิเตอร -e หลายคร้ังตอ กนั เชน -e VAR1=value1 -e VAR2=value2 จากคำสั่ง น้ี เมอื่ echo $VAR1 $VAR2 ในเซลลของคอนเทนเนอรจ ะไดผลลัพธเปน value1 value2 พารามเิ ตอรน้ีไมจ ำเปน ตองระบุก็ได 3) คอนเทนเนอรน ี้มีการเชื่อมตอทเ่ี กบ็ ขอมูลใดกบั ไดเรกทอรีของด็อกเกอรโฮสตหรือไม การเช่ือมตอท่ี เก็บขอมลู กับไดเรกทอรีบนโฮสตจะชวยใหเ ม่ือลบคอนเทนเนอรขอมูลจะไมสูญหายไป การเชื่อมตอ ที่เก็บขอมูลของด็อกเกอรจะสนับสนุนการเชื่อมตอ แบบรายไดเรกทอรี (Per directory) เทานั้น ไม สามารถรายแฟม ขอมลู (Per file) ได พารามเิ ตอรข องการเชือ่ มที่เก็บขอมูล คอื -v <ไดเรกทอรีบนโฮสต>:<ไดเรกทอรีบนคอนเทนเนอร> หากตองการระบุหลายการเชื่อมที่เก็บขอมูล ใหใชพารามิเตอร -v หลายครั้งตอกัน เชน -v /root/database:/var/lib/postgresql -v /root/backup:/backup จากคำส่ังนี้ หากผอู า นบันทึก แฟมขอมูลหรือแกไขแฟมขอมูลในไดเรกทอรี /var/lib/postgresql และ /backup ในคอนเทน เนอร ขอ มูลจะถูกบันทึกลงบนโฮสตที่ไดเรกทอรี /root/database และ /root/backup ตามลำดับ ทำใหผ ูอา นสามารถเขาถงึ แฟมขอมลู ที่เชอ่ื มตอ ไวโ ดยท่ไี มไดเขาไปท่ีหนาจอของคอนเทนเนอร พารามิเตอรน้ีไมจำเปนตอ งระบุกไ็ ด 4) คอนเทนเนอรนี้มเี ปดพอรต และการเชื่อมตอกับพอรตบนเครื่องด็อกเกอรโฮสตหรือไม การเชื่อมตอ พอรตจะชวยใหซอฟตแวรที่ทำงานอยูในคอนเทนเนอรสามารถเชื่อมตอไปยังเครือขายภายนอกได เชน คอนเทนเนอรของเว็บเซิรฟเวอรเปดพอรต 80 เพื่อใหเขาถึงเว็บเซิรฟเวอรในคอนเทนเนอรได ผอู า นจำเปนตอ งเชือ่ มตอ พอรตของคอนเทนเนอรก บั พอรตของด็อกเกอรโ ฮสต พารามิเตอรของการเชื่อมตอพอรต คือ -p <ที่อยูไอพีของโฮสต:พอรตของโฮสต>:<พอรตของคอน เทนเนอร> ในกรณีที่ไมระบุที่อยูไอพีของโฮสต คาที่อยูไอพีของโฮสตที่จะเชื่อมตอคือ 0.0.0.0 หมายความวาเคร่ืองคอมพิวเตอรใดท่ีเชื่อมตอกบั ด็อกเกอรโ ฮสตจะสามารถเขา ถึงคอนเทนเนอรตาม 201
พอรตที่กำหนด ในบางกรณีเพื่อความมั่นคงปลอดภัย ผูอานอาจระบุใหที่อยูไอพีของโฮสตเปน 127.0.0.1 ทำใหบริการที่พอรตของคอนเทนเนอรนั้นไมสามารถเขาถึงจากเครื่องที่อยูในเครือขาย เดียวกับด็อกเกอรโฮสตได หากตองการระบุหลายการเชื่อมตอพอรต ใหใชพารามิเตอร -p หลาย ครั้งตอกัน เชน -p 127.0.0.1:5000:80 -p 443:443 จากคำสั่งนี้ เฉพาะเครื่องด็อกเกอรโฮสตเมื่อ เชื่อมตอกับพอรต 5000 ของตัวเองจะเทากับเชื่อมตอไปยังคอนเทนเนอรนั้นพอรต 80 และทุก เครื่องในเครือขายที่เชื่อมกับด็อกเกอรโฮสตเมื่อเชื่อมตอผานพอรต 443 ของด็อกเกอรโฮสต จะ เทากับเชื่อมตอ ไปยังคอนเทนเนอรน ัน้ พอรต 443 การเชื่อมตอดังกลาวโปรแกรมด็อกเกอรโฮสตจะ สรางคำสัง่ ไฟรวอลลเ พอื่ ยายแพกเกต (Packet) ไปเองโดยอัตโนมัติ พารามิเตอรน ไ้ี มจำเปนตอ งระบกุ ็ได 5) เมื่อรีสตารทเครื่องด็อกเกอรโฮสต คอนเทนเนอรนี้จะเปดการทำงานโดยอัตโนมัติหรือไม โดยปกติ เมื่อหยุดการทำงานของด็อกเกอรโฮสตและเริ่มการทำงานใหม คอนเทนเนอรทั้งหมดจะอยูใน สถานะหยุดการทำงานชัว่ คราว โดยผอู านสามารถสั่งเปดการทำงานตอได พารามิเตอรสงั่ ใหเริ่มการทำงานอตั โนมตั ิ --restart always พารามเิ ตอรน้ีไมจำเปนตอ งระบกุ ็ได 6) คอนเทนเนอรน ้ีใชอมิ เมจใดเพ่ือสรางช้นั ขอมูลฐาน ในกรณีทเี่ ปน อิมเมจมาตรฐาน ชื่อของอิมเมจมัก เปน คำเดียว เชน httpd แตห ากผอู า นสรางบัญชที รี่ จี ีสตรีและสงออกอมิ เมจของผูอา นเองชื่อจะเปน <รหสั ผูใช>/<ชอื่ อมิ เมจ> เชน utarn/httpd เปน ตน พารามิเตอรน จี้ ำเปนตองระบุ 7) ตอ งการกำหนดคำสั่งพเิ ศษท่ที ำงานเมื่อเริ่มตน คอนเทนเนอรห รอื ไม หากไมกำหนดคอนเทนเนอรจะ เริ่มตนการทำงานตามคำสั่งที่ระบุไวในอิมเมจ คำสั่งพิเศษอาจไมจำเปนหากผูอานใชอิมเมจ มาตรฐานหรืออิมเมจที่มีผูพัฒนาดูแลและเปนที่นิยม สวนใหญนิยมใชกำหนดคำสั่งเขาถึงเชลลเพือ่ ตรวจสอบการทำงานหรือตรวจสอบขอผิดพลาดของอิมเมจที่สรางขึ้นมาวาทำงานไดถกู ตองหรือไม ตวั อยา งคำส่งั พิเศษ เชน sh หรือ bash สำหรับการเขา ถึงเชลลในลีนุกซ พารามเิ ตอรนีไ้ มจำเปนตอ งระบุ จากพารามิเตอรสำหรับการสรางคอนเทนเนอร ผูอานสามารถสรางคอนเทนเนอรของเว็บเซิรฟเวอร Apache ท่ีตรงกับพารามิเตอรดังนี้ 1) ทำงานอยูในโหมดเบ้อื งหลัง ใชพ ารามเิ ตอร -d 2) เชื่อมตอไดเรกทอรี /usr/local/apache2/htdocs/ ของคอนเทนเนอรกับไดเรกทอรี /root/website ของโฮสต 3) เช่อื มตอตอ พอรต 80 ของคอนเทนเนอร กบั พอรต 80 ของโฮสต 4) ใชอมิ เมจมาตรฐาน ชอื่ httpd 202
จากเงื่อนไขดังกลาวจะสามารถสรางเปนคำสั่ง docker create หรือ docker run โดยคำสั่ง docker create จะสรางคอนเทนเนอรอยางเดียว แตคำสั่ง docker run จะสรางคอนเทนเนอรและเปดการทำงานไป พรอ มกัน ดงั น้ี # docker run -d -v /root/website:/usr/local/apache2/htdocs -p 80:80 httpd เม่ือพิมพค ำสั่งจะปรากฏผลลัพธด ังภาพที่ 11.6 แสดงรหสั ของคอนเทนเนอรท่ีสรางใหม หลังจากที่ส่ังให คอนเทนเนอรเวบ็ เซิรฟเวอรท ำงาน ผูอานสามารถตรวจสอบการทำงานของคอนเทนเนอรด ว ยคำส่งั # docker ps ภาพท่ี 11.6 หนาจอผลลพั ธคำสง่ั สรา งคอนเทนเนอรใ หม เมื่อพิมพคำสั่ง จะปรากฏผลลัพธดังภาพที่ 11.7 แสดงวาคอนเทนเนอรที่สรางขึ้นมามีรหัสเปน 1bba17d1cb3c และมีชอ่ื วา frosty_tereshkova ภาพท่ี 11.7 หนา จอผลลพั ธคำสัง่ แสดงรายการคอนเทนเนอร เนื่องจากคอนเทนเนอรไดเชื่อมตอพอรต 80 ของด็อกเกอรโฮสต ผูอานสามารถทดลองเขาเว็บของ คอนเทนเนอรเว็บเซิรฟเวอรนี้ไดจากเบราเซอรท่ี http://<ที่อยูไอพีของโฮสต> จะปรากฎผลลัพธดังภาพท่ี 10.8 ภาพท่ี 11.8 หนาจอผลลพั ธของเวบ็ เบราเซอรเ มอ่ื เขา ถึงเวบ็ ของคอนเทนเนอร เนื่องจากคอนเทนเนอรไดเชื่อมตอกับไดเรกทอรีของ /root/website ผูอานสามารถทดลองสรางหนา แรกของเว็บไซตอ ยา งงายๆ ดวยคำสง่ั 203
# echo \"Hello my first docker container\" > /root/website/index.html จากนั้นเมื่อกด F5 เพื่อรีเฟรชเบราเซอรใหม ผูอานจะไดผลลัพธดังภาพที่ 11.9 วาหนาแรกที่ทดลอง สรางปรากฎบนเว็บเซริ ฟเวอร ภาพที่ 11.9 หนา จอผลลัพธของเว็บเบราเซอรเมอ่ื เพิ่มหนาเว็บหนาแรก 11.3 อธิบายการกำหนดการทำงานของคอนเทนเนอร เมื่อสรางคอนเทนเนอรขึ้นมาแลว การแกไขการทำงานของคอนเทนเนอรจะสามารถทำไดอยางจำกัด กลาวคือ ไมใชทุกการตั้งคาเมื่อสรางคอนเทนเนอรดวยคำสั่ง docker run จะสามารถแกไขไดในภายหลัง ดังนัน้ ทางท่ีดีทสี่ ดุ ของการกำหนดการทำงานของคอนเทนเนอรคือใหกำหนดคุณสมบัตติ าง ๆ ใหเ รียบรอ ยกอน การสรางคอนเทนเนอรขึ้นมา หนึ่งในพารามิเตอรที่นิยมแกไขหลังการสรางคอนเทนเนอร คือ การกำหนดการ เปดการทำงานของคอนเทนเนอรเมื่อเริ่มตนบริการของด็อกเกอร ซึ่งบริการของด็อกเกอรนั้นสามารถตั้งคาให เริ่มการทำงานเม่ือรบี ูตเคร่ืองโฮสตได แตโ ดยเร่มิ ตน หากคอนเทนเนอรอยูในสถานะเปดการทำงานกอนการปด หรือรีสตารทบริการด็อกเกอร เมื่อบริการของด็อกเกอรในด็อกเกอรโฮสตเริ่มตนการทำงานอีกครั้ง คอนเทน เนอรจ ะอยูในสถานะออกการทำงาน (Exited) คำสั่งกำหนดการทำงานของคอนเทนเนอรทุกคำสั่งในโปรแกรมด็อกเกอรจะตองใชขอมูลอยางใดอยาง หนึ่ง คือ รหัสของคอนเทนเนอรหรือชื่อของคอนเทนเนอร ในกรณีที่เปนรหสั คอนเทนเนอรผูอ านสามารถพิมพ แคบ างสว นที่ไมซ้ำกับรหัสคอนเทนเนอรของคอนเทนเนอรอ่ืน เชน หากคอนเทนเนอรมรี หสั คอนเทนเนอรเปน 1bba17d1cb3c และมีชื่อวา frosty_tereshkova ผูอานสามารถใชคำสั่งตอไปนี้เพือ่ กำหนดใหคอนเทนเนอร อยใู นสถานะเร่มิ การทำงานพรอมกบั บรกิ ารของด็อกเกอรได # docker update --restart always 1bba17d1cb3c # docker update --restart always 1b (ในกรณที ีไ่ มม ีคอนเทนเนอรอ่นื ทม่ี รี หัสคอนเทนเนอรขึ้นตน ดว ย 1b) # docker update --restart always 1 (ในกรณที ไี่ มม ีคอนเทนเนอรอื่นท่ีมีรหสั คอนเทนเนอรขน้ึ ตน ดว ย 1) # docker update --restart always frosty_tereshkova 204
(ไมสามารถพมิ พช่อื เพยี งบางสวนได) นอกจารคำสั่ง docker update แลว เวลาพิมพคำสั่งอื่นที่อางอิงคอนเทนเนอร ผูอานสามารถใช หลกั การพิมพรหสั คอนเทนเนอรบ างสว นเพือ่ ความสะดวกรวดเรว็ ย่ิงขึ้นได 11.4 การหยดุ และบงั คบั หยุดการทำงานของคอนเทนเนอร วิธีการหยุดการทำงานของคอนเทนเนอรนั้นขึ้นอยูกับโหมดการทำงานของคอนเทนเนอรวาทำงานใน โหมดการทำงานใด ในกรณีที่ทำงานดวยโหมดปฏิสัมพันธ หนาผูอานปดหนาจอการเขาถึงระยะไกล เชน โปรแกรม Putty หรือกด CTRL + C ก็จะหยดุ การทำงานของคอนเทนเนอรนั้นทันที ในกรณีทที่ ำงานดว ยโหมด พ้นื หลงั หรือผูอานเปดการเขาถึงระยะไกลหรือคอนโซลอีกหนาตางหนึ่ง ผูอา นสามารถใชคำส่ังตอไปนี้หยุดการ ทำงานของคอนเทนเนอรได # docker stop frosty_tereshkova ผูอานสามารถใชค ำส่ังตอไปนีเ้ พ่ือบงั คบั หยุดการทำงานของคอนเทนเนอรไ ด # docker kill frosty_tereshkova ในกรณีท่คี อนเทนเนอรหยุดการทำงานไปแตยังไมถูกลบ ผอู านสามารถตรวจสอบสถานะการทำงานของ คอนเทนเนอรท่ีหยุดการทำงานไปดวยคำสง่ั # docker ps -a หากตองการเริ่มการทำงานใหม ผูอานสามารถใชคำสั่งตอไปนี้เพื่อเริ่มการทำงานของคอนเทนเนอรอีก คร้งั ได # docker start frosty_tereshkova การสัง่ หยดุ การทำงานตา งจากการสั่งบังคับหยดุ ตรงท่ี เมื่อผอู านส่งั หยุดการทำงาน ด็อกเกอรโฮสตจะสง สัญญาณ Signal Hang up (SIGHUP) ไปยังคอนเทนเนอร สัญญาณ SIGHUP เปนคำสั่งหยุดที่สามารถรอได ในซอฟตแ วรสวนใหญจ ะเขยี นโคดรองรบั ใหบ ันทึกการทำงานครัง้ สดุ ทายกอ นหยุดการทำงาน สว นการสง่ั บังคับ หยดุ การทำงาน ด็อกเกอรโ ฮสตจะสง สญั ญาณ Signal Termination (SIGTERM) ไปยงั คอนเทนเนอร คอนเทน เนอรจะรีบออกจากการทำงานใหเร็วที่สุดทันทีซึ่งอาจสงผลตอขอมูลที่กำลังประมวลผลอยู โดยมากมักใชใน กรณีที่โพรเซสในคอนเทนเนอรแฮงค อยางไรก็ตาม แมซอฟตแวรสวนใหญจะเขียนโปรแกรมมาจัดการกับ SIGHUP แตยังมีโอกาสที่ขอมูลสูญหายได ดังนั้น วิธีการออกคอนเทนเนอรที่ดีที่สุดคือ การสงคำสั่งหยุดการ ทำงานของซอฟตแ วรใ นคอนเทนเนอรน ้นั ซึ่งคำส่ังดงั กลาวขึ้นอยกู บั ผพู ฒั นาและสรางอิมเมจกำหนดขน้ึ มา 205
11.5 การหยุดการทำงานของคอนเทนเนอรชว่ั คราว การหยุดการทำงานของคอนเทนเนอรชั่วคราวจะเปนการหยุดการทำงานของโพรเซสในคอนเทนเนอร ทำใหโ พสเซสในคอนเทนเนอรไมใ ชทรัพยากรจากหนวยประมวลผลกลาง แตค อนเทนเนอรยงั คงอยใู นสถานะที่ ทำงานและยังจองพื้นที่หนวยความจำหลักอยู การหยุดการทำงานของคอนเทนเนอรชั่วคราวมักใชในกรณีที่ ตองการใหคอนเทนเนอรอื่นใชทรัพยากรประมวลผลงานกอน แตก็ไมตองการปดการทำงานของคอนเทนเนอร ไป ผอู า นสามารถใชคำสัง่ นีเ้ พ่ือหยดุ การทำงานของคอนเทนเนอรช ่วั คราวได # docker pause frosty_tereshkova เมื่อพรอมใหคอนเทนเนอรที่หยุดการทำงานชวยคราวสามารถทำงานไดตอ ผูอานสามารถใชคำสั่ง ตอ ไปนีเ้ พ่อื ดำเนนิ การทำงานของคอนเทนเนอรตอ ได # docker unpause frosty_tereshkova 11.6 การลบคอนเทนเนอรแ ละอมิ เมจ เมื่อสรางและสั่งใหคอนเทนเนอรทำงานแลว โปรแกรมด็อกเกอรจะสรางชั้นขอมูลสำหรับคอนเทนเนอร ข้ึนมาอีกช้นั ในช้นั ขอ มูลนน้ั บางสว นอาจเชื่อมตอไปยังไดเรกทอรีของด็อกเกอรโ ฮสตทำใหคอนเทนเนอรนั้นใช พน้ื ท่เี ก็บขอมลู บนดิสก เมือ่ หยดุ การทำงานแลว โปรแกรมด็อกเกอรจ ะไมลบคอนเทนเนอรน นั้ ออก เพราะคอน เทนเนอรเมื่อหยุดการทำงานไปแลว ยังสามารถเปดการทำงานใหมอีกครั้งได ดังนั้น ผูใชจึงควรลบคอนเทน เนอรทีไ่ มไดใชงานออกอยูเ สมอ ผูอ านสามารถใชค ำส่ังตอไปนเ้ี พื่อลบของคอนเทนเนอรตอได # docker rm frosty_tereshkova ในกรณีที่มีคอนเทนเนอรจำนวนมากทีต่ องการลบ ผูอานสามารถลบคอนเทนเนอรท่ีไมไดทำงาน โดยใช คำส่ัง # docker container prune -f พารามิเตอร -f ของคำส่ังมไี วเ พ่อื ลบคอนเทนเนอรท ันทีทุกคอนเทนเนอร สำหรับอิมเมจ เมื่อดาวนโหลดหรือถูกสรางขึ้นมา แมโปรแกรมด็อกเกอรจะดาวนโหลดหรือเก็บขอมูล เฉพาะชั้นขอมูลท่ีไมซ้ำกัน แตเมื่อเวลาผานไป ผูอานอาจมีอิมเมจที่ไมไดใชงานหรือจะไมไดใชสราง คอนเทนเนอรอีก ซึ่งอิมเมจเหลานี้ใชพื้นที่เก็บขอมูลบนดิสก การลบอิมเมจออกจำเปนตองใชรหัสของอิมเมจ เทา นัน้ เชน หากอมิ เมจ httpd มรี หัสอมิ เมจดังภาพท่ี 11.5 เปน b2c2ab6dcf2e สามารถใชค ำสง่ั # docker image rm b2c2ab6dcf2e ในกรณที ี่ตองการลบอิมเมจทไ่ี มไดใ ชง านทั้งหมด ผูอา นสามารถใชคำสงั่ # docker image prune 206
แตอิมเมจที่จะลบไดนั้นจะตองไมถูกอางอิงจากคอนเทนเนอรใด ๆ เลยแมคอนเทนเนอรนั้นจะหยุดการ ทำงานไปก็ตาม หากตองการลบอิมเมจที่ไมถูกอางอิงจากคอนเทนเนอรที่กำลังทำงานอยูเทานั้น สามารถเพ่ิม พารามเิ ตอร -a ไดเปนคำสงั่ # docker image prune -a อยางไรก็ตาม แมคำสั่งลบคอนเทนเนอรและลบอิมเมจจะมีคำสั่งที่สามารถลบขอมูลทั้งหมดไดโดยไม สอบถามการยนื ยนั จากผูใชงาน แตการกระทำดงั กลาวไมถือวาเปนการกระทำที่อันตราย เพราะสำหรับอิมเมจ แลว สามารถดาวนโหลดไดใหมจากรีจีสตรี และสำหรับคอนเทนเนอร หากเช่อื มตอไดเรกทอรีท่ีเก็บขอมูลไวกับ ไดเรกทอรีบนด็อกเกอรโฮสต การลบคอนเทนเนอรจะไมสงผลตอไดเรกทอรีที่เก็บขอมูลบนด็อกเกอรโฮสตแต อยา งใด 207
บทสรุป อิมเมจมาตรฐาน คือ อิมเมจของซอฟตแวรที่ผูพัฒนาซอฟตแวรเปนผูจัดทำขึ้นมาและดูแลรักษาดวย ตัวเอง ขอดีของอิมเมจมาตรฐานคืออิมเมจท่ีใหใชงานจะเปนอิมเมจที่ทันสมัย เพราะเมื่อผูพัฒนาซอฟตแวร ปลอยซอฟตแวรในรูปแบบปกติหรือแฟมขอมูลไบนารีแลว ผูพัฒนาซอฟตแวรจะสามารถปลอยซอฟตแวรใน รูปแบบอิมเมจไปพรอมกนั ดวย อิมเมจของด็อกเกอรมกี ารจัดการขอ มูลเปนชั้นและเก็บคา แฮชดว ยอัลกอริทมึ SHA-256 เพื่อตรวจสอบ ไมใหชั้นขอมูลของอิมเมจถูกอัพโหลดซ้ำหรือดาวนโหลดซ้ำ เพื่อลดปญหาการจราจรทางเครือขาย (Network Traffic) คุณลักษณะเดนของอิมเมจ คือ ไมสามารถแกไขได ดังนั้น ในการใชงาน ด็อกเกอรจึงสราง คอนเทนเนอรจ ากอิมเมจ และบันทกึ การเปลีย่ นแปลงไวในคอนเทนเนอรแ ทน ในขั้นตอนการสรางคอนเทนเนอรนน้ั มีหลายพารามิเตอรท่ีไมสามารถเปลี่ยนแปลงไดหลังจากการสราง ดังนั้น ในการสรางผูอานควรระบุพารามิเตอรที่จำเปนใหครบถวน เหตุผลหลักที่พารามิเตอรไมสามารถ เปลี่ยนแปลงไดภายหลังเพราะผูอานสามารถสรางคอนเทนเนอรจากอิมเมจไดใหมตลอดเวลา คอนเทนเนอร เปรียบเสมอื นศูนยรวมการต้ังคา ความเช่ือมโยงวา จะใหเครอื ขา ยไหน เกบ็ ขอ มูลไวท ีไ่ หน หรอื เชอื่ มตอกับพอรต อะไร ดังนั้น กระบวนการสวนใหญของการลบและสรางคอนเทนเนอรใหมจากอิมเมจเดิมไมเกิดการสูญเสีย ขอมูล 208
สรปุ คำส่งั ทน่ี าสนใจ คำส่ังหรือชื่อคำสงั่ ท่เี ก่ียวของ เนือ้ หา https://hub.docker.com # docker pull รจี ีสตรีสาธารณะของด็อกเกอร # docker image ls คำส่งั ดาวนโ หลดอมิ เมจ # docker run -d -v ตรวจสอบรายการอิมเมจท่ีถกู ดาวนโหลดมาไวใ น /root/website:/usr/local/apache2/htdocs -p เคร่ือง 80:80 httpd ตัวอยางคำสั่งสรางคอนเทนเนอรจ ากอิมเมจ # docker ps ตรวจสอบการทำงานของคอนเทนเนอร 1. รหสั ของคอนเทนเนอรโ ดยพิมพเ ฉพาะบางสวนท่ี หลักการอา งองิ ช่ือคอนเทนเนอร ไมซ้ำกบั รหสั คอนเทนเนอรอื่น กำหนดใหคอนเทนเนอรอยูในสถานะเร่มิ การทำงาน 2. ชือ่ คอนเทนเนอรเ ต็ม พรอ มกบั บรกิ ารของด็อกเกอร # docker update --restart always หยุดการทำงานของคอนเทนเนอร frosty_tereshkova บังคับหยดุ การทำงานของคอนเทนเนอร # docker stop frosty_tereshkova เร่ิมการทำงานของคอนเทนเนอร # docker kill frosty_tereshkova หยดุ การทำงานของคอนเทนเนอรชั่วคราว # docker start frosty_tereshkova ดำเนินการทำงานของคอนเทนเนอรต อ # docker pause frosty_tereshkova ลบของคอนเทนเนอร # docker unpause frosty_tereshkova ลบคอนเทนเนอรท ่ีไมไดท ำงาน # docker rm frosty_tereshkova ลบอิมเมจ # docker container prune -f ลบอิมเมจที่ไมไดใ ชงานท้ังหมด # docker image rm รหสั อมิ เมจ ลบอิมเมจที่ไมถกู อา งอิงจากคอนเทนเนอรท ่ีกำลงั # docker image prune ทำงานอยูเทา นน้ั # docker image prune -a 209
แบบฝก หัดบทที่ 11 1. บอกท่ีอยูของรจี ีสตรมี าตรฐานท่ีสามารถคน หาอิมเมจมาตรฐานได 2. บอกพารามเิ ตอร และความหมายของพารามิเตอรสำหรับใชส รา งคอนเทนเนอรมาอยา งนอ ย 5 พารามิเตอร 3. คำสง่ั docker stop แตกตางจากคำสั่ง docker kill อยา งไร 4. บอกหลักการการอางองิ ชอ่ื และรหัสคอนเทนเนอรเ พ่ือใชใ นคำสงั่ เครื่องมือดอ็ กเกอรล ูกขาย 5. บอกคำสงั่ ท่ีใชล บอิมเมจทั้งหมดท่ไี มถ ูกใชใ นเคร่ืองด็อกเกอรโ ฮสต 210
การบริหารจัดการอิมเมจและคอนเทนเนอร บทนำ เนื่องจากการทำงานของคอนเทนเนอรใชหลังการอางอิงและสรางจากอิมเมจ และคอนเทนเนอรเปน แหลงรวมการตั้งคาและเก็บบันทึกเฉพาะการเปลี่ยนแปลงจากอิมเมจ ดังนั้น การบริหารจัดการอิมเมจที่ดีจะ ชวยใหผูอานสามารถบริหารจัดการเวอรชันของซอฟตแวรไดอยางสะดวกสบาย นอกจากนี้ ด็อกเกอรยัง สนับสนุนการควบคุมการทำงานและตรวจสอบการทำงานของคอนเทนเนอรใหเปนไปตามที่ผูอานตองการได อยางถูกตองและมีประสทิ ธิภาพ 12.1 การจดั การอมิ เมจหลายเวอรชนั ลักษณะหนึ่งที่สำคัญของอิมเมจคือ อิมเมจหนึ่งอิมเมจประกอบดวยแท็ก (Tag) ตั้งแต 1 แท็กเปนตนไป หากเวลาสรางหรือเรียกใชงานอิมเมจไมระบุชื่อแท็ก ชื่อแท็กเริ่มตนจะเปน latest เสมอ โดยหากอิมเมจมีช่ือ แทก็ ทแ่ี ตกตา งกันจะมีขอมลู ที่บันทึกอยูในชั้นขอมลู แตกตา งกันออกไป การต้งั ชื่อแท็กมปี ระโยชนสำหรับผูดูแล รักษาอิมเมจโดยเฉพาะกรณีที่ซอฟตแวรที่เผยแพรนั้นมีหลายเวอรชัน หรือหลายระบบปฏิบัติการ อิมเมจหนึ่ง อิมเมจอาจมีแท็กหลายแท็กที่ชี้ไปยังอิมเมจที่มีชั้นขอมูลเดียวกัน เชน อิมเมจของ httpd มีแท็ก 2.4.43 แท็ก 2.4 แท็ก 2 และแทก็ latest หมายถงึ อิมเมจท่มี ีช้นั ขอมลู เดยี วกนั แตมวี ิธีการใชงานตางบริบทกัน เชน ในกรณี ที่ผูใชงานตองการเรยี กเฉพาะเวอรชัน 2.4.43 สามารถอางอิงแท็ก 2.4.43 ได แตเม่ือผูพัฒนาปลอยซอฟตแวร เวอรชัน 2.5.1 ผูใ ชง านท่อี างองิ แท็ก 2.4.43 จะไมม กี ารอัพเดทอิมเมจ แตผ ูทอี่ า งอิงแท็ก 2.5 แท็ก 2 และแท็ก latest จะไดรับการอัพเดทซอฟตแวร ดังนั้น ประโยชนของแท็กจะทำใหผูอานสามารถควบคุมขอบเขตของ เวอรช นั ที่ตองการเรียกใชได เมื่อทราบขอบเขตของเวอรชันซอฟตแวรที่ตอ งการเรียกใชงาน ผูอานสามารถดาวนโหลดอิมเมจ httpd ทเี่ ปนเวอรช ัน 2 ท่ลี า สุดเสมอ มาเกบ็ ไวใ นเครอ่ื งได โดยใชคำส่ัง # docker pull httpd:2 แตห ากตองการเวอรช นั ลาสุดเสมอ สามารถใชคำสง่ั # docker pull httpd เมอ่ื แสดงรายการของอิมเมจจะมีคอลัมนระบุช่ือแท็กของอิมเมจ โดยอิมเมจชอ่ื เดียวกันแตมีแท็กตางกัน จะแสดงคนละรายการ ตัวอยางการบริหารจดั การเวอรช ันของอิมเมจฐานขอมูลท่ีเทคโนโลยบี รรจุคอนเทนเนอรชวยใหสามารถ อัพเดทระบบฐานขอมูลไดสะดวกและปลอดภัย คือ ระบบฐานขอมูล Postgresql ที่เชื่อมตอเครือขายผาน โพรโตคอล TCP พอรต 5432 และเก็บขอมูลไวท่ี /root/database เมื่อเริ่มสรางคอนเทนเนอรจากอิมเมจ postgresql:12 ในวันนี้ Postgresql 12 อาจเปนเวอรชัน 12.0 ถัดมาอีก 3 เดือน Postgresql 12.1 ไดถูก ปลอยออกมา แตเนื่องจากเวอรชันหลักยังคงเปน 12 อยู ตัวอิมเมจของด็อกเกอรของผูพัฒนาก็ยังคงเปน postgresql:12 เหมือนเดิม แตเมื่อผูอานลบและสรางคอนเทนเนอรใหม ผูอานจะได Postgresql เวอรชัน 211
12.1 โดยที่ยังคงมีระบบฐานขอมูล และเครือขายที่เชื่อมตอที่โพรโตคอลเดิมพอรดเดิม นับไดวาเปนวิธีการ อัพเดทซอฟตแวรใหมที่มีการบริหารจัดการที่งายมากเพียงเปลี่ยนอิมเมจของซอฟตแวรเวอรชันใหม ใน ขณะเดียวกันวิธีการน้ีมีความเสย่ี งนอยมาก เพราะถาหาก Postgresql 12.1 ยงั ไมเสถียร ผอู านก็สามารถสราง คอนเทนเนอรแตคราวนี้ระบุเวอรชันกอนหนาดวยการระบุในแท็กวา postgresql:12.0 แทน เพียงเทาน้ัน ผูอา นก็สามารถยอ นกลับไปซอฟตแ วรเวอรชนั เดมิ ไดทันที 12.2 การตรวจสอบการทำงานของคอนเทนเนอร เมื่อคอนเทนเนอรถูกสรางคอนเทนเนอรจ ะมีสถานะเปดการทำงาน (Active) อยางไรก็ตาม หากการต้ัง คา จากคำสัง่ docker run ผดิ พลาดไมส อดคลองกับทีผ่ ูพัฒนาอมิ เมจกำหนด คอนเทนเนอรอ าจออกการทำงาน (Exited) ได ในกรณีที่คำสั่งสรางคอนเทนเนอรระบุใหรีสตารท คอนเทนเนอร (พารามิเตอร --restart always) ด็อกเกอรโฮสตจะหยดุ รอเปน ระยะเวลาแบบสุมเพื่อทดลองเปดการทำงานคอนเทนเนอรใ หม (Restarting) อีก ครง้ั โดยระยะเวลาสุมน้จี ะคอย ๆ หา งขึ้นเร่อื ย ๆ อยา งไรกต็ าม ผอู า นสามารถตรวจสอบสถานะการทำงานของ คอนเทนเนอรวายงั ทำงานอยูหรอื ไม ดว ยคำส่ัง # docker ps -a พารามิเตอร -a จะแสดงรายการของคอนเทนเนอรทั้งหมดที่เคยถูกสราง แตยังไมถูกลบออกจากเครื่อง ทำใหผูอานสามารถตรวจสอบสถานะของคอนเทนเนอร แตหากตองการตรวจสอบวาภายในคอนโซลของคอน เทนเนอรน น้ั มีการแสดงผลวาอยา งไร เพือ่ ตรวจสอบการทำงานโดยละเอยี ด และหากคอนเทนเนอรท ำงานไดไม ถูกตองหนาจอคอนซอลอาจแสดงขอผิดพลาดวาทำไมคอนเทนเนอรทำงานผิดพลาด เพื่อความสะดวกแกผูใช การอา งอิงช่ือของคอนเทนเนอรใ นด็อกเกอรจะตองใชข อมูลเพียงอยางใดอยางหนงึ่ คอื รหัสของคอนเทนเนอร หรอื ช่ือของคอนเทนเนอร จากตัวอยางคอนเทนเนอรช ่ือ frosty_tereshkova ผอู า นสามารถใชค ำสัง่ ดังน้ี # docker logs frosty_tereshkova ในกรณีที่คอนเทนเนอรยังคงทำงานอยู และคอนโซลอาจแสดงผลขอความที่ตองการตรวจสอบเพิ่มเติม ผูอ านสามารถเพ่ิมพารามิเตอร -f เพ่อื ใหคำสงั่ ยงั ไมก ลับมาสูเ ชลลแตยังรอผลลพั ธข องคอนโชล เชน # docker logs -f frosty_tereshkova หรือหากคอนเทนเนอรถูกตองการตรวจสอบทำงานไดถูกเปดการทำงานมานาน ผูอานสามารถ ตรวจสอบผลลัพธข องคอนโซลตามชว งระยะเวลาไดด วย 2 พารามเิ ตอร คือ 1) พารามิเตอร --since ใชระบุชวงเวลาที่ตองการแสดงรายการหลังจากเวลานี้ โดยอาจระบุวา 40m หมายถึง รายการที่แสดงตองเกิดขึ้นภายใน 40 นาที หรือ 1h หมายถึง รายการที่แสดงตองเกิดขึ้น ภายใน 1 ชั่วโมงกอนหนา หรือระบุวันที่ในรูปแบบ YYYY-MM-DDTHH:mm:ss เชน 2020-02- 02T15:00:00 หมายถึงรายการท่ีแสดงตองเกิดข้ึนหลังวันท่ี 2 กมุ ภาพนั ธ พ.ศ. 2563 เวลา 15.00น. 212
2) พารามิเตอร --until ใชระบุชวงเวลาที่ตองการแสดงรายการกอนเวลานี้ มีรูปแบบการระบุเวลา เหมือนพารามิเตอร --since แตใชในความหมายตรงขาม เชน 40m หมายถึง รายการที่แสดงตอง เกิดขึ้นนานกวา 40 นาที หากตองการแสดงขอมูลถึงปจจุบันใหระบุ 0m หมายถึง รายการที่แสดง ตองเกิดขึ้นตองนานกวา 0 นาที หรือระบุวันที่ในรูปแบบ YYYY-MM-DDTHH:mm:ss เชน 2020- 02-02T15:00:00 หมายถึงรายการที่แสดงตองเกิดขึ้นกอนวันท่ี 2 กุมภาพันธ พ.ศ. 2563 เวลา 15.00น. พารามิเตอร --since และพารามเิ ตอร --until เปนเพยี งพารามิเตอรเสรมิ สามารถไมร ะบุ ระบุเพยี งหนึ่ง พารามิเตอร หรอื ระบุท้งั สองพารามิเตอรรวมกัน เชน # docker logs --since 1h frosty_tereshkova เมื่อพิมพคำสั่ง ด็อกเกอรโฮสตจะแสดงขอความที่แสดงในคอนโซลของคอนเทนเนอร frosty_ tereshkova ภายใน 1 ชวั่ โมง 12.3 การเขาถึงและการออกคอนโซลของคอนเทนเนอร หลังจากท่ตี รวจสอบการทำงานของคอนเทนเนอร ในบางคร้ัง ผูอานอาจตองการเขาไปในคอนเทนเนอร เพอื่ พิมพคำสง่ั หรือแกไขการตั้งคาบางประการ ด็อกเกอรโ ฮสตมวี ิธีการท่ีทำใหส ามารถเขาถงึ คอนโซลของคอน เทนเนอรได 2 วธิ ี คอื 1) เขาถึงคอนโซลของคอนเทนเนอรโดยตรง วิธีการนี้นิยมใชกับคอนเทนเนอรที่ทำงานอยูเบื้องหลัง และมีเชลลใ หผ ูอ านเขาถงึ ได หรือเมอื่ ตอนสรา งคอนเทนเนอรไดมีการระบเุ ชลลลงไป เชน การสั่งให คอนเทนเนอรข องระบบปฏิบัติการ CentOS 7 เวอรช นั กอนหนา ทำงาน โดยใชค ำส่ัง # docker run -dit centos:7 bash เมื่อพิมพคำสั่ง ด็อกเกอรโฮสตจะสรางคอนเทนเนอรของระบบปฏิบัติการ CentOS เวอรชัน 7 ที่มี เชลล bash ใหผ ูอานพมิ พคำส่ังได ในกรณนี ้ี หากคอนเทนเนอรม ีชื่อวา frosty_tereshkova ผูอาน สามารถเขา ถงึ คอนโซลของคอนเทนเนอรน ไี้ ดดว ยคำสั่ง # docker attach frosty_tereshkova เมอื่ พิมพคำสง่ั จะปรากฏเชลลใหผอู า นสามารถเขาถึงภายในคอนเทนเนอรได วธิ ีการออกคอนโซลของคอนเทนเนอรจากวิธกี ารน้จี ะตองออกดว ยการกดปมุ คยี ลดั CTRL + P + Q เทาน้นั หากกด CTRL + C จะเปนการสง สญั ญา SIGHUP ไปใหค อนเทนเนอรน้ปี ดตวั ลง 2) เขาถึงคอนโซลของคอนเทนเนอรดวยการสรางเชลลใหม วิธีการนี้นยิ มใชกับคอนเทนเนอรที่มีคำส่ัง เร่ิมตนการทำงานเฉพาะ และไมไดสรางเชลลไวใหผูอานเขาถึงได เมื่อพิมพคำสั่ง docker attach กลับขน้ึ ผลลพั ธของการทำงานของซอฟตแวรภ ายใน ไมม ีเชลลใหผอู านสามารถพิมพคำสงั่ ได วิธีการ นี้ผูอานจะสัง่ ใหเ ชลลทำงานเพิม่ อีกโพรเซสหนึ่งในคอนเทนเนอรนั้น ในกรณีนี้ หากคอนเทนเนอรมี 213
ชื่อวา frosty_tereshkova ผูอานสามารถสรางเชลลเพื่อเขาถึงคอนโซลของคอนเทนเนอรนี้ไดดว ย คำสั่ง # docker exec -it frosty_tereshkova bash เมื่อพิมพคำสั่ง ด็อกเกอรโฮสตจะสรางโพรเซสของ Bash shell และผูอานใหเขาถึงเชลลนั้น Bash shell เปนเชลลที่สนับสนุนคำสั่งในการโปรแกรมสมบูรณที่สุด แตไมใชทุกอิมเมจจะมี Bash shell ในกรณที ผี่ ูพฒั นาอมิ เมจไมไ ดติดตงั้ Bash shell มาดว ย ผอู านสามารถใชอกี ทางเลือกหน่ึง คอื # docker exec -it frosty_tereshkova sh เม่อื พมิ พคำสัง่ ดอ็ กเกอรโ ฮสตจ ะสรางโพรเซสของ Bourne shell แทน วิธีการออกคอนโซลของคอนเทนเนอรจากวิธีการนี้จะตองออกดวยการพิมพ exit หรือกด CTRL + C เพื่อปดการทำงานของโพรเซสเชลลท่ีผูอา นสรางขึน้ มาใหม มิเชนน้ัน คอนเทนเนอรจะมี โพรเซสเชลลทส่ี รางขึ้นใหมทำงานคา งไวอ ยเู พมิ่ ทุกครั้งทผ่ี อู านเขา ถึงคอนโซลดว ยวิธีการน้ี การเขาถึงคอนโซลจะมีประโยชนมากในกรณีที่ผูอานตองการตรวจสอบแฟมการตั้งคา หรือคัดลอก แฟมขอมูลจากคอนเทนเนอรออกมาทั้งนี้ หากแฟมขอมูลนั้นไมไดเชื่อมตอกับไดเรกทอรีของด็อกเกอรโฮสต การเขาถึงแฟมขอมูลจากภายนอกคอนเทนเนอรจึงเปนเรื่องยาก ดังนั้น วิธีการที่สะดวกที่สุดคือการคัดลอก แฟมขอมูลนั้นไปยังไดเรกทอรีที่เชื่อมตอกับด็อกเกอรโฮสต อนึ่งการเขาถึงคอนเทนเนอรจะสามารถทำไดก็ ตอ เมอ่ื คอนเทนเนอรอ ยใู นสถานะเปดการทำงานเทานนั้ 12.4 การตรวจสอบประวัติการทำงานของคอนเทนเนอร เมื่ออิมเมจถูกใชในการสรางคอนเทนเนอร ในบางกรณีคอนเทนเนอรอาจทำงานผิดปกติ เชน ออกการ ทำงานเอง หรือรีสตารทคอนเทนเนอรเอง หรืออิมเมจที่ใชมีการอัพเดทแท็กใหม การตรวจสอบรายการของ คอนเทนเนอรและอิมเมจดวยคำสั่ง docker image ls และ docker ps จะแสดงเฉพาะสถานะสุดทายของ อิมเมจหรือคอนเทนเนอรนัน้ อยางไรก็ตาม โปรแกรมด็อกเกอรลูกขายมคี ำสั่งที่สามารถตรวจสอบเหตุการณที่ เกิดขึ้น พรอมทั้งแสดงวันที่ และเวลาที่เกิดเหตุการณนั้น ในกรณีนี้ หากผูอานสรางคอนเทนเนอรมีชื่อวา frosty_tereshkova จากอิมเมจ httpd ผูอ า นสามารถตรวจสอบเหตุการณด ว ยคำสง่ั docker events แตห าก พิมพคำสั่งนี้โดยที่ไมมีพารามิเตอรใด ๆ จะไมปรากฏผลลัพธใด ๆ แตจะเปนการรอการแสดงผล และจะแสดง รายการของเหตุการณก็ตอเมื่อเกิดเหตุการณขึ้นหลังจากที่พิมพคำสั่งเทานั้น ซึ่งโดยปกติผูอานนิยมตรวจสอบ เหตุการณยอ นหลังมากกวาตรวจสอบเหตุการณทกี่ ำลังจะเกิด ดงั นน้ั คำสง่ั นี้ ตองมกี ารระบพุ ารามเิ ตอร ดงั นี้ 1) พารามิเตอร --filter ใชร ะบุเงอื่ นไขการแสดงผล โดยทว่ั ไปนยิ มระบุเงอื่ นไขตามอิมเมจหรือคอนเทน เนอร หากตองการระบุเงื่อนไขการแสดงผลตามอิมเมจ โครงสรางของพารามิเตอรนี้จะเปน --filter image=<ชื่ออิมเมจ> เชน --filter image=httpd แตหากตองการระบุเงื่อนไขการแสดงผลตาม คอนเทนเนอร โครงสรางของพารามิเตอรนี้จะเปน --filter container=<รหัสคอนเทนเนอร> หรือ 214
--filter container=<ชื่อคอนเทนเนอร> ในกรณีที่เปนรหัสคอนเทนเนอรผูอานสามารถพิมพแค บางสวนที่ไมซ้ำกับรหัสคอนเทนเนอรของคอนเทนเนอรอื่นได เชน หากคอนเทนเนอรมีรหัสคอน เทนเนอรเปน 1bba17d1cb3c และมีชื่อวา frosty_tereshkova ตัวอยางการใชพารามิเตอรนี้จะ เปน --filter container=1 หรือ --filter container=1b หรอื --filter container=1bba17d1cb3c หรือ --filter container=frosty_tereshkova อยา งใดอยางหน่งึ 2) พารามิเตอร --since ใชระบุชวงเวลาที่ตองการแสดงรายการหลังจากเวลานี้ โดยอาจระบุวา 40m หมายถึง รายการที่แสดงตองเกิดขึ้นภายใน 40 นาที หรือ 1h หมายถึง รายการที่แสดงตองเกิดขึ้น ภายใน 1 ชั่วโมงกอนหนา หรือระบุวันที่ในรูปแบบ YYYY-MM-DDTHH:mm:ss เชน 2020-02- 02T15:00:00 หมายถงึ รายการท่แี สดงตอ งเกิดขึ้นหลังวันที่ 2 กุมภาพันธ พ.ศ. 2563 เวลา 15.00น. 3) พารามิเตอร --until ใชระบุชวงเวลาที่ตองการแสดงรายการกอนเวลานี้ มีรูปแบบการระบุเวลา เหมือนพารามิเตอร --since แตใชในความหมายตรงขาม เชน 40m หมายถึง รายการที่แสดงตอง เกิดขึ้นนานกวา 40 นาที หากตองการแสดงขอมูลถึงปจจุบันใหระบุ 0m หมายถึง รายการที่แสดง ตองเกิดขึ้นตองนานกวา 0 นาที หรือระบุวันที่ในรูปแบบ YYYY-MM-DDTHH:mm:ss เชน 2020- 02-02T15:00:00 หมายถึงรายการที่แสดงตองเกิดขึ้นกอนวันที่ 2 กุมภาพันธ พ.ศ. 2563 เวลา 15.00น. พารามเิ ตอร --since และพารามเิ ตอร --until เปนเพยี งพารามเิ ตอรเสริม สามารถไมระบุ ระบเุ พยี งหน่ึง พารามิเตอร หรือระบุทั้งสองพารามิเตอรรวมกัน แตพารามิเตอร --filter เปนพารามิเตอรที่จำเปนตองระบุ ยกตัวอยางเชน หากตองการตรวจสอบเหตุการณของคอนเทนเนอรรหัส 1bba17d1cb3c ภายในชวง ระยะเวลา 1 ชัว่ โมง สามารถใชค ำสงั่ # docker events --filter container=1bba17d1cb3c –since=1h --until=0 หากตอ งการตรวจสอบเหตุการณของอิมเมจชือ่ httpd ทีเ่ กิดขึน้ นานกวา 4 ชั่วโมง สามารถใชค ำสั่ง # docker events --filter image=httpd --until=4h ภาพที่ 12.1 แสดงบางสวนของรายการการตรวจสอบเหตุการณของอิมเมจ httpd ที่เกิดขึ้นนานกวา 4 ชว่ั โมง ภาพที่ 12.1 หนา จอผลลัพธคำสั่งแสดงรายการการตวรจสอบเหตกุ ารณข องอิมเมจ 215
12.5 การตรวจสอบทรพั ยากรทคี่ อนเทนเนอรใช เนื่องจากคอนเทนเนอรเปนเสมือนหนึ่งเครื่องคอมพิวเตอรเสมือนอีกเครื่อง แตตางกันที่ไมมี ไฮเปอรไวเซอรจำลองฮารดแวร มขี อ ดคี อื การใชทรพั ยากรของโพรเซสในคอนเทนเนอรจ ะมปี ริมาณท่เี ทียบเทา การสั่งใหโพรเซสทำงานนอกคอนเทนเนอรจึงทำใหผูอานสามารถใชคำสั่งทั่วไปสำหรับตรวจสอบทรัพยากรที่ โพรเซสในคอนเทนเนอรใชไดโดยตรง อยางไรก็ตาม โปรแกรมด็อกเกอรมีเครื่องมือที่สามารถสอบถามการใช ทรัพยากรองครวมของทั้งคอนเทนเนอรนั้นไปยงั ด็อกเกอรโฮสต โดยทรัพยากรหลักที่สามารถตรวจสอบได คือ การใชงานหนวยประมวลผลกลาง (CPU time) หนวยความจำหลักที่ใช (RAM used) และพื้นที่เก็บขอมูลท่ี คอนเทนเนอรใชย กเวน ไดเรกทอรีที่เช่อื มตอกับไดเรกทอรีของด็อกเกอรโ ฮสต การใชงานหนวยประมวลผลกลาง โดยปกติในระบบปฏิบัติการลีนุกซผูอานสามารถใชคำสั่ง ps เพ่ือ ตรวจสอบการใชงานหนวยประมวลผลกลางตามโพรเซสที่ทำงานอยู สำหรับการตรวจสอบเฉพาะในคอนเทน เนอร สามารถใชพารามเิ ตอรเปนรหัสคอนเทนเนอรหรือชื่อคอนเทนเนอรอยา งใดอยางหน่ึง ในกรณีที่เปนรหัส คอนเทนเนอรผูอานสามารถพิมพแคบางสวนที่ไมซ้ำกับรหัสคอนเทนเนอรของคอนเทนเนอรอื่นได เชน หาก คอนเทนเนอรม ชี ือ่ วา frosty_tereshkova การตรวจสอบการใชงานหนว ยประมวลผลกลางสามารถใชค ำส่งั # docker top frosty_tereshkova โดยผลลัพธท แ่ี สดงจะมีทั้งหมด 8 คอลัมน แตล ะคอลมั นมคี วามหมายดงั นี้ 1) UID หมายถึงรหสั ผใู ชท ีเ่ ปนเจาของโพรเซสน้นั เชน หากเปน 0 คือบญั ชผี ูใช เปน ตน 2) PID หมายถงึ รหัสของโพสเซส 3) PPID หมายถงึ รหัสของโพสเซสท่สี รางโพรเซสนีม้ าอีกทหี น่งึ 4) C หมายถงึ เปอรเ ซน็ ของหนวยประมวลผลกลางทีใ่ ช ณ ขณะนั้น 5) STIME หมายถึง เวลาที่เริ่มตนโพรเซสนี้ เชน 9:00 หมายถึงเริ่มตนโพรเซสนี้ตอนเกานาิกา คอลมั นนไี้ มไดร ะบุวนั ที่ 6) TTY หมายถึง หมายเลขหนา จอคอนโซลทก่ี ำลงั ใชง านอยู หากทำงานอยเู บ้ืองหลงั จากแสดงเปน ? 7) TIME หมายถึง เวลาของหนวยประมวลผลกลางที่ถูกใชไป เชน หากโพสเซสนี้ใชเปอรเซ็นตของ หนว ยประมวลผลกลาง 50% เปนเวลา 10 นาที คอลมั น TIME จะแสดงผลเปน 50% x 10 นาที = 5 นาที 8) CMD หมายถึง คำสั่งทสี่ รา งโพสเซส ผูอานสามารถเลือกแสดงบางคอลัมนได เชน หากตองการแสดงเฉพาะคอลัมน UID PIDTIME และ CMD โดยเพิ่มพารามเิ ตอร o และระบุคอลัมนท ตี่ อ งการถดั จากพารามิเตอร ดงั น้ี # docker top frosty_tereshkova o uid,pid,time,cmd 216
เม่ือพมิ พค ำสั่งจะปรากฎผลลัพธดงั ภาพท่ี 12.2 วา มโี พรเซส httpd กำลังทำงานอยู ภาพท่ี 12.2 หนาจอผลลัพธคำสงั่ ตรวจสอบการใชง านหนว ยประมวลผลกลาง สำหรบั การตรวจสอบการใชงานทั้งหนว ยประมวลผลกลางและหนว ยความจำท่ีใชงานอยูในปจจบุ ัน โดย ปกติในระบบปฏิบัติการลีนุกซสามารถใชคำสั่ง free เพื่อตรวจสอบหนวยความจำที่ใชและคงเหลือ แตจะเปน การตรวจสอบของท้งั เครือ่ ง ไมใ ชร ายคอนเทนเนอร สำหรับโปรแกรมดอ็ กเกอรสามารถใชค ำส่ัง # docker stats เมื่อพิมพคำสั่งจะปรากฏหนาจอแสดงขอมูลสถานะการใชทรัพยากรและอัพเดททุก 2 วินาที แตหาก ตองการใหแสดงผลขอมลู ณ เวลานนั้ จากนน้ั กลับมาที่เชลลส ามารถใชค ำสัง่ # docker stats --no-stream จะปรากฏผลลัพธดังภาพที่ 12.3 ที่แสดงขอมูลตอไปนี้ รหัสคอนเทนเนอร (Container ID) ชื่อ คอนเทนเนอร (Name) เปอรเซ็นตที่หนวยประมวลผลกลางใช (CPU %) หนวยความจำหลักที่ใชและที่จำกัด (Mem usage / limit) เปอรเซน็ ตข องหนวยความจำหลักที่ใช (Mem %) ปริมาณการเขียนและอา นดิสก (Net I/O) จำนวนบล็อกของดิสกท่เี ขียนและอาน (Block I/O) รหสั โพรเซสทค่ี วบคุมคอนเทนเนอรน ี้อยู (PIDs) ภาพที่ 12.3 หนา จอผลลพั ธคำส่งั แสดงขอมูลสถานะการใชท รพั ยากรของคอนเทนเนอร สำหรับการตรวจสอบพื้นที่เก็บขอมูลที่คอนเทนเนอรใชยกเวนไดเรกทอรีที่เชื่อมตอกับไดเรกทอรีของ ด็อกเกอรโฮสตนั้น สามารถตรวจสอบไดจากชั้นขอมูลที่คอนเทนเนอรนั้นใชงานอยู เพราะเมื่อสราง คอนเทนเนอรใหม โปรแกรมด็อกเกอรจะสรางชั้นขอมูลของคอนเทนเนอรที่อางอิงอิมเมจและจะเก็บเฉพาะ ขอ มลู ทีแ่ ตกตางไปจากเดิมเทาน้ัน โดยทว่ั ไปชัน้ ขอมูลทสี่ รางข้ึนจะถกู เกบ็ ไวเ ปนไดเรกทอรีหน่ึงบนเคร่ืองของด็ อกเกอรโฮสตซึ่งไดเรกทอรีถูกตั้งชื่อตามรหัสคอนเทนเนอรเต็ม การตรวจสอบสามารถใชพารามิเตอรเปนรหัส คอนเทนเนอรหรือชื่อคอนเทนเนอรอยางใดอยางหนึ่ง ในกรณีที่เปนรหัสคอนเทนเนอรผูอานสามารถพิมพแค บางสวนที่ไมซ้ำกับรหัสคอนเทนเนอรของคอนเทนเนอรอื่นได เชน หากคอนเทนเนอรมีชื่อวา frosty_tereshkova การตรวจสอบรายละเอียดของคอนเทนเนอรส ามารถใชค ำสง่ั # docker inspect frosty_tereshkova 217
เมื่อพิมพคำสั่ง จะปรากฏขอมูลภายในของคอนเทนเนอร frosty_tereshkova ในรูปแบบ JavaScript Object Notation (JSON) ซึ่งประกอบดวยขอมูลที่ยาวมาก ผูอานสามารถตั้งคารูปแบบการแสดงผลดวย พารามเิ ตอร -f โดยพารามิเตอรน จี้ ะสามารถสอบถามแคบางสวนของขอมูล JSON ไดใ นท่ีนผ่ี อู านตองการเพียง ทีอ่ ยูที่ของชนั้ ขอ มูลที่ถกู สรา งใหม จงึ ใชค ำสงั่ # docker inspect frosty_tereshkova -f '{{.GraphDriver.Data.UpperDir}}' เมื่อพิมพคำส่ังเสร็จ จะไดที่อยูของไดเรกทอรที ี่เก็บขอมูลไวเ พิ่มเติม โดยผูอา นสามารถเขา ถึงไดเรกทอรี น้ันไดโ ดยใชค ำสงั่ cd แตวาหากพิมพใ นคอนโซลท่ีไมส ามารถคัดลอกขอความจะเกิดความลำบากเน่ืองจากที่อยู ไดเรกทอรีคอนขา งยาว ผอู านสามารถแกไขปญหาโดยเกบ็ ทอี่ ยูไดเรกทอรีไวในชอ่ื ตัวแปร จากนน้ั ใชค ำสั่ง cd กับชือ่ ตัวแปร ดงั นี้ # upperlayer=$( docker inspect frosty_tereshkova -f '{{.GraphDriver.Data.UpperDir}}' ) # cd $upperlayer เมื่อเขาถึงไดเรกทอรีดังกลาว ผูอานจะสามารถตรวจทุกแฟมขอมูลและทุกไดเรกทอรีที่เกิดการแกไขใน คอนเทนเนอรและเปนเฉพาะรายการแฟมขอมูลที่ตางจากที่มีอยูในอิมเมจเทานั้น การตรวจสอบนี้มีประโยชน เพราะสามารถใชคนหาแฟมขอมูลที่ตองการได และตรวจสอบไดวาคอนเทนเนอรไดสรางความเปลี่ยนแปลง ขอมูลอะไรบา งหลังการทำงาน โดยผูอา นสามารถตรวจสอบพ้ืนทที่ งั้ หมดทใี่ ชงานไดโ ดยใชคำสัง่ # du -sh $upperlayer เมื่อพิมพคำสั่งเสร็จ จะปรากฏผลลัพธดังภาพที่ 12.4 แสดงวาคอนเทนเนอร frosty_tereshkova ใช พื้นท่ีชั้นขอ มลู ที่ไมรวมไดเรกทอรีท่ีเชื่อมตอกับด็อกเกอรโ ฮสตจ ำนวน 4 กโิ ลไบต ภาพท่ี 12.4 หนา จอผลลพั ธคำสง่ั แสดงพ้ืนท่ีท่ีคอนเทนเนอรใชง าน 218
บทสรุป ลักษณะหนึ่งทสี่ ำคญั ของอิมเมจ คอื อิมเมจหน่งึ อมิ เมจประกอบดวยแท็ก (Tag) ต้ังแต 1 แท็กเปนตนไป หากเวลาสรางหรือเรียกใชงานอิมเมจไมระบุชื่อแท็ก ชื่อแท็กเริ่มตนจะเปน latest เสมอ โดยหากอิมเมจมีชื่อ แทก็ ทแ่ี ตกตางกันจะมีขอมลู ท่ีบันทึกอยูในช้ันขอมลู แตกตางกันออกไป การตัง้ ชือ่ แท็กมีประโยชนสำหรับผูดูแล รักษาอิมเมจโดยเฉพาะกรณีที่ซอฟตแวรที่เผยแพรนั้นมีหลายเวอรชัน หรือหลายระบบปฏิบัติการ และชวยให ผูอ า นสามารถควบคุมขอบเขตของเวอรชันทต่ี องการเรยี กใชได เมื่อคอนเทนเนอรถูกสรางคอนเทนเนอรจะมีสถานะเปดการทำงาน เมื่อคอนเทนเนอรทำงานผิดพลาด คอนเทนเนอรอาจออกการทำงานได ในกรณีที่คำสั่งสรางคอนเทนเนอรระบุใหรีสตารทคอนเทนเนอร (พารามิเตอร --restart always) ด็อกเกอรโฮสตจะหยุดรอเปนระยะเวลาแบบสุมเพื่อทดลองเปดการทำงาน คอนเทนเนอรใ หมอ กี ครงั้ การเขาถึงคอนเทนเนอรสามารถทำไดเมื่อคอนเทนเนอรมีสถานะเปดการทำงานเทานั้น ผูอานสามารถ เลือกใชการเขาถึงคอนโซลหรือสรางเชลลใหม แตถาคอนเทนเนอรออกการทำงาน ผูอานสามารถใชการ ตรวจสอบคอนโซลและประวตั ิการทำงานของคอนเทนเนอรเ พ่ือใชวเิ คราะหความผิดพลาดได เนื่องจากคอนเทนเนอรเปนเสมือนหนึ่งเครื่องคอมพิวเตอรเสมือนอีกเครื่อง แตตางกันที่ไมมีไฮเปอรไว เซอรจำลองฮารด แวร มีขอดี คอื การใชทรพั ยากรของโพรเซสในคอนเทนเนอรจะมปี ริมาณท่เี ทยี บเทาการส่ังให โพรเซสทำงานนอกคอนเทนเนอรจึงทำใหผูอานสามารถใชคำสั่งทัว่ ไปสำหรบั ตรวจสอบทรพั ยากรที่โพรเซสใน คอนเทนเนอรใ ชไ ดโดยตรง 219
สรปุ คำสั่งทน่ี า สนใจ คำสง่ั หรอื ชื่อคำส่ังทเี่ ก่ียวของ เน้ือหา # docker pull httpd:2 # docker pull httpd ดาวนโ หลดอิมเมจ # docker logs frosty_tereshkova ตรวจสอบหนา จอคอนโซลของคอนเทนเนอร # docker logs --since 1h frosty_tereshkova ขอ ความท่แี สดงในคอนโซลของคอนเทนเนอร frosty_ # docker attach frosty_tereshkova tereshkova ภายใน 1 ชวั่ โมง # docker exec -it frosty_tereshkova bash เขาถึงคอนโซลของคอนเทนเนอร # docker exec -it frosty_tereshkova sh สรา งเชลลเ พ่อื เขา ถึงคอนโซลของคอนเทนเนอร # docker events --filter container= ตรวจสอบเหตกุ ารณของคอนเทนเนอร frosty_tereshkova --since=1h --until=0 # docker events --filter image=httpd ตรวจสอบการใชง านหนวยประมวลผลกลาง --until=4h ตรวจสอบการใชง านท้ังหนวยประมวลผลกลางและ # docker top frosty_tereshkova หนวยความจำทใ่ี ชงานอยูในปจจุบนั # docker stats ตรวจสอบรายละเอียดของคอนเทนเนอร # docker inspect frosty_tereshkova ที่อยไู ดเรกทอรีเก็บขอมูลของคอนเทนเนอร # docker inspect frosty_tereshkova -f '{{.GraphDriver.Data.UpperDir}}' 220
แบบฝก หัดบทที่ 12 1. อธบิ ายความสมั พนั ธร ะหวา งอิมเมจและแทก็ 2. บอกคำสง่ั ทใ่ี ชแ สดงผลคอนโซลของคอนเทนเนอรชือ่ mycontainer ภายใน 1 ช่วั โมงลา สดุ 3. อธิบายความแตกตา งระหวางคำสัง่ docker attach และ docker exec 4. บอกคำสัง่ ทใี่ ชต รวจสอบเหตุการณท ั้งหมดของอิมเมจ httpd 5. อธิบายวิธกี ารหาชนั้ ขอ มูลของคอนเทนเนอร และพ้ืนทีท่ ีค่ อนเทนเนอรใชง าน 221
222
การปฏิสมั พนั ธร ะหวางคอนเทนเนอร บทนำ แมเทคโนโลยีบรรจุคอนเทนเนอรไมไดจำลองทุกฮารดแวรเหมือนเทคโนโลยีเสมือนจึงไมจำเปนตองมี ไฮเปอรไวเซอรและระบบปฏิบัตกิ ารเปนตวั คั่นกลาง แตเทคโนโลยบี รรจคุ อนเทนเนอร เชน โปรแกรมด็อกเกอร สามารถจำลองเครือขายเสมือน โดยใหคอนเทนเนอรที่ทำงานอยูสามารถเชื่อมตอหากันได และยังสามารถ เชื่อมตอหาบริการหรือการทำงานของระบบที่ไมไดอยูในคอนเทนเนอรได โดยที่บริการเหลานั้นไมสามารถ ทราบไดว า ซอฟตแ วรท กี่ ำลงั เชอ่ื มตออยนู น้ั ถูกปรับใชงานในคอนเทนเนอรอ ยหู รือไม 13.1 หลักการทำงานของเครือขา ยเสมือน เครือขายเสมือนในด็อกเกอรถูกสรางและจัดการไดดว ยการสรา งกฎของไฟรวอลลเพื่อตัดสินใจวาขอ มลู จะถกู สง ไปยังคอนเทนเนอรไหนหรือภายนอกคอนเทนเนอร ดังนนั้ เครอื ขายเสมือนทส่ี รา งข้ึนจะถูกสั่งงานโดย ซอฟตแวรทำใหคอนเทนเนอรไมสามารถไดที่อยูไอพีวงเดียวกันกับที่ด็อกเกอรโฮสตได เวนแตจะสรางกฎของ ไฟรว อลลข้ึนมาเฉพาะ โดยใหอนิ เตอรเฟสเครือขา ยของด็อกเกอรโ ฮสตจ องที่อยไู อพีเพ่ิม และยา ยเสนทางของท่ี อยูไอพีนั้นไปยังที่อยูไอพีของด็อกเกอรในเครือขายเสมือน อยางไรก็ตาม วิธีการดังกลาวไมเปนที่นิยม เพราะ โดยปกติที่อยูไอพีของคอนเทนเนอรจ ะถูกจัดสรรโดยด็อกเกอรโฮสตโดยอัตโนมัตผิ านโพรโตคอล DHCP ทำให แมลบคอนเทนเนอรและสรางคอนเทนเนอรใหมที่มีอิมเมจ การเชื่อมตอที่เก็บขอมูล และพอรตเหมือนเดิมแต ที่อยูไอพีของคอนเทนเนอรนั้นอาจจะไมเหมือนเดิม ดังนั้น การเชื่อมตอเฉพาะบางพอรตกับคอนเทนเนอรจึง เปนที่นิยมมากกวาโดยอาศัยวาคอนเทนเนอรหนึ่งคอนเทนเนอรควรมีบริการที่ทำงานอยูเพียงบริการเดียว เทา นนั้ เครือขายเสมือนในด็อกเกอรทำงานโดยใชไดรเวอร หรือซอฟตแวรเปนตัวขับเคล่ือนลักษณะการทำงาน โดยคาเรมิ่ ตนมีอยู 5 ประเภท คอื 1) บริดจ (Bridge) เปนไดรเวอรเครือขายเริ่มตน หากไมไดระบุตอนสรางเครือขายเสมือน เครือขาย บริดจของดอ็ กเกอรมีไวสำหรบั แอปพลเิ คชันที่ในคอนเทนเนอรเ ดี่ยวสามารถเชอ่ื มตอกนั ได ไดรเวอร น้เี หมาะสมหากตอ งการใหคอนเทนเนอรสามารถเช่ือมตอเคร่ืองภายนอกหรืออนิ เทอรเ น็ต 2) โฮสต (Host) เปนไดรเ วอรเครือขา ยท่ีเชื่อมตอเฉพาะคอนเทนเนอรกับโฮสตเทาน้ัน ทำใหคอนเทน เนอรไ มส ามารถเช่ือมตอกับเครื่องภายนอก หรืออนิ เทอรเนต็ ไดโ ดยตรง หากตอ งการเชอื่ มตอเคร่ือง ภายนอก หรืออินเทอรเน็ต คอนเทนเนอรที่มีอินเตอรเฟสเครือขายท่ใี ชไดรเวอรนจ้ี ะไดเชื่อมตอผาน คอนเทนเนอรอ ืน่ ท่ีมไี ดรเวอรอินเตอรเ ฟสเครือขายเปนบริดจ 3) โอเวอรเลย (Overlay) เปนไดรเวอรที่เช่ือมเครื่องคอมพิวเตอรทีต่ ิดต้ังด็อกเกอรโ ฮสตหลายเครื่อง เขาดวยกัน ทำใหในการเชื่อมตอผานไดรเวอรนี้ ด็อกเกอรโฮสตในคอมพิวเตอรทุกเครื่องทำงาน เสมือนหนึ่งเปนเครื่องเดียวกัน ดังนั้น คอนเทนเนอรที่ทำงานอยูบนตางด็อกเกอรโฮสตจะสามารถ เชอ่ื มตอกันไดเ สมอื นหนึ่งวาคอนเทนเนอรน้นั ทำงานอยบู นเคร่ืองด็อกเกอรโ ฮสตเดยี วกัน ไดรเวอรน้ี 223
จะถูกสรางโดยอัตโนมัติเพื่อด็อกเกอรโฮสตหลายเครื่องสรางด็อกเกอรสวอรม (Docker Swarm) (Docker Inc. 2020c) รวมกันเทาน้นั 4) แมควีแลน (Macvlan) เปนไดรเวอรที่อนุญาตใหระบุท่ีอยูทางกายภาพของอินเตอรเฟสเครือขาย (MAC address) ใหกับอินเตอรเฟสเครือขายของคอนเทนเนอรได ทำใหคอนเทนเนอรใชที่อยูไอพี เดียววงเดียวกันกับด็อกเกอรโฮสตได ดวยการสรางเครือขายบริดจ (Bridge network) กับ อินเตอรเฟสเครือขายของด็อกเกอรโฮสต แตการสงขามขอมูลระหวางเครื่องภายนอกกับคอนเทน เนอรทั้งหมดที่ใชไดรเวอรนีจ้ ะเชือ่ มตอกันดวยที่อยูทางกายภาพของอินเตอรเฟสเครือขายของด็อก เกอรโฮสตเดียวกัน ดังนั้น อุปกรณเครือขายหรือสวิตซจำเปนตองสนับสนุนการทำงานแบบ Promiscuous mode ดว ย 5) ไมมี (None) เปนการระบุวายกเลิกการทำงานของไดรเวอรเครือขายเพื่อไมใหคอนเทนเนอรนั้น สามารถเชอื่ มตอ กับคอนเทนเนอรอ นื่ ได แมจ ะมไี ดรเวอรหลายรูปแบบในด็อกเกอรใหเลือกใช อยา งไรกต็ าม ไดรเ วอรทีน่ ิยมถูกใชงานและเหมาะ ในสถานการณสวนใหญคือการใชไดรเวอรบริดจ เพราะด็อกเกอรจะสรางเครือขายอีกวงหนึ่งขึ้นมาให คอนเทนเนอรไดปฏิสัมพันธกันโดยขอมูลสามารถวิ่งผานด็อกเกอรโฮสตไปยังเครือขายภายนอกทันที และ เครื่องคอมพิวเตอรภายนอกสามารถเชื่อมตอผานพอรตของด็อกเกอรโฮสต โดยที่ประสิทธิภาพของเครือขาย แบบบริดจมีประสิทธิภาพใกลเคียงกับการเชื่อมตอกับแอปพลิเคชันที่ทำงานโดยไมไดผานด็อกเกอรโฮสต (Zeng et al. 2017) 13.2 คำส่ังท่ใี ชสรา งเครอื ขา ยเสมือน โปรแกรมดอ็ กเกอรล ูกขายสามารถสอบถามรายการเครอื ขายเสมือนจากด็อกเกอรโ ฮสตไดดว ยคำสง่ั # docker network ls เมื่อพิมพคำสั่งจะแสดงผลลัพธ ดังภาพที่ 13.1 แสดงรายการของเครือขายเสมือน พรอมคุณสมบัติ รหัสเครือขาย ชื่อเครือขาย ไดรเวอรที่ใช และขอบเขต โดยคาตั้งตนขอบหากด็อกเกอรโฮสตไมไดเขารวม ด็อกเกอรสวอรมจะมีเครือขายเสมือนมาท่ีตดิ ตั้งมาพรอ มกัน 3 เครือขาย คือ เครือขายชื่อ bridge ใชไดรเวอร บริดจ เครอื ขา ยช่ือ host ใชไ ดรเ วอรโฮสต และเครือขา ย none ไมม ไี ดรเวอร สวนรหัสของเครือขายน้ันจะถูก สรางโดยสุม เมื่อตอนตดิ ตงั้ แตล ะเครอื่ งจะมรี หสั เครือขายทไี่ มเ หมือนกนั ภาพที่ 13.1 หนา จอผลลัพธคำสง่ั แสดงรายการเครือขายเสมือน 224
นอกจากน้ีผูอานยังสามารถตรวจสอบอินเตอรเฟสเสมือนที่ถูกสรางขึ้นจากด็อกเกอรโฮสตโดยอัตโนมัติ ดวยคำส่ัง # ip link เมื่อพมิ พค ำสงั่ โปรแกรม ip จะแสดงรายการของการเชอ่ื มตอท่ีมอี ยูในเครื่องคอมพิวเตอร โดยเครือขาย ที่ด็อกเกอรโฮสตสรางขึ้นมานั้นจะเปนเครือขาย docker0 แตเมื่อสรางเครือขายเสมือนขึ้นตามมาในภายหลัง ชื่อของเครือขายที่ใชในระบบปฏิบัติการลีนุกซจะเปน br-<รหัสเครืองขาย> เชน หากเครือขายที่สรางใหมมี รหสั เครอื ขา ยเปน 3f03e2826368 ชือ่ ของเครอื ขายจะเปน br-3f03e2826368 ทุกครั้งที่สรางคอนเทนเนอรโดยที่ไมระบุเครือขาย คอนเทนเนอรที่สรางจะมีเครือขายอัตโนมัติอยูท่ี เครือขาย bridge แมจะทำใหเกิดความสะดวกสบาย คอนเทนเนอรสามารถเชื่อมตอระหวางกันไดทันที และ คอนเทนเนอรสามารถเชื่อมตอกับอินเทอรเ น็ตไดทันที แตหากตองมีการปรับใชค อนเทนเนอรมากกวา 1 คอน เทนเนอร และคอนเทนเนอรเหลานั้นมีการเช่ือมตอกันอยางมีขอบเขต เชน คอนเทนเนอร ก. สามารถเช่ือมตอ กับคอนเทนเนอร ข. และคอนเทนเนอร ค. สามารถเชื่อมตอกับคอนเทนเนอร ง. แตวาคอนเทนเนอร ก. ไม สามารถเชื่อมตอกับคอนเทนเนอร ค. ได ทั้งนี้ เพื่อทำใหการบริหารจัดการเครือขายเสมือนมีความมั่นคง ปลอดภัย ผูอานจึงควรสรางเครือขายเสมือนประเภทบริดจขึ้นมาเอง เชน หากตองการสรางเครือขายเสมือน ประเภทบรดิ จชื่อ alpine-net สามารถใชคำส่ัง # docker network create --driver bridge alpine-net แตเนอื่ งจากหรอื ไดรเ วอรบรดิ จเปน คาเริ่มตน ผูอา นสามารถใชค ำสั่ง # docker network create alpine-net แทนไดเชนกัน เมื่อพิมพคำสั่ง ด็อกเกอรโฮสตจะคนหาชวงของที่อยูไ อพีที่ถกู จดั วาเปนเครือขายสว นตวั และจะไมซ้ำกับที่อยูไอพีสาธารณะ และจัดสรรที่อยูไอพีใหโดยอัตโนมัติ โดยหากตรวจสอบดวยคำสั่ง docker network ls จะแสดงผลลัพธด งั ภาพที่ 13.2 ภาพที่ 13.2 หนาจอผลลัพธคำสัง่ แสดงรายการเครอื ขายเสมือนทส่ี รา งขึน้ ใหม แมการสรางเครือขา ยแบบโดยท่ีไมกำหนดชวงของซบั เน็ตจะเปน ที่นิยม หากตอ งการระบซุ ับเน็ตหรือชวง ของที่อยูไอพสี ำหรับเครือขาย สามารถใชพารามิเตอร --subnet --ip-range และ --gateway เพอ่ื ระบุชวงของ 225
ที่อยไู อพขี องซับเนต็ ชวงของท่อี ยูไ อพีที่ไวจดั สรรผา นโพรโตคอล DHCP และที่อยไู อพีของเกตเวยหรือของด็อก เกอรโฮสตตามลำดบั เชน # 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 เมื่อพิมพคำสั่ง ด็อกเกอรโฮสตจะสรางเครือขาย alpine-custom-net และเมื่อตรวจสอบรายการ เครือขายเสมอื น จะปรากฏผลลัพธ ดงั ภาพท่ี 13.3 ภาพท่ี 13.3 หนา จอผลลพั ธคำส่ังแสดงรายการเครือขายเสมือนท่ีสรางขึ้นใหม หนึ่งในสาเหตุของการสรางเครือขายเสมือนที่ใหระบุซับเน็ต และชวงของที่อยูไอพีแยกออกจากกัน เพราะวาผูอานสามารถสรางเครือขายที่มีซับเน็ตกวางกวาชวงของที่อยูไอพีได เพราะเมื่อสรางคอนเทนเนอรท่ี เชื่อมตอกับเครือขายเสมือนนี้ คอนเทนเนอรจะมีไอพีที่จัดสรรโดยชวงของที่อยูไอพีที่ระบุเทานั้น แตผูอาน สามารถกำหนดท่ีอยไู อพคี งท่ีใหกบั คอนเทนเนอรใ นชว งทไ่ี มไดอยชู วงของท่ีอยไู อพีทีร่ ะบุ เชน # docker network create --driver bridge --subnet 192.168.101.0/24 --ip-range 192.168.101.208/28 --gateway 192.168.101.1 alpine-custom-net2 เปนคำสั่งสรางเครือขายเสมือนชื่อ alpine-custom-net2 ที่มีซับเน็ตเปน 192.168.101.0/24 หมายความวา ชวงของที่อยูไอพีที่ถูกตองของคอนเทนเนอรในเครือขายนี้สามารถเปน 192.168.101.1 ถึง 192.168.101.254 แตการระบุชวงของที่อยูไอพีในพารามิเตอร 192.168.101.208/28 หมายความวา หาก ผูอานสรางคอนเทนเนอรในเครือขายนี้โดยไมกำหนดที่อยูไอพีคงที่ ด็อกเกอรโฮสตจะกำหนดที่อยูไอพีใหอยู ในชวง 192.168.101.208/28 ซึ่งกค็ อื ตง้ั แต 192.168.101.208 ถงึ 192.168.101.223 เทานน้ั ประโยชนของการกำหนดซับเน็ตใหกวางกวาชวงของไอพีจะทำใหผูอานมีชวงของไอพีที่สามารถ กำหนดใหเปนที่อยูไอพีคงที่ได โดยที่ที่อยูไอพีคงที่นั้นจะไมถูกจัดสรรไปใหคอนเทนเนอรอื่นผานโพรโตคอล DHCP ในระหวางที่คอนเทนเนอรท ีก่ ำหนดที่อยูไ อพีคงท่ีนน้ั หยดุ การทำงานไปชว งหนึ่ง 13.3 การตรวจสอบสถานะของเครือขายเสมอื นของระบบ เมื่อสรางเครือขายเสมือน เครือขายเสมือนจะอยูในสถานะเปดการทำงานตลอดเวลา อยางไรก็ตาม มี ขอมูลหลายประการที่ด็อกเกอรโ ฮสตสรางขึ้นใหอตั โนมัติ ผูอานสามารถตรวจสอบสถานะของเครอื ขายไดจาก 226
รหัสเครือขายหรือชื่อของเครือขาย ในกรณีที่เปนรหัสเครือขายผูอานสามารถพิมพแคบางสวนที่ไมซ้ำกับ เครือขายอื่นได แตหากเปนชือ่ เครือขายจะตองพิมพชือ่ เต็มของเครือขายเชน หากตองการตรวจสอบเครือขาย alpine-net ที่มีรหสั เครอื ขา ยเปน 3f03e2826368 สามารถพมิ พค ำสัง่ # docker network inspect alpine-net เนื่องจากคำสั่ง inspect ของด็อกเกอรนั้น แมจะสงผลลัพธกับมาใหผูอานเห็นในรูปแบบ JSON แต โครงสรางของการประมวลผลเปนแมแบบภาษา Go ทั้งนี้เพราะโปรแกรมด็อกเกอรถูกเขียนขึ้นมาดวยภาษา Go ดังนั้น ผูอานจึงควรติดตั้งโปรแกรม jq ซึ่งเปนโปรแกรมตัวประมวลผลแฟม JSON (JSON Parser) เพื่อให การแสดงผลสวยงามและเขา ใจงาย ดว ยคำสัง่ # yum install jq ผูอานสามารถใชพารามิเตอร -f เพื่อจัดรูปแบบการแสดงผลของคำสั่งในด็อกเกอรได เชน คำสั่งที่ เกยี่ วของกับเครือขา ย alpine-net ดังน้ี 1) ซับเนต็ ของเครอื ขายและเกตเวยของเครอื ขา ย alpine-net ใชค ำสั่ง # docker network inspect alpine-net -f \"{{json .IPAM.Config}}\" | jq 2) คอนเทนเนอรท ่ถี กู สรางในเครอื ขา ยและท่ีอยูไอพีทไี่ ดร บั ใชค ำส่งั # docker network inspect alpine-net -f \"{{json .Containers}}\" | jq คำสั่งนี้จะแสดงผลลัพธก็ตอเมื่อมีคอนเทนเนอรที่กำลังเปดการทำงานอยู หากไมมีคอนเทนเนอรที่เปด การทำงานในเครือขายนี้ คำสั่งนจี้ ะไมแสดงผลลพั ธ 13.4 การสรา งคอนเทนเนอรพรอ มเครือขายเสมือน คอนเทนเนอรเมื่อถูกสรางขึ้นมาจะตองอยูในเครือขายใดเครือขายหนึ่งหากไมตองการใหคอนเทนเนอร น้ันสามารถเชื่อมตอกบั คอนเทนเนอรอนื่ ได คอนเทนเนอรน ้ันจะตองอยูในเครือขาย none เพราะไมมีไดรเวอร เครือขาย อยางไรก็ตาม เมื่อสรางคอนเทนเนอรโดยไมระบุเครือขาย คอนเทนเนอรนั้นจะอยูในเครือขาย bridge เสมอ และท่อี ยไู อพจี ะไดรับการจัดสรรผานโพรโตคอล DHCP ท่ที ำงานอยใู นดอ็ กเกอรโ ฮสต เพื่อใหด็อกเกอรไดสรางเครือขายใหกับคอนเทนเนอร และสามารถสอบถามดูสถานะของเครือขาย เสมือนคอนเทนเนอร ผูอานจะทดลองสรางคอนเทนเนอรขึ้นมาจำนวน 2 คอนเทนเนอร โดยใชอิมเมจของ Alpine Linux ซึ่งเปนอิมเมจของลีนุกซที่มีขนาดเล็กที่สุด และกำหนดใหทั้งคูอยูในเครือขาย alpine-net ใน กรณที ีต่ อ งการระบุชอื่ ของคอนเทนเนอร ผูอานสามารถใชพารามเิ ตอร --name เพื่อระบุช่อื คอนเทนเนอรได # docker run -dit --name alpine1 --network alpine-net alpine sh 227
จากคำสั่งดานบน จากคำสั่งดานบนจะเปนการคอนเทนเนอร alpine1 ถูกสรางจากอิมเมจ alpine ให ทำงานอยูเบื้องหลังบนเครือขายเสมือน alpine-net แตที่อยูไอพีที่คอนเทนเนอร alpine1 ไดรับนั้นจะไดรับ การจัดสรรอัตโนมัติผานโพรโตคอล DHCP โดยมีด็อกเกอรโฮสตเปนตัวบริหารจัดการที่อยูไอพี แตการสราง คอนเทนเนอรดวยวิธีนี้ หากผูอานหยุดการทำงานคอนเทนเนอรไป คอนเทนเนอรนี้จะปลอยที่อยูไอพีที่ไดรับ จัดสรรมาทำมาด็อกเกอรโฮสตมีที่อยูไอพีเหลือเพิ่มขึ้นสำหรบั จัดสรรใหกับคอนเทนเนอรอื่นในอนาคต ขอเสีย คือ เม่อื เรม่ิ ตนเปดการทำงานคอนเทนเนอรน ี้ใหมอีกคร้ัง ทีอ่ ยไู อพีของคอนเทนเนอรนี้จะเปลี่ยนแปลงไปทำให หากคอนเทนเนอรสองคอนเทนเนอรเชื่อมตอกันดวยที่อยูไอพี ทำใหถาคอนเทนเนอรทั้งสองคอนเทนเนอร เชื่อมตอกันโดยอางอิงท่ีอยูไอพีอาจทำใหเ กิดปญหาเวลาปรับใชงานในสภาพการใชงานจรงิ ได เพราะเครือขาย เสมือนที่ชื่อเดียวกนั ในด็อกเกอรโฮสตสองเครื่องอาจมีที่อยูไอพีคนละวงก็ได วิธีการที่แนะนำคือ ใหตั้งชื่อคอน เทนเนอรดวยพารามิเตอร --name เมื่อตอนสรางคอนเทนเนอร เมื่อสรางคอนเทนเนอรในเครือขายใด ด็อก เกอรโ ฮสตมรี ะบบ DNS โดยสรางชอื่ เครอ่ื งจากชอื่ คอนเทเนอรและเช่ือมโยงกบั ทีอ่ ยูไอพี เวลาเชือ่ มตอคอนเทน เนอรส องคอนเทนเนอรจ ะสามารถใชช่ือของคอนเทนเนอรเ พ่ืออางองิ ได อยางไรก็ตาม คอนเทนเนอรทั้งคูอาจจะไมสามารถเชื่อมกันไดอีก หากมีคอนเทนเนอรใดคอนเทนเนอร หนึ่งหยุดการทำงานและเปดการทำงานใหม ดังนั้น ผูอานสามารถสรางคอนเทนเนอรโดยตั้งคาที่อยูไอพีคงท่ี ใหกับคอนเทนเนอรนั้น โดยเงื่อนไขการกำหนดที่อยูไอพีนั้นจะตองเปนที่อยูไอพีที่ถูกตองและอยูในชวง เครือขายและซับเน็ตดวย และเครือขายที่จะสามารถระบุที่อยูไอพีไดนั้น ตองถูกสรางดวยคำสั่งที่ระบุซับเน็ต ชวงของไอพี และเกตเวยเอง เชน ผูอานสามารถระบุที่อยูไอพีคงที่ในเครือขาย alpine-customer-net ได แต จะไมสามารถระบุที่อยูไอพีคงที่ใหกับเครือขาย alpine-net ที่ด็อกเกอรโฮสตเปนตัวดำเนินการจัดหาซับเน็ต ชว งของทอี่ ยูไอพี และเกยเวยโดยอัตโนมัติ สำหรับเครือขาย alpine-customer-net มีซับเน็ตเปน 192.168.100.0/24 หมายความวา ชวงของท่ี อยูไอพีที่สามารถระบุไดคือ 192.168.100.1 ถึง 192.168.100.254 อยางไรก็ตาม หากผูอานระบุที่อยูไอพีผดิ ไป เชน ระบุเปน 192.168.120.10 ดังคำสงั่ ตอ ไปน้ี # docker run -dit --name alpine2 --network alpine-custom-net --ip 192.168.120.10 alpine sh # docker ps -a ด็อกเกอรโฮสตสรางคอนเทนเนอรนั้นได แตจะแสดงขอความผิดพลาดไมสามารถเปดการทำงานคอน เทนเนอรได ดังภาพที่ 13.4 เพราะที่อยูไ อพีไมถูกตอ ง ดัง วิธีการแกไ ขที่เหมาะสมคอื การลบคอนเทนเนอรน ้นั และสรางใหมโ ดยระบชุ วงของท่อี ยูไอพีที่ถูกตอง ภาพท่ี 13.4 หนา จอผลลพั ธขอ ผิดพลาดของคำสง่ั สรางคอนเทนเนอร 228
ลำดับถัดไป ผูอานจะลบคอนเทนเนอร alpine2 ออกไป และใชคำสั่งสรางคอนเทนเนอร alpine2 จาก อิมเมจ alpine ที่ทำงานอยูเบื้องหลังและเชื่อมตอกับเครือขาย alpine-custom-net มีที่อยูไอพีคงที่เปน 192.168.100.10 ซงึ่ เปน ทอ่ี ยไู อพที ีถ่ กู ตอง # docker rm alpine2 # docker run -dit --name alpine2 --network alpine-custom-net --ip 192.168.100.10 alpine sh ภาพที่ 13.5 หนา จอผลลัพธคำสงั่ สรางคอนเทนเนอร เมื่อพิมพคำสั่ง จะปรากฏผลลัพธดังภาพที่ 13.5 วาสามารถสรางคอนเทนเนอรและเปดการทำงานได ตามปกติ อยางไรก็ตาม แมจะระบุซับเน็ต ชวงของที่อยูไอพี และเกตเวยใหกับเครอื ขาย alpine-custom-net แตการสรางคอนเทนเนอรในเครือขายนี้ไมจำเปนตองกำหนดที่อยูไอพีคงที่เสมอไป เพราะด็อกเกอรโฮสต สามารถจดั สรรท่ีอยไู อพที ีว่ าง ณ ขณะนั้นใหกับคอนเทนเนอรไ ด เชน # docker run -dit --name alpine3 --network alpine-custom-net2 alpine sh เปนคำสั่งสรางคอนเทนเนอร alpine3 จากอิมเมจ alpine ที่ทำงานเบื้องหลังและเชื่อมตอกับเครือขาย alpine-custom-net2 ที่มชี วงของท่อี ยูไอพเี ปน 192.168.101.208 ถงึ 192.168.101.223 โดยดอ็ กเกอรโฮสต จะหาที่อยไู อพีท่ยี งั ไมไ ดจดั สรรตามชว งทกี่ ำหนดใหโ ดยอตั โนมตั ิ 13.5 การตรวจสอบสถานะของเครือขายเสมอื นของคอนเทนเนอร หากมคี อนเทนเนอรช่ือ alpine1 และ alpine2 หากตองการตรวจสอบคุณสมบตั ิเครือขา ยของคอนเทน เนอรท ีละคอนเทนเนอร เชน ตรวจสอบคอนเทนเนอร alpine1 สามารถใชคำสั่ง # docker inspect -f '{{json .NetworkSettings.Networks}}' alpine1 | jq แตหากตอ งการตรวจสอบทงั้ สองคอนเทนเนอรจ ากมุมมองของเครอื ขาย alpine-net โดยใชคำสัง่ # docker network inspect alpine-net -f \"{{json .Containers}}\" | jq จะปรากฏรายการแสดงตามรหัสคอนเทนเนอรท่ีมขี อมลู ชื่อคอนเทนเนอรพรอมทั้งที่อยูไอพีและเกตเวย ของคอนเทนเนอรนน้ั 229
13.6 การเชอื่ มตอคอนเนอรก บั เครือขายเสมอื น เงื่อนไขหนึ่งของการสรางและเปดการทำงานของคอนเทนเนอรคือคอนเทนเนอรจะตองเชื่อมตอ เครือขายอยางนอย 1 เครื่องขาย ในกรณีที่ตองการใหคอนเทนเนอรสามารถเชื่อมตอเครือขายมากกวา 1 เครอื ขาย หรือตองการยายเครือขายจากเครอื ขายหนึง่ เปนอีกเครือขายหนึ่ง ผูอ านสามารถเชอ่ื มตอเครือขายอื่น ใหกับคอนเทนเนอร เชน คอนเทนเนอร alpine1 ถูกสรางและกำหนดใหเชื่อมตอเครือขาย alpine-net อยู แลว หากตองการใหเชื่อมตอเครือขาย alpine-custom-net อีกหนึ่งเครือขายเพิม่ ขึ้นมาและยังคงเชื่อมตออยู เครือขาย alpine-net อยเู หมอื นเดิม สามารถใชค ำสั่ง # docker network connect alpine-custom-net alpine1 การบริหารจัดการ DNS เพื่อใหคอนเทนเนอรสามารถเชื่อมตอกันผา นชื่อของคอนเทนเนอรแทนท่ีอยูไอ พีไดนั้นถูกทำโดยอัตโนมัติผานด็อกเกอรโฮสต ในบางกรณี คอนเทนเนอรหนึ่งสามารถมีไดหลายชื่อแตกตาง ตามเครือขา ยทเ่ี ชื่อมตอ เชน คอนเทนเนอร alpine1 เดมิ มีช่ือวา alpine1 ในเครอื ขา ย alpine-net และชื่อวา alpine1 ในเครือขาย alpine-custom-net หากตองการใหคอนเทนเนอรนี้มีชื่อเพิ่มเติมวา a1 ในเครือขาย alpine-net และ ac1 ในเครอื่ งขาย alpine-custom-net สามารถดำเนินการไดโ ดยใหคอนเทนเนอร alpine1 ทยอยยกเลกิ การเช่อื มตอ คอนเทนเนอรกับเครอื ขายเสมือนกอน ดวยคำสั่งในหวั ขอ ถัดไป เมื่อยกเลิกการเชื่อมตอจาก alpine-net หรือยังไมไดเชื่อมตอกับเครือขาย alpine-net สามารถพิมพ คำส่งั # docker network connect --alias a1 alpine-net alpine1 เมื่อยกเลิกการเชื่อมตอจาก alpine-custom-net หรือยังไมไดเชื่อมตอกับเครือขาย alpine-custom- net สามารถพิมพค ำส่ัง # docker network connect --alias ac1 alpine-custom-net alpine1 เมอื่ พิมพครบทง้ั สองคำสง่ั DNS ของด็อกเกอรโ ฮสตจ ะเก็บขอมลู ชื่อโฮสต alpine1 และ a1 ในเครือขาย alpine-net และชอ่ื โฮต alpine1 และ ac1 ในเครอื ขา ย alpine-custom-net ใหชีไ้ ปยงั ทอี่ ยูไอพขี องคอนเทน เนอร alpine1 โดยอัตโนมัติ นอกจากการต้งั ช่อื โฮสต ผูอานยงั สามารถเปลยี่ นทอ่ี ยูไ อพที ่ีกำหนดทอี่ ยูไอพใี หคงที่ เชน หากตอ งการทำ หนดที่อยูไอพีของคอนเทนเนอร alpine1 ในเครือขาย alpine-custom-net เปน 192.168.100.20 โดย ยกเลิกการเชอื่ มตอจาก alpine-custom-net กอนหากมีการเชื่อมตออยกู อ นหนา และสามารถใชคำส่ัง # docker network connect --ip 192.168.100.20 alpine-custom-net alpine1 ขอควรระวังคือ การตั้งคาดวยคำสั่ง docker network connect ในแตละครั้งจะเปนการตั้งคาทับการ ตั้งคาเดิมสงผลใหการตั้งคาเดิมหายไป จากตัวอยางของคอนเทนเนอร alpine1 ที่เชื่อมตอเครือขาย alpine- custom-net เมือ่ พมิ พคำสั่งตง้ั ชื่อโฮสตเพ่ิม การต้ังคาท่ีอยูไอพีคงที่จะหายไป และเม่ือพิมพคำสั่งตั้งคาที่อยูไอ 230
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