network_mode: service:vpn กับชื่อโฮสต์ db ที่หายไป
การแชร์เนมสเปซของ VPN เป็นการเลือกโทโพโลยี ไม่ว่า db จะเก็บที่อยู่ของตัวเองและ vpn เข้าร่วมเครือข่ายนั้น หรือทุกอย่างตอบบน loopback
คุณเพิ่ม network_mode: service:vpn ให้แอป รีสตาร์ตสแตก แล้วแอปก็ตายเพราะ db ไม่ถูกแก้ชื่ออีกต่อไป ไม่มีอะไรถูกเปลี่ยนชื่อในไฟล์ compose ดังนั้นผู้ต้องสงสัยที่ชัดเจนคือ DNS และฐานข้อมูล การเปลี่ยนแปลงจริงนั้นเล็กกว่าและแปลกกว่า: แอปเลิกเป็นสมาชิกของเครือข่าย Compose ที่มีชื่อนั้นอยู่ จนกว่าคุณจะตัดสินว่า db ควรตอบจากเนมสเปซใด การแก้ชื่อโฮสต์ทุกครั้งจึงเป็นการเดา
ทำไมชื่อโฮสต์ db จึงเลิกถูกแก้ชื่อ
บริการที่ใช้ network_mode ไม่มีที่อยู่ของตัวเองบนเครือข่าย Compose แต่ขอยืมเนมสเปซของบริการที่ระบุชื่อ เนมสเปซนั้นนำอินเทอร์เฟซ เส้นทาง พื้นที่พอร์ต และตัวแก้ชื่อของตัวเองมา และแทนที่การเชื่อมต่อของแอปกับเครือข่าย backend ชื่อ db ไม่เคยเป็นนามธรรมเลย: มันอาศัยอยู่บนเครือข่ายนั้นและถูกแก้ชื่อผ่าน DNS ที่ฝังอยู่ ถอดการเชื่อมต่อออกแล้วชื่อก็ไม่มีที่ให้แก้
ยืนยันจากภายในคอนเทนเนอร์ ไม่ใช่จากโฮสต์ การค้นหาที่ล้มเหลวในแอปแต่สำเร็จในคอนเทนเนอร์ฐานข้อมูลหมายความว่าชื่อถูกต้องแต่สมาชิกภาพไม่ถูก ผลลัพธ์นั้นยังวางการแก้ไขไว้ในโทโพโลยี compose ไม่ใช่การตั้งค่าตัวแก้ชื่อของแอป
สามคำถามก่อนแก้ไฟล์
ตอบตามลำดับ เพราะแต่ละข้อทำให้โทโพโลจีแคบลง ฐานข้อมูลต้องตอบอะไร: ชื่อโฮสต์ที่คอนเทนเนอร์อื่นใช้ หรือเฉพาะแอปบน loopback แอปต้องเผยแพร่พอร์ตไปยังโฮสต์หรือไม่ และบริการใดจะเป็นเจ้าของ ฐานข้อมูลต้องเข้าถึงได้จากโฮสต์หรือเครื่องอื่น หรือเฉพาะจากภายในอุโมงค์
ถ้าฐานข้อมูลต้องการชื่อของตัวเองและแอปไม่เผยแพร่สิ่งใด ให้แยกไว้บนการเชื่อมต่อคนละอัน ถ้าแอปต้องเผยแพร่พอร์ตและทุกอย่างผ่านอุโมงค์ ให้วางฐานข้อมูลไว้ในเนมสเปซของ VPN และใช้ loopback การผสมทั้งสองอย่างจะได้สแตกที่เริ่มได้สะอาดแต่ล้มเหลวตอนเชื่อมต่อ
ปล่อยฐานข้อมูลไว้ที่เดิม
การเปลี่ยนแปลงเล็กกว่าเชื่อมเจ้าของเนมสเปซเข้ากับเครือข่ายที่มีฐานข้อมูลอยู่แล้ว แอปสืบทอดการเชื่อมต่อนั้นเพราะแชร์สแตก vpn และ db ถูกแก้ชื่อเหมือนเดิมทุกประการ
services:
vpn:
networks:
- backend
app:
network_mode: service:vpn
db:
networks:
- backend
networks:
backend:อย่าเพิ่ม networks ให้แอปด้วย Compose ปฏิเสธคุณสมบัตินั้นพร้อมกับ network_mode ในบริการเดียวกัน และข้อผิดพลาดชี้ไปที่ไฟล์ไม่ใช่คู่ ถ้าคลไคลเอนต์ VPN กรองปลายทาง backend ภายในเนมสเปซของตน ให้ปรับนโยบายเครือข่ายท้องถิ่นที่รองรับด้วย การเชื่อมต่อที่แชร์มีเส้นทางให้แต่ไม่ได้ลบล้างตัวกรองนั้น
ย้ายฐานข้อมูลเข้าเนมสเปซ
การเปลี่ยนแปลงที่ใหญ่กว่าวางฐานข้อมูลไว้ในเนมสเปซเดียวกันและชี้แอปไปที่ 127.0.0.1 ด้วยพอร์ตจริง สองโปรเซสไม่สามารถผูกที่อยู่และพอร์ตเดียวกันได้เพียงเพราะเริ่มในคอนเทนเนอร์ต่างกัน ดังนั้นฐานข้อมูลที่ฟังบนที่อยู่ wildcard ด้วยจะชนกับสิ่งอื่นใดที่ทำเช่นนั้น ตรวจสอบผู้ฟังก่อนย้าย
พอร์ตที่เผยแพร่เป็นของบริการที่เป็นเจ้าของเนมสเปซ การเพิ่ม ports ให้แอปถูกปฏิเสธพร้อมกับ network_mode และการคิดค้นที่อยู่แอปแยกต่างหากอธิบายอินเทอร์เฟซที่ไม่มีอยู่
ความพร้อม การบล็อก และตัวแก้ชื่อ
depends_on จัดลำดับการเริ่มคอนเทนเนอร์ ไม่ใช่หลักฐานว่าอุโมงค์ทำงาน และไม่หยุดทราฟฟิกเมื่ออุโมงค์ล่ม ให้ถือว่าการเข้าถึงได้ ความพร้อมของอุโมงค์ และการบล็อกความล้มเหลวเป็นสามข้อกำหนดแยกกัน สแตกที่ทำได้เพียงข้อแรกจะผ่านการทดสอบด้วยมือในวันดีและรั่วในวันร้าย เขียนคำตอบทั้งสามไว้ข้างไฟล์ compose ที่ที่คนถัดไปจะดู
การแชร์เนมสเปซยังหมายความว่า แอปสืบทอดตัวแก้ชื่อของคอนเทนเนอร์ VPN ซึ่งช่วยเมื่ออุโมงค์ดันเซิร์ฟเวอร์ DNS และทำให้สับสนเมื่อไม่เป็นเช่นนั้น ตรวจสอบว่าเนมสเปซมีอะไรจริง ๆ แทนที่จะถือว่าตัวแก้ชื่อของโฮสต์ใช้ได้ เอกสารอ้างอิงบริการของ Compose บันทึก network_mode, ports และพฤติกรรมของ dependency ไว้ในที่เดียว รวมถึงเหตุใดบริการ network_mode จึงไม่มีที่อยู่ของตัวเอง