TL; DRตรวจสอบโหมดเครือข่ายของโฮสต์ VirtualBox ของคุณ - ควรเป็นbridged
หากคุณต้องการให้เครื่องเสมือน (และคอนเทนเนอร์ Docker ที่โฮสต์อยู่) สามารถเข้าถึงได้บนเครือข่ายท้องถิ่นของคุณ
ดูเหมือนความสับสนของคุณจะอยู่ที่โฮสต์ที่จะเชื่อมต่อเพื่อเข้าถึงแอปพลิเคชันของคุณผ่าน HTTP คุณยังไม่ได้สะกดว่าการกำหนดค่าของคุณคืออะไรฉันจะเดาตามข้อเท็จจริงที่ว่าคุณมี "Windows" และ "VirtualBox" ในแท็กของคุณ
ฉันเดาว่าคุณมี Docker ที่ทำงานบน Linux บางอย่างที่ทำงานใน VirtualBox บนโฮสต์ Windows ฉันจะติดป้ายกำกับที่อยู่ IP ดังนี้:
D
= ที่อยู่ IP ของคอนเทนเนอร์ Docker
L
= ที่อยู่ IP ของโฮสต์ Linux ที่ทำงานใน VirtualBox
W
= ที่อยู่ IP ของโฮสต์ Windows
เมื่อคุณเรียกใช้แอปพลิเคชัน Go บนโฮสต์ Windows คุณสามารถเชื่อมต่อได้http://W:8080/
จากทุกที่ในเครือข่ายท้องถิ่นของคุณ วิธีนี้ใช้ได้ผลเนื่องจากแอปพลิเคชัน Go ผูกพอร์ต 8080 บนเครื่อง Windows และใครก็ตามที่พยายามเข้าถึงพอร์ต 8080 ตามที่อยู่ IP W
จะได้รับการเชื่อมต่อ
และนี่คือจุดที่ซับซ้อนมากขึ้น:
VirtualBox เมื่อตั้งค่าเครื่องเสมือน (VM) สามารถกำหนดค่าเครือข่ายในโหมดต่างๆได้หลายโหมด ผมจำไม่ได้สิ่งที่ทุกตัวเลือกที่แตกต่างกันมี bridged
แต่คนที่คุณต้องการคือ ในโหมดนี้ VirtualBox จะเชื่อมต่อเครื่องเสมือนกับเครือข่ายท้องถิ่นของคุณราวกับว่าเป็นเครื่องสแตนด์อะโลนบนเครือข่ายเช่นเดียวกับเครื่องอื่น ๆ ที่เสียบเข้ากับเครือข่ายของคุณ ในbridged
โหมดเครื่องเสมือนจะปรากฏบนเครือข่ายของคุณเหมือนกับเครื่องอื่น ๆ โหมดอื่น ๆ จะตั้งค่าต่างกันและเครื่องจะมองไม่เห็นบนเครือข่ายของคุณ
ดังนั้นสมมติว่าคุณตั้งค่าระบบเครือข่ายได้อย่างถูกต้องสำหรับโฮสต์ลินุกซ์ ( bridged
) โฮสต์ลินุกซ์จะมีที่อยู่ IP ในเครือข่ายท้องถิ่นของคุณ (บางอย่างเช่น 192.168.0.x) http://L:8080/
และคุณจะสามารถเข้าถึงคอนเทนเนอร์หางของคุณได้ที่
ถ้าโฮสต์ลินุกซ์จะทำงานในโหมดอื่น ๆ กว่าบางbridged
คุณอาจจะสามารถที่จะเข้าถึงจากโฮสต์ Windows แต่นี้จะขึ้นอยู่กับว่าสิ่งที่โหมดมันอยู่ใน
แก้ไข - จากความคิดเห็นด้านล่างดูเหมือนว่าสถานการณ์ที่ฉันอธิบายไว้ข้างต้นนั้นถูกต้อง
ขอสำรองข้อมูลเล็กน้อยนี่คือวิธีการทำงานของ Docker บนคอมพิวเตอร์ของฉัน (Ubuntu Linux)
ลองนึกภาพว่าฉันใช้คำสั่งเดียวกับที่คุณมี: docker run -p 8080:8080 dockertest
. สิ่งนี้จะเริ่มต้นคอนเทนเนอร์ใหม่ตามdockertest
อิมเมจและส่งต่อ (เชื่อมต่อ) พอร์ต 8080 บนโฮสต์ Linux (พีซีของฉัน) ไปยังพอร์ต 8080 บนคอนเทนเนอร์ Docker ตั้งค่าเครือข่ายภายในของตนเอง (พร้อมชุดที่อยู่ IP ของตัวเอง) เพื่อให้ Docker daemon สื่อสารและอนุญาตให้คอนเทนเนอร์สื่อสารกันได้ โดยพื้นฐานแล้วสิ่งที่คุณกำลังทำอยู่นั้น-p 8080:8080
คือการเชื่อมต่อเครือข่ายภายในของ Docker กับเครือข่าย "ภายนอก" นั่นคือ อะแดปเตอร์เครือข่ายของโฮสต์ - บนพอร์ตเฉพาะ
กับฉันจนถึงตอนนี้? ตกลงตอนนี้ลองย้อนกลับไปดูระบบของคุณ เครื่องของคุณกำลังใช้งาน Windows - Docker ไม่ (ในปัจจุบัน) ทำงานบน Windows ดังนั้นเครื่องมือที่คุณใช้จึงตั้งค่าโฮสต์ Linux ในเครื่องเสมือน VirtualBox เมื่อคุณทำdocker run
ในสภาพแวดล้อมของคุณสิ่งเดียวกันก็เกิดขึ้น - พอร์ต 8080 บนโฮสต์ Linux เชื่อมต่อกับพอร์ต 8080 บนคอนเทนเนอร์ ความแตกต่างใหญ่ที่นี่คือโฮสต์ Windows ของคุณไม่ใช่โฮสต์ Linux ที่คอนเทนเนอร์กำลังทำงานอยู่ดังนั้นจึงมีเลเยอร์อื่นอยู่ที่นี่และเป็นการสื่อสารข้ามเลเยอร์นี้ซึ่งคุณกำลังประสบปัญหา
สิ่งที่คุณต้องการคือหนึ่งในสองสิ่ง:
เพื่อเชื่อมต่อพอร์ต 8080 บน VirtualBox VM กับพอร์ต 8080 บนโฮสต์ Windows เช่นเดียวกับที่คุณเชื่อมต่อคอนเทนเนอร์ Docker กับพอร์ตโฮสต์
เพื่อเชื่อมต่อ VirtualBox VM โดยตรงกับเครือข่ายท้องถิ่นของคุณด้วยbridged
โหมดเครือข่ายที่ฉันอธิบายไว้ข้างต้น
หากคุณเลือกตัวเลือกแรกคุณจะสามารถเข้าถึงคอนเทนเนอร์ได้โดยที่http://W:8080
ที่W
อยู่ IP หรือชื่อโฮสต์ของโฮสต์ Windows หากคุณเลือกข้อที่สองคุณจะสามารถเข้าถึงคอนเทนเนอร์ได้โดยที่http://L:8080
ที่L
อยู่ IP หรือชื่อโฮสต์ของ Linux VM
นั่นคือคำอธิบายระดับสูงทั้งหมด - ตอนนี้คุณต้องหาวิธีเปลี่ยนการกำหนดค่าของ VirtualBox VM และนี่คือสิ่งที่ฉันไม่สามารถช่วยคุณได้จริงๆ - ฉันไม่รู้ว่าคุณใช้เครื่องมืออะไรทำทั้งหมดนี้บนเครื่อง Windows ของคุณและฉันไม่คุ้นเคยกับการใช้ Docker บน Windows เลย
หากคุณสามารถไปที่หน้าต่างการกำหนดค่า VirtualBox คุณสามารถทำการเปลี่ยนแปลงตามที่อธิบายไว้ด้านล่าง นอกจากนี้ยังมีไคลเอนต์บรรทัดคำสั่งที่จะแก้ไข VM แต่ฉันไม่คุ้นเคยกับสิ่งนั้น
สำหรับbridged
โหมด (และนี่เป็นทางเลือกที่ง่ายที่สุด) ให้ปิด VM ของคุณคลิกปุ่ม "การตั้งค่า" ที่ด้านบนจากนั้นเปลี่ยนโหมดเครือข่ายเป็นbridged
จากนั้นรีสตาร์ท VM เท่านี้ก็พร้อมใช้งาน VM ควรรับที่อยู่ IP บนเครือข่ายท้องถิ่นของคุณผ่าน DHCP และคอมพิวเตอร์เครื่องอื่นในเครือข่ายควรมองเห็นได้ด้วยที่อยู่ IP นั้น