การเปลี่ยน default-address-pools ไม่ได้กำหนดหมายเลขเครือข่ายที่คุณมีอยู่แล้วใหม่ และการคาดหวังเช่นนั้นคือสาเหตุที่แผนที่รอบคอบกลายเป็นเหตุขัดข้องที่ไม่คาดคิด การตั้งค่านี้ควบคุมการจัดสรรอัตโนมัติสำหรับเครือข่ายที่สร้างขึ้นหลังจากเดมอนรีสตาร์ตด้วยการกำหนดค่าใหม่ ทุกสิ่งที่ทำงานอยู่แล้วยังคงเก็บซับเน็ตที่ได้รับ เพราะซับเน็ตนั้นเป็นส่วนหนึ่งของคำจำกัดความที่จัดเก็บไว้ของเครือข่าย ตำนานนี้สะดวกเพราะบอกเป็นนัยว่าการแก้ไขครั้งเดียวจะแก้การทับซ้อนทั้งหมด แต่ความเป็นจริงคืองานสองส่วน คือเลือกช่วงที่ว่างจริงแล้วย้ายเครือข่ายที่ไม่ว่าง

ตำนาน: การเปลี่ยนพูลครั้งเดียวแก้การทับซ้อน

ตำนานมีรูปแบบเฉพาะ บางคนอ่านว่าพูลเริ่มต้นของ Docker เปลี่ยนได้ จึงเปลี่ยนมัน รีสตาร์ตเดมอน แล้ว สรุปว่าเครือข่ายคอนเทนเนอร์ไม่ชนกับ VPN ของออฟฟิศอีกต่อไป เครือข่ายเก่ายังอยู่ที่นั่น ยังเชื่อมต่ออยู่ และยังถือที่อยู่ที่ชนกันอยู่

สิ่งที่เปลี่ยนไปคือพฤติกรรมในอนาคตของผู้จัดสรร ซึ่งมีประโยชน์จริงและมีขอบเขตจริง เครือข่ายใหม่ที่สร้างโดยไม่มี --subnet ชัดเจนจะถูกตัดจากพูลใหม่ ส่วนเครือข่ายที่มีอยู่ไม่เคยอยู่ในพูลนั้นเลย การรีสตาร์ตไม่ได้สร้างเครือข่ายใหม่และไม่ได้ย้ายคอนเทนเนอร์ระหว่างกัน หากอาการยังคงอยู่หลังการเปลี่ยนแปลง แสดงว่าการเปลี่ยนแปลงเกิดขึ้นจริงและการวินิจฉัยยังไม่สมบูรณ์

ช่วงฐานและคำนำหน้าที่จัดสรร

การกำหนดค่ามีสองฟิลด์ที่สับสนได้ง่าย base คือช่วงที่ผู้จัดสรรตัดออกมา และ size คือความยาวคำนำหน้าของแต่ละเครือข่ายที่จัดสรร ดังนั้นฐาน 10.10.0.0/16 ที่มีขนาด 24 จะแจก /24 ภายใน /16 นั้น การสลับบทบาทกันทำให้เกิดรูปแบบการจัดสรรที่คุณไม่ได้ตั้งใจ โดยปกติจะเป็นเครือข่ายขนาดยักษ์หนึ่งเครือข่ายหรือพูลที่หมดแล้ว

พูลคือการจอง ไม่ใช่ข้อพิสูจน์ Docker หลีกเลี่ยงความขัดแย้งที่เห็นในตารางเส้นทางของโฮสต์ และไม่สามารถเห็น VPN ที่คุณยังไม่ได้เชื่อมต่อ

ข้อจำกัดนี้คือเหตุผลทั้งหมดที่ต้องเลือกอย่างตั้งใจ ช่วงที่ต้องนำมาเปรียบเทียบคือช่วงที่โฮสต์ต้องเข้าถึง ได้แก่ LAN ของออฟฟิศ ซับเน็ตภายในของ VPN องค์กร คำนำหน้าของแล็บหรือสเตจจิง และโฮสต์คอนเทนเนอร์อื่นใดบน overlay เดียวกัน จดเป็น CIDR ก่อนแตะเดมอน เพราะรายการในหัวจะพลาดช่วงที่สำคัญที่สุด จากนั้นเลือกฐานที่ไม่ทับซ้อนกับช่วงใดเลย และเก็บรายการไว้กับ deployment เพื่อให้คนต่อไปไม่ต้องทำแบบฝึกหัดนี้ซ้ำจากความจำ

จัดทำบัญชีก่อนเลือก

ก่อนอื่นจัดทำบัญชีสิ่งที่มีอยู่ docker network ls แสดงรายการเครือข่าย และ docker network inspect bridge -f '{{.IPAM.Config}}' พิมพ์ซับเน็ตที่เครือข่ายหนึ่งใช้ ทำซ้ำสำหรับทุกเครือข่ายที่ผู้ใช้กำหนด เพราะโปรเจกต์ Compose สร้างของตัวเอง และ --subnet ที่ระบุชัดเจนในไฟล์ compose จะข้ามพูลไปทั้งหมด

ประเด็นสุดท้ายคือสิ่งที่อยู่รอดหลังการย้าย การเปลี่ยนพูลไม่ได้หยุดเพื่อนร่วมงานจากการปักหมุด 172.18.0.0/16 ในไฟล์ compose และความขัดแย้งก็กลับมาพร้อมผู้เขียนคนอื่น

การย้ายสิ่งที่มีอยู่แล้ว

การย้ายเครือข่ายที่มีอยู่เป็นการดำเนินการแยกต่างหากที่รองรับ ทุกเครือข่ายที่ได้รับผลกระทบต้องสร้างใหม่ด้วยซับเน็ตใหม่ ซึ่งหมายถึงการถอดและเชื่อมต่อคอนเทนเนอร์ที่ใช้มันใหม่ และการสร้างเครือข่ายใหม่จะลบการเชื่อมต่อคอนเทนเนอร์แทนที่จะย้ายมัน เก็บโวลุ่มและการกำหนดค่าไว้ และถือว่าการสร้างใหม่เป็นการ deploy ไม่ใช่การรีเซ็ตข้อมูล ทำงานในช่วงเวลาบำรุงรักษา เพราะคอนเทนเนอร์บนเครือข่ายที่สร้างใหม่จะรีสตาร์ตไม่ว่าคุณจะวางแผนไว้หรือไม่

ปฏิบัติตามการกำหนดค่าเดมอนและขั้นตอนการรีสตาร์ตที่ระบุไว้ในเอกสาร และประสานงานการหยุดชะงัก บนโฮสต์ที่มีเดมอนเดียว systemctl restart docker จะรีสตาร์ตคอนเทนเนอร์ตามนโยบายการรีสตาร์ตของแต่ละตัว และนั่นคือพฤติกรรมที่ควรรู้ล่วงหน้าไม่ใช่ภายหลัง

จากนั้นตรวจสอบสองสิ่งที่มีการเปลี่ยนแปลงควรแก้ไข ตรวจดูซับเน็ตใหม่ด้วย docker network inspect และยืนยันว่าอยู่ในฐานที่เลือก จากนั้นตรวจเส้นทางไปยังปลายทาง VPN ตัวแทนด้วย ip route get 10.20.30.40 และ ยืนยันว่าไปยังที่ที่คุณคาดหวัง ไม่ใช่เข้าไปในบริดจ์ ทดสอบการค้นหาบริการและการสื่อสารระหว่างคอนเทนเนอร์ด้วย เพราะเครือข่ายที่สร้างใหม่ด้วยที่อยู่ต่างกันอาจทำให้การแก้ชื่อเสียในลักษณะที่ดูเหมือนบั๊กของแอปพลิเคชัน

อะไรยังพังอยู่หลังจากนั้น

ส่วนที่ยั่งยืนคือบันทึก เก็บรายการการจัดสรร ฐานและขนาดที่เลือก และเครือข่ายที่สร้างใหม่ไว้ที่เดียวกับ deployment

การที่ช่วงเป็นส่วนตัวไม่ได้ทำให้ปลอดภัยต่อการนำกลับมาใช้ซ้ำ 10.0.0.0/8 เป็นส่วนตัวและในขณะเดียวกันก็เป็นสิ่งที่มีแนวโน้มมากที่สุดว่าจะถูกใช้อยู่แล้วที่ใดที่หนึ่งบนเส้นทาง นั่นจึงเป็นเหตุผลที่คำตอบคือการจองที่เฉพาะเจาะจง ไม่ใช่การชอบบล็อกใดบล็อกหนึ่ง เอกสารเครือข่ายของ Docker อธิบายการจัดสรรซับเน็ตอัตโนมัติและฟิลด์ของพูล เลือกช่วงจากสิ่งที่คุณต้องเข้าถึง ไม่ใช่จากสิ่งที่ดูเรียบร้อย

บทความที่เกี่ยวข้อง