‫ข้อกำหนดสำหรับส่วนนี้รวมถึงการทำความเข้าใจวิธีการเริ่มต้นคอนเทนเนอร์ จากนั้นแนวคิดพื้นฐานของเครือข่าย
‫TCP/IP เช่นซับเน็ตและ IP และพอร์ตและไฟร์วอลล์
‫คุณไม่จำเป็นต้องรู้ทั้งหมดนั้น แต่มันจะทำให้คุณเข้าใจส่วนนี้ซึ่งเน้นไปที่เนื้อหาเกี่ยวกับแนวคิดได้ง่ายขึ้นมาก
‫ก่อนที่เราจะพูดถึงบรรทัดคำสั่งต่างๆ ในการบรรยายครั้งต่อไป
‫ฉันแค่ต้องการเตือนคุณเกี่ยวกับตัวเลือก -p บนคำสั่งการรันคอนเทนเนอร์ของคุณ ซึ่งจะแสดงพอร์ตบนเครื่องของคุณ
‫มีอะไรอีกมากที่เกิดขึ้นในเบื้องหลังของเครือข่าย Docker ที่เราจะพูดถึง
‫Docker มีแนวคิดเรื่องแบตเตอรี่รวมอยู่ด้วย แต่สามารถถอดออกได้ ซึ่งหมายความว่าค่าเริ่มต้นนั้นค่อนข้างง่ายและใช้งานได้ทั่วไป
‫แต่คุณสามารถเปลี่ยนตัวเลือกได้มากมายภายใต้ประทุน
‫เราจะตรวจสอบอย่างรวดเร็วในการบรรยายนี้ คำสั่งพอร์ตคอนเทนเนอร์ที่ให้ผลลัพธ์อย่างรวดเร็วของพอร์ตที่เปิดสำหรับคอนเทนเนอร์นั้นบนเครือข่ายของคุณ
‫จากนั้นเราจะแยกย่อยแนวคิดบางอย่างของเครือข่าย Docker และเครือข่ายเสมือน และวิธีที่แพ็กเก็ตไหลผ่านเครือข่าย
‫และเราจะปิดท้ายด้วยไดอะแกรมเครือข่ายที่แสดงว่าคอนเทนเนอร์คุยกันอย่างไร และนั่นแตกต่างจาก
‫-p ของการเปิดเผยคอนเทนเนอร์เหล่านั้นบนเครือข่ายทางกายภาพอย่างไร
‫เมื่อคุณเริ่มคอนเทนเนอร์จริง ๆ คุณอยู่ในพื้นหลังที่เชื่อมต่อกับเครือข่าย Docker
‫ใดเครือข่ายหนึ่ง โดยค่าเริ่มต้น นั่นคือเครือข่ายบริดจ์ เนื่องจากเราจะตรวจสอบในอีกสักครู่ จากนั้นแต่ละเครือข่ายที่คุณจะเชื่อมต่อเพื่อกำหนดเส้นทางผ่านไฟร์วอลล์
‫NAT ซึ่งจริง ๆ แล้วเป็น Docker daemon ที่กำหนดค่าที่อยู่ IP ของโฮสต์บนอินเทอร์เฟซเริ่มต้นเพื่อให้คอนเทนเนอร์ของคุณสามารถออกไปยังอินเทอร์เน็ตหรือไปยังส่วนอื่น ๆ ของคุณได้
‫เครือข่ายแล้วกลับ
‫แต่เราไม่จำเป็นต้องใช้ -p เมื่อเรามีคอนเทนเนอร์เฉพาะที่ต้องการพูดคุยกันภายในโฮสต์ของเรา
‫ตัวอย่างเช่น หากคุณมีแอปพลิเคชันที่มีเซิร์ฟเวอร์ภาคต่อและคอนเทนเนอร์ PHP Apache คอนเทนเนอร์ทั้งสองนั้นควรอยู่ในเครือข่ายเดียวกัน
‫และสามารถพูดคุยกันได้โดยไม่ต้องเปิดพอร์ตไปยังส่วนอื่นๆ ของเครือข่ายทางกายภาพของคุณ
‫.
‫หากคุณมีแอปพลิเคชันอื่นที่ไม่เกี่ยวข้อง แสดงว่ากำลังใช้ Mongo และ Node js คุณสามารถสร้างเครือข่ายเพื่อให้พวกเขาสามารถพูดคุยกันได้โดยไม่ต้องใช้
‫-p เพื่อเปิดเผยต่อเครือข่าย
‫แต่พวกเขาไม่สามารถพูดคุยกับเครือข่ายอื่นที่คุณอาจมีแอปที่ไม่เกี่ยวข้องทำงานอยู่
‫แต่สิ่งนี้คือการตั้งค่าทั้งหมดที่ฉันอธิบายนั้นสามารถเปลี่ยนแปลงได้จริงๆ
‫และนี่เป็นคำพูดดีๆ ที่ Docker ชอบใช้... นั่นคือรวมแบตเตอรี่ แต่ถอดออกได้
‫คุณจะเห็นว่าตลอดหลักสูตรนี้ หลายครั้งมีค่าเริ่มต้นที่ใช้งานได้ทันที
‫คุณไม่จำเป็นต้องระบุด้วยซ้ำ คุณเพิ่งสังเกตเห็นว่าสิ่งต่าง ๆ ได้รับการกำหนดค่าในลักษณะมาตรฐาน
‫แต่ตัวเลือกเหล่านี้จำนวนมากสามารถกำหนดค่าได้ในขณะใช้งานจริงหรืออาจเปลี่ยนแปลงได้หลังจากข้อเท็จจริง และเราจะเห็นว่าบางส่วนเกิดขึ้นที่นี่
‫เมื่อเราเล่นกับเครือข่าย
‫บางสิ่งที่คุณสามารถเปลี่ยนได้จริงคือการสร้างเครือข่ายเสมือนหลายเครือข่าย อาจมีหนึ่งเครือข่ายต่อหนึ่งแอพ
‫หรือหลายเครือข่ายขึ้นอยู่กับข้อกำหนดด้านความปลอดภัยที่แตกต่างกัน
‫จริงๆ แล้ว คุณสามารถมี NIC จริงสองตัวบนคอมพิวเตอร์จริงได้ เช่นเดียวกับในโลกทางกายภาพ คุณสามารถมีเครือข่ายเสมือนสองเครือข่ายที่เชื่อมต่อกับคอนเทนเนอร์เดียว
‫หรือคุณสามารถให้คอนเทนเนอร์พูดคุยกับเครือข่ายใด ๆ ก็ได้
‫คุณสามารถข้ามการกำหนดค่าเครือข่ายเสมือนใดๆ ที่ออกมาจากกล่องและใช้งานจริงได้
‫-- net=host
‫และคุณจะสูญเสียประโยชน์ของคอนเทนเนอร์บางส่วนไป
‫แต่ในบางกรณีอาจจำเป็น
‫ต่อไปเราจะเข้าสู่ไดรเวอร์เครือข่ายของ Docker มีระบบนิเวศของปลั๊กอินทั้งหมดอยู่รอบๆ
‫Docker ซึ่งขยายขีดความสามารถของ Docker ไปยังเครื่องมือของบุคคลที่สามมากมาย
‫แต่ในกรณีนี้ เราจะดูไดรเวอร์เครือข่าย Docker ที่แตกต่างกันสองสามตัว และวิธีที่พวกมันอาจเปลี่ยนเครือข่ายของเราและให้ความสามารถใหม่แก่เรา
‫นี่เป็นเพียงการขีดข่วนพื้นผิวเท่านั้น
‫มีแนวคิดเกี่ยวกับเครือข่ายตลอดหลักสูตรนี้ ซึ่งเราจะพูดถึงหัวข้อขั้นสูงเพิ่มเติมเกี่ยวกับเครือข่ายส่วนตัวแบบหลายโฮสต์และแนวคิดต่างๆ
‫เช่น อินเทอร์เฟซย่อย และอื่นๆ
‫แต่สำหรับตอนนี้ มาดูเรื่องบรรทัดคำสั่งกันก่อน
‫ในการตรวจสอบอย่างรวดเร็ว
‫ให้ดูที่ -p ของคำสั่งที่รันคอนเทนเนอร์ของเรา... รันคอนเทนเนอร์ของนักเทียบท่า
‫หากคุณจำเมื่อเรารันคอนเทนเนอร์ครั้งแรก เราใช้ -p เพื่อแสดงพอร์ต 80 ของ Nginx ของเรา
‫ที่เอาด้านซ้าย ซึ่งเป็นพอร์ตโฮสต์ และส่งต่อทราฟฟิกจากพอร์ตนั้นไปยังพอร์ต 80 ของคอนเทนเนอร์
‫ถ้าเราทำ docker container port webhost มันจะแสดงสิ่งนี้ในรูปแบบที่ดีและง่ายซึ่งพอร์ตต่างๆ กำลังส่งต่อทราฟฟิกไปยังคอนเทนเนอร์นั้นจากโฮสต์ไปยังคอนเทนเนอร์นั้นเอง
‫เราไม่ได้พูดถึงที่อยู่ IP ของคอนเทนเนอร์
‫ดังนั้นคุณอาจสมมติได้ว่าคอนเทนเนอร์ใช้ IP เดียวกันกับโฮสต์ แต่โดยค่าเริ่มต้น นั่นไม่เป็นความจริง
‫เราสามารถรับ Docker IP ของคอนเทนเนอร์นั้นได้อย่างง่ายดายโดยการตรวจสอบ แล้วเราจะใช้คำสั่งรูปแบบหรือตัวเลือกจริง
‫ๆ ซึ่งคุณจะสังเกตเห็นว่าจริงๆ แล้วมีรูปแบบที่ค่อนข้างเฉพาะสำหรับวิธีการกรองข้อมูลที่เข้ามา
‫คุณสามารถใช้คำสั่ง grep ที่เราใช้ก่อนหน้านี้เพื่อกรองข้อความออกได้เสมอ
‫แต่รูปแบบ --format จะดูสะอาดตาและสม่ำเสมอขึ้นเล็กน้อย คุณทำวงเล็บปีกกาสองอัน จากนั้นเมื่อเราคุ้นเคยกับการรู้รูปแบบของไฟล์ปรับแต่งแล้ว
‫เราก็รู้ว่า NetworkSettings ที่อยู่ IP คือโหนดจริงของเอาต์พุต
‫JSON นั้นที่เราต้องการดู
‫แล้วก็เว็บโฮสต์ อ๊ะ หมายความว่าฉันสะกดไม่ถูก
‫ไอ พี เอ ดี ดี.
‫และนั่นไม่ใช่สิ่งที่ฉันคาดไว้
‫ถ้าฉันจะใช้ IP ของโฮสต์เพราะฉันรู้จัก Mac ของฉันบนเครือข่ายท้องถิ่นของฉัน และถ้าฉันทำ ifconfig
‫บน Mac ของฉัน ฉันแค่รู้ว่าที่อยู่ IP นั้นอยู่ในเครือข่ายในบ้านของฉันหรือ 1 9 2 1 6 8 ซับเน็ต
‫ที่น่าสนใจคือไม่ใช่เครือข่ายเดียวกัน
‫แล้วทำไมถึงเป็นอย่างนั้น?
‫ลองดูว่ามันจะสมเหตุสมผลกว่านี้ไหมถ้าฉันวาดมันออกมา
‫หากระบบปฏิบัติการโฮสต์ของฉันเชื่อมต่อกับเครือข่ายของฉัน... นี่คือเครือข่ายของฉัน... เครือข่ายทางกายภาพ นี่คืออินเทอร์เฟซอีเทอร์เน็ตบนเครื่องโฮสต์ของฉัน
‫ในกรณีของฉันคือ Mac ของฉัน
‫มีไฟร์วอลล์ตัวเล็ก ๆ อยู่ในนั้นที่ทำหลายสิ่ง มันบล็อกการรับส่งข้อมูลที่เข้ามาทั้งหมดจากเครือข่ายเพื่อให้ทุกอย่างถูกบล็อกโดยค่าเริ่มต้น
‫ฉันจะเรียกมันว่าไฟร์วอลล์ การรับส่งข้อมูลใดๆ
‫ที่ออกมาจากคอนเทนเนอร์ของฉันจะเป็น NATed ตามค่าเริ่มต้น
‫มันทำหน้าที่เหมือนไฟร์วอลล์ทั่วไปบนเครือข่าย
‫แต่มีแนวคิดเกี่ยวกับเครือข่ายเสมือนนี้ และโดยค่าเริ่มต้น คุณจะเห็นเครือข่ายที่เรียกว่า
‫สะพาน หรือ docker0
‫เมื่อคุณเริ่มคอนเทนเนอร์ใหม่ เราจะเรียกมันว่า C1 คอนเทนเนอร์นั้นเชื่อมต่อกับเครือข่ายนั้น เครือข่ายเสมือนนั้น
‫และเครือข่ายเสมือนนั้นจะถูกแนบโดยอัตโนมัติกับอินเทอร์เฟซอีเทอร์เน็ตบนโฮสต์ของคุณ เพื่อให้สามารถออกไปได้
‫ในกรณีของเรา เมื่อเราเพิ่งเปิดตัว Nginx นั้น เราให้ -p 80:80 นั่นบอกให้เปิดพอร์ต 80 บนอินเทอร์เฟซอีเทอร์เน็ตบน
‫Mac ของฉัน และส่งต่อทุกสิ่งที่เข้ามาในพอร์ต 80 ผ่านเครือข่ายเสมือนนั้นไปยังพอร์ต
‫80 ในคอนเทนเนอร์นั้น
‫โดยค่าเริ่มต้น เมื่อฉันสร้างคอนเทนเนอร์ที่สอง คอนเทนเนอร์นั้นจะถูกวางบนเครือข่ายบริดจ์เดียวกันนั้น
‫ตู้คอนเทนเนอร์ทั้งสองสามารถพูดคุยไปมาได้อย่างอิสระบนพอร์ตที่เปิดโล่ง
‫เว้นแต่ฉันจะระบุ -p จะไม่มีการรับส่งข้อมูลที่เข้ามาในเครือข่ายภายในของฉันที่นี่ ที่จะไปที่คอนเทนเนอร์ของฉัน
‫จริงๆ แล้ว ฉันสามารถสร้างเครือข่ายเสมือนได้มากขึ้น และเรียกมันว่าสิ่งที่ฉันต้องการ ฉันจะเรียกสิ่งนี้ว่าแอพ
‫net ของฉันสมมติว่า สมมุติว่าผมต่อตู้คอนเทนเนอร์สองตู้ไว้ตรงนี้... ฉันได้รับ MySQL
‫จากนั้นฉันก็ได้อาปาเช่
‫บน MySQL ฉันไม่ได้เปิดพอร์ตใด
‫ๆ และไม่เคยระบุ -p แต่สำหรับ Apache
‫ฉันให้ -p ที่ 8080:80
‫นั่นหมายถึงตรงนี้ทางด้านขวา ที่อินเทอร์เฟซอีเทอร์เน็ตของฉันบนโฮสต์ของฉัน มันจะเริ่มฟังบนพอร์ต
‫8080
‫ทันทีที่ทราฟฟิกเข้ามาในโฮสต์ของฉันบนพอร์ต 8080 มันจะกำหนดเส้นทางไปยังเครือข่ายเสมือนใหม่ที่ฉันสร้างขึ้นและไปยังเซิร์ฟเวอร์
‫Apache บนพอร์ต 80
‫ภายในเครือข่ายเสมือนนี้ เซิร์ฟเวอร์ Apache สามารถพูดคุยกับเซิร์ฟเวอร์ MySQL ผ่านพอร์ตการรับฟังได้ฟรี
‫เมื่อคุณนึกถึงเครือข่ายเสมือนใน Docker และตำแหน่งของคอนเทนเนอร์ ให้คิดว่าคุณจะวางคอนเทนเนอร์ต่างๆ
‫ไว้ใกล้กันอย่างไร เพราะพวกเขาเกี่ยวข้องกันในแอปพลิเคชันของพวกเขา
‫อย่างที่คุณเห็น สองตัวอย่างนี้ ถ้าฉันมีคอนเทนเนอร์หนึ่งและคอนเทนเนอร์สอง อยู่ในอันดับที่ต่างออกไป
‫ถ้าพวกเขาจะไม่คุยกับบริการในเครือข่ายด้านล่างนี้ ก็คงสมเหตุสมผลที่จะรักษาไว้ บนเครือข่ายเสมือนที่แยกจากกัน
‫หากพวกเขาเคยต้องคุยกัน พวกเขาจะต้องผ่านพอร์ตที่เผยแพร่ไปจนสุดทางกลับเข้าและออก
‫โปรดทราบว่าบนอินเทอร์เฟซใดๆ บนโฮสต์ของคุณ คุณไม่สามารถฟังพอร์ตมากกว่าหนึ่งพอร์ตสำหรับคอนเทนเนอร์หลายรายการได้
‫ดังนั้น คุณไม่สามารถมีคอนเทนเนอร์สองตัวที่รอฟังอยู่ที่พอร์ต 80 ที่ระดับโฮสต์
‫มีคนเดียวที่ทำได้
‫หากคุณพยายามเริ่มคอนเทนเนอร์อื่น มันจะเกิดข้อผิดพลาดและบอกว่ามีอย่างอื่นในพอร์ตนั้นอยู่แล้ว
‫นั่นไม่ใช่ข้อจำกัดของนักเทียบท่า
‫นั่นเป็นเพียงข้อจำกัดของการทำงานของเครือข่าย IP โดยทั่วไป
‫สรุปสั้นๆ ในส่วนนี้ เราใช้เวลามากมายกับแนวคิดของเครือข่าย Docker รวมถึงการเปิดเผยพอร์ตบนโฮสต์ของคุณไปยังเครือข่ายทางกายภาพโดยใช้
‫-p แนวคิดของ Docker มุ่งเน้นไปที่ค่าเริ่มต้นที่สมเหตุสมผลซึ่งเรียกว่ารวมแบตเตอรี่
‫แต่ถอดออกได้
‫สำหรับการพัฒนาและการทดสอบในพื้นที่ คุณอาจใช้ค่าเริ่มต้นได้ แต่ทุกอย่างสามารถเปลี่ยนแปลงได้
‫จากนั้นเราได้เรียนรู้เกี่ยวกับคำสั่งพอร์ตคอนเทนเนอร์ซึ่งเป็นวิธีที่รวดเร็วในการดูพอร์ตที่เปิดเผยสำหรับคอนเทนเนอร์เฉพาะของคุณ
‫จากนั้นเราก็แยกย่อยแพ็กเก็ตที่เคลื่อนที่ไปมาในเครือข่ายเสมือนและความสัมพันธ์ของแพ็กเก็ตกับเครือข่ายเสมือนอื่นๆ
‫และวิธีที่แพ็กเก็ตเข้าและออกจากเครื่อง Docker ของคุณ
‫ดังนั้น ทั้งหมดนี้เป็นแนวคิดที่ดีจริงๆ ที่จะเข้าใจในขณะที่เราข้ามไปยังเนื้อหา CLI จริงในการบรรยายครั้งต่อไป