‫ข้อกำหนดสำหรับการบรรยายนี้คือ คุณต้องรู้วิธีเริ่มคอนเทนเนอร์จากการบรรยายครั้งก่อน
‫เราเพิ่งจบการบรรยายครั้งล่าสุดที่พูดถึงการดูสิ่งที่เกิดขึ้นในภาชนะจากภายนอก
‫ทั้งหมดนี้คือการเข้าไปในภาชนะเพื่อเข้าไปยุ่งกับข้างใน มีคำสั่งบางอย่างที่เราสามารถใช้ได้
‫อันแรกคือคอนเทนเนอร์ที่รันด้วย -it
‫เราจะพูดถึงวิธีการ -มันทำงานอย่างไรเพื่อให้ได้เชลล์ในคอนเทนเนอร์จริงๆ
‫จากนั้นสำหรับการเรียกใช้คอนเทนเนอร์ที่คุณต้องการเรียกใช้กระบวนการที่สอง คุณยังสามารถใช้คอนเทนเนอร์
‫exec และเราจะแสดงตัวอย่างต่างๆ ของสิ่งนั้น
‫ระหว่างทางเราจะพูดถึงความแตกต่างเล็กน้อยระหว่างการกระจาย Linux ปกติ เช่น Ubuntu
‫สำหรับการติดตั้งบนเครื่องเสมือนหรือบนฮาร์ดแวร์
‫แล้วสิ่งที่ลีนุกซ์ distros เหล่านั้นอยู่ภายในคอนเทนเนอร์เป็นอย่างไร
‫มาเริ่มกันเลย.
‫การมองเข้าไปในภาชนะจากภายนอกนั้นมีประโยชน์มากในบางครั้ง
‫แต่คำถามแรกๆ ที่ผู้คนมักถามฉันคือ ฉันจะเข้าไปในคอนเทนเนอร์ได้อย่างไร และทำสิ่งต่าง
‫ๆ ในคอนเทนเนอร์สดจากบรรทัดคำสั่งได้อย่างไร
‫บางครั้งผู้คนสับสนว่าต้องการเซิร์ฟเวอร์ SSH ภายในคอนเทนเนอร์ของตนเพื่อให้สามารถ ssh
‫เข้าไปได้
‫แต่เราไม่จำเป็นต้องทำอย่างนั้นจริง ๆ เพราะเรามีคำสั่งหลายคำสั่งให้เราใช้ ซึ่งช่วยให้เราได้รับเชลล์ภายในคอนเทนเนอร์ขณะทำงาน
‫อันแรกเป็นเพียงคำสั่งรันคอนเทนเนอร์นักเทียบท่า
‫แต่เราจะระบุตัวเลือกพิเศษบางอย่าง
‫เรากำลังจะทำ -it
‫อันที่จริง -it เป็นสองตัวเลือกที่แยกจากกัน
‫ถ้าฉันแสดงความช่วยเหลืออย่างรวดเร็ว คุณจะเห็นว่า t ให้ tty หลอกหรือพรอมต์ที่คล้ายกับสิ่งที่คุณจะมีผ่าน
‫ssh
‫แล้วถ้าเราเลื่อนขึ้นไปที่ i นั่นคือสิ่งที่ทำให้เราสามารถเปิดเซสชั่นนั้นไว้ได้
‫เพื่อให้เราสามารถรันคำสั่งต่างๆ ได้มากขึ้น
‫ถ้าเราทำ docker container ให้รัน -it แล้วรัน nginx อื่น เรียกมันว่าพร็อกซี่
‫จากนั้นเราจะต้องระบุคำสั่งสำรอง
‫ถ้าคุณจำได้ว่าตอนต้นของส่วนนี้ที่เราพูดถึงรูปแบบของบรรทัดคำสั่งนักเทียบท่า เมื่อคุณทำการรันคอนเทนเนอร์ของนักเทียบท่า
‫ดังที่คุณเห็นผ่านความช่วยเหลือ ในตอนท้าย หลังจากรูปภาพ คุณมี คำสั่งและอาร์กิวเมนต์ที่เป็นตัวเลือกที่คุณสามารถส่งไปยังคอนเทนเนอร์ใหม่นี้ซึ่งคุณกำลังจะเริ่มต้นเพื่อบอกว่าจะรันอะไร
‫รูปภาพมีคำสั่งเริ่มต้นอยู่ในนั้นซึ่งเราจะดูวิธีกำหนดค่าในภายหลัง
‫แต่ถ้าคุณต้องการเปลี่ยนสิ่งที่เรียกใช้เมื่อเริ่มต้น คุณสามารถทำได้จากรันไลน์โดยตรง
‫เอาเป็นว่า Bash เนื่องจาก Bash เป็นหนึ่งในเชลล์ทั่วไปที่คุณมักจะพบในคอนเทนเนอร์ที่จะให้เชลล์ทำงานด้วย
‫ดูนั่นสิ ฉันกำลังรีบ
‫คุณจะสังเกตเห็นข้อความแจ้งของฉันว่า root ซึ่งเป็นผู้ใช้ที่คอนเทนเนอร์เริ่มต้น ไม่ได้หมายความว่าฉันรูทบนโฮสต์
‫มันหมายความว่าฉันกำลังทำหน้าที่เป็นรูทบนคอนเทนเนอร์
‫ตัวเลขหลังจากนั้นคือรหัสคอนเทนเนอร์
‫ถ้าฉันทำ ls -al ฉันจะได้รับรายชื่อทั้งหมดที่ฉันอยู่
‫และคุณจะเห็นว่าฉันอยู่ในเส้นทางรากของระบบไฟล์ภายในคอนเทนเนอร์
‫ฉันกำลังดูไฟล์ทั้งหมดภายในคอนเทนเนอร์ซึ่งอิงตามอิมเมจ Nginx
‫จากที่นี่ ฉันสามารถไปเปลี่ยนไฟล์กำหนดค่าได้ ฉันสามารถดาวน์โหลดแพ็คเกจจากอินเทอร์เน็ต
‫และทำอะไรก็ได้เกี่ยวกับการดูแลระบบทั่วไปที่คุณทำจากเชลล์ปกติ
‫เมื่อต้องการออกจากเชลล์เมื่อคุณทำเสร็จแล้ว ฉันจะพิมพ์ exit เช่นเดียวกับที่คุณทำกับเชลล์ใดๆ และตอนนี้คอนเทนเนอร์นั้นหยุดทำงาน
‫ถ้าเราสร้าง docker container ls ขึ้นมาจริงๆ คุณจะไม่เห็นมันอยู่ที่นั่น
‫จำไว้ว่าเราเรียกมันว่าพร็อกซี่
‫เลยต้องทำ -a
‫และมันอยู่ที่นั่น ตอนนี้ดูคำสั่งที่รัน คำสั่งเริ่มต้นสำหรับคอนเทนเนอร์ Nginx คือการเรียกใช้โปรแกรม
‫Nginx เอง
‫แต่เมื่อเราพิมพ์คำสั่งสุดท้าย เราเปลี่ยนโปรแกรมเริ่มต้นนั้นเป็น
‫Bash ซึ่งทำให้เชลล์ของเรา เมื่อเราออกจากเปลือก ภาชนะหยุด เพราะคอนเทนเนอร์ ทำงานตราบเท่าที่คำสั่งที่รันเมื่อเริ่มต้นทำงาน
‫เนื่องจากเราเปลี่ยนเป็น
‫Bash เพียงแค่ออกจาก Bash ออกจากตอนนี้ จะเป็นอย่างไรถ้าฉันใช้ Linux แบบเต็มรูปแบบแทนที่จะใช้ Nginx จริงๆ มาทำอูบุนตูตัวเต็มกันเถอะ
‫มันจะดาวน์โหลดอิมเมจ Ubuntu จริง ๆ แล้ววางฉันในพร้อมท์ของคอนเทนเนอร์ใหม่นี้
‫หากคุณเคยใช้ Ubuntu คุณจะรู้จัก apt package manager เป็นอย่างดี
‫ดังนั้นฉันจึงสามารถใช้สิ่งนั้นที่นี่ เช่นเดียวกับที่ฉันทำในเซิร์ฟเวอร์ Ubuntu มาตรฐาน ฉันสามารถติดตั้งบางอย่าง
‫apt-get install -y curl ได้
‫สิ่งที่เกี่ยวกับอูบุนตูและการแจกแจงอื่นๆ ภายในคอนเทนเนอร์คือโดยปกติแล้วจะมีน้อยมาก
‫ซีดีสดหรือการดาวน์โหลด ISO ของ Ubuntu ซึ่งปกติแล้วคุณจะใส่ลงในเครื่องเสมือนจะมีซอฟต์แวร์ติดตั้งอยู่เป็นจำนวนมากตามค่าเริ่มต้นมากกว่าคอนเทนเนอร์
‫Ubuntu ซึ่งเป็นเวอร์ชันที่น้อยที่สุดของ Ubuntu ที่คุณสามารถเพิ่มได้เสมอ ซอฟต์แวร์กับตัวจัดการแพ็คเกจ
‫apt
‫ดังนั้นตอนนี้คอนเทนเนอร์ที่ทำงานอยู่นี้ได้ติดตั้ง curl แล้ว และฉันสามารถใช้งานได้เหมือนกับที่ฉันทำบนเครื่องท้องถิ่น
‫เมื่อฉันออกจากเชลล์อีกครั้ง มันจะหยุดคอนเทนเนอร์จริงๆ คอนเทนเนอร์เทียบท่า
‫ls. คุณสังเกตเห็นว่าฉันไม่เห็นมัน มีอิมเมจอูบุนตูที่เราเพิ่งวิ่งไป
‫ถ้าฉันเริ่มคอนเทนเนอร์นั้นอีกครั้ง มันจะมี curl ติดตั้งอยู่ในนั้น
‫แต่ถ้าฉันสร้างคอนเทนเนอร์ใหม่จากอิมเมจ Ubuntu คอนเทนเนอร์อื่นนั้นจะไม่มีบรรทัดคำสั่ง
‫curl ติดตั้งอยู่
‫จะเป็นอย่างไรถ้าเราต้องการรันคอนเทนเนอร์นั้นอีกครั้งและนำ Bash กลับมาใส่ในคอนเทนเนอร์อีกครั้ง
‫เราสามารถใช้คำสั่งเริ่มคอนเทนเนอร์นักเทียบท่า
‫คุณจะสังเกตเห็นความแตกต่างเล็กน้อยเมื่อเราเริ่มคอนเทนเนอร์ที่มีอยู่ แต่จะคล้ายกับคอนเทนเนอร์...
‫มันเป็นแค่ไอ
‫จากนั้นชื่อของคอนเทนเนอร์ Ubuntu ของเรา คุณจะสังเกตเห็นว่าเรากลับมาอยู่ในนั้นและฉันสามารถม้วน
‫google อีกครั้งและใช้งานได้
‫ถ้าฉันออก มันก็หยุดอีกครั้ง
‫จะเกิดอะไรขึ้นถ้าฉันต้องการเห็นเชลล์ภายในคอนเทนเนอร์ที่กำลังทำงานอยู่ซึ่งกำลังทำงานบางอย่างเช่น
‫MySQL หรือ Nginx
‫เราสามารถทำได้เช่นกัน
‫และนั่นคือการใช้คำสั่ง exec ผู้บริหารตู้คอนเทนเนอร์
‫และคุณจะเห็นว่าเรามีตัวเลือกสองสามอย่างที่นี่
‫และที่พบบ่อยที่สุดคือ... สมมติว่าฉันต้องการข้ามไปยังคอนเทนเนอร์ MySQL เพราะฉันต้องทำบางอย่างเกี่ยวกับการดูแลระบบบน
‫MySQL เอง
‫ฉันสามารถทำได้อีกครั้งแล้วตามด้วยชื่อของคอนเทนเนอร์ จากนั้นโปรแกรมที่ฉันต้องการเรียกใช้
‫และในกรณีนี้ก็คือ Bash และตอนนี้ฉันอยู่ในคอนเทนเนอร์ที่มี MySQL แล้ว
‫ฉันสามารถทำ ps aux ได้จริงในคอนเทนเนอร์ซึ่งแสดงรายการกระบวนการ แน่นอนว่านี่จะแสดงให้ฉันเห็น MySQL daemon
‫ที่ทำงานอยู่เบื้องหลัง เช่นเดียวกับกระบวนการ Bash ที่ฉันกำลังนั่งอยู่ รวมถึงคำสั่ง
‫ps ที่ฉันเพิ่งเรียกใช้
‫ในเชลล์นี้ ฉันสามารถกระโดดเข้าสู่ MySQL ได้ด้วยบรรทัดคำสั่ง mysql คุณจะสังเกตเห็นเมื่อฉันออกจากเปลือก
‫Bash นี้และทำ ls ว่า MySQL ยังคงทำงานอยู่ เนื่องจาก docker container exec เรียกใช้กระบวนการเพิ่มเติมบนคอนเทนเนอร์ที่กำลังทำงานอยู่
‫จึงไม่ส่งผลต่อกระบวนการรูทสำหรับ MySQL daemon
‫มาลองกันอีกสักตั้ง
‫ดังที่คุณเห็นในที่นี้ สิ่งนี้มีประโยชน์มากสำหรับการกระโดดเข้าไปในคอนเทนเนอร์ เมื่อคุณต้องการแก้ไขปัญหาหรือเมื่อคุณต้องการเปลี่ยนแปลงบางสิ่งเล็กน้อยบนระบบที่ทำงานอยู่
‫เช่นเดียวกับการใช้คอนเทนเนอร์ที่มีการแจกจ่ายที่แตกต่างกันเพื่อให้คุณมีสภาพแวดล้อมที่คุณจะมีได้หากคุณมี เครื่องเต็มรูปแบบเช่น Ubuntu หรืออัลไพน์
‫ตอนนี้อัลไพน์คืออะไร? เราไม่ได้พูดถึงอัลไพน์มาก่อน อัลไพน์เป็นลินุกซ์อีกรุ่นหนึ่ง แต่อัลไพน์ได้รับการออกแบบให้มีขนาดเล็กมาก
‫จริงๆ แล้วมีขนาดเพียง 5MB
‫ถ้าฉันทำนักเทียบท่าดึงอัลไพน์นั่นจะดึงอิมเมจอัลไพน์ล่าสุดลงมาและถ้าฉันทำอิมเมจนักเทียบท่า ls คุณจะเห็นว่าอิมเมจอัลไพน์มีขนาดเล็กเพียงใดเมื่อเปรียบเทียบกับอูบุนตู
‫สิ่งที่ดีเกี่ยวกับ Alpine คือมันมาพร้อมกับตัวจัดการแพ็คเกจของตัวเอง
‫ดังนั้นคุณจะเห็น Alpine เป็นตัวเลือกใน Docker Hub มากในหัวข้อถัดไปเมื่อเราดูรูปภาพและ
‫Docker Hub
‫แต่ตอนนี้ มาทำ Bash shell ใน Alpine กัน docker container run -it อัลไพน์ทุบตี
‫เมื่อกี้เกิดอะไรขึ้นที่นี่?
‫ทำไมฉันถึงเข้าไปอยู่ในนั้น?
‫มันบอกฉันว่ากำลังเริ่มกระบวนการคอนเทนเนอร์และทำให้ไม่พบไฟล์ที่เรียกใช้งานได้ในพา
‫ธ และความหมายที่แท้จริงก็คือ Bash ไม่ได้อยู่ในคอนเทนเนอร์
‫และสิ่งนี้กลับไปสู่แนวคิดที่ว่าเราสามารถเรียกใช้สิ่งต่าง ๆ ในคอนเทนเนอร์ที่มีอยู่แล้วในอิมเมจเมื่อคุณเริ่มใช้งาน
‫หรือบางทีสิ่งที่คุณเพิ่มในภายหลังผ่าน exec หรือเรียกใช้คำสั่ง
‫แต่ในกรณีนี้ ฉันจะได้ภาพอัลไพน์ได้อย่างไร?
‫อัลไพน์มีขนาดเล็กมากจนไม่มี Bash อยู่ในนั้น แต่มันมี sh ดังนั้นเราจึงสามารถแทนที่คำสั่งด้วย
‫sh ซึ่งไม่ค่อยมีคุณสมบัติครบถ้วนเหมือน Bash แต่พาเราเข้าไปในคอนเทนเนอร์
‫หากคุณต้องค้นหา Alpine Linux บนอินเทอร์เน็ต คุณจะได้เรียนรู้ว่า package manager
‫ของมันคือ apk และเราสามารถใช้สิ่งนั้นเพื่อติดตั้ง Bash ได้ หากเราต้องการมันจริงๆ
‫เพียงเพื่อสรุปสิ่งที่เราเรียนรู้ในบทเรียนนี้อย่างรวดเร็ว
‫เราได้เรียนรู้เกี่ยวกับตัวเลือก -it สำหรับการรันคอนเทนเนอร์ ซึ่งช่วยให้เราเทียบเท่ากับเชลล์แบบโต้ตอบเพื่อทำสิ่งต่าง
‫ๆ ในคอนเทนเนอร์ได้จริง เหมือนกับที่เราเคยทำ ssh'd ในเซิร์ฟเวอร์บางประเภท
‫จากนั้นเราได้เรียนรู้คำสั่งใหม่สำหรับ
‫docker container exec ซึ่งทำงานเหมือนกับการรัน แต่คำสั่งนั้นทำงานบนคอนเทนเนอร์ที่มีอยู่ซึ่งไม่ได้เริ่มคอนเทนเนอร์ใหม่
‫และสุดท้าย เราได้เรียนรู้เล็กน้อยเกี่ยวกับ Alpine และความแตกต่างจากลีนุกซ์รุ่นหลักๆ อย่างไร
‫และขนาดจริงๆ แล้วมีขนาด 4MB และเหมาะสำหรับอิมเมจคอนเทนเนอร์อย่างไร