Η αλλαγή της προεπιλεγμένης δεξαμενής του Docker δεν επαναριθμεί τα δίκτυα
Η αλλαγή του default-address-pools ρυθμίζει μόνο τα νέα αυτόματα δίκτυα. Καταγράψτε τις περιοχές που χρησιμοποιείτε ήδη και μετά σχεδιάστε τη μετάβαση για ό,τι τρέχει.
Η αλλαγή του default-address-pools δεν επαναριθμεί τα δίκτυα που έχετε ήδη, και το να το περιμένετε είναι ο τρόπος με τον οποίο ένα προσεκτικό σχέδιο μετατρέπεται σε απρόσμενη διακοπή. Η ρύθμιση διέπει την αυτόματη εκχώρηση για δίκτυα που δημιουργούνται αφού ο δαίμονας επανεκκινήσει με τη νέα διαμόρφωση. Ό,τι τρέχει ήδη διατηρεί το υποδίκτυο που του δόθηκε, γιατί αυτό το υποδίκτυο είναι μέρος του αποθηκευμένου ορισμού του δικτύου. Ο μύθος είναι βολικός γιατί υπονοεί ότι μία αλλαγή διορθώνει κάθε επικάλυψη, και η πραγματικότητα είναι δουλειά σε δύο μέρη: διαλέξτε μια περιοχή που είναι πραγματικά ελεύθερη και μετά μεταφέρετε τα δίκτυα που δεν είναι.
Ο μύθος: μία αλλαγή δεξαμενής διορθώνει την επικάλυψη
Ο μύθος έχει συγκεκριμένη μορφή. Κάποιος διαβάζει ότι η προεπιλεγμένη δεξαμενή του Docker μπορεί να αλλάξει, την αλλάζει, επανεκκινεί τον δαίμονα και συμπεραίνει ότι το δίκτυο των containers δεν συγκρούεται πια με το VPN του γραφείου. Το παλιό δίκτυο είναι ακόμη εκεί, ακόμη συνδεδεμένο και κρατά ακόμη τη διεύθυνση που συγκρούεται.
Αυτό που άλλαξε είναι η μελλοντική συμπεριφορά του εκχωρητή, η οποία είναι πραγματικά χρήσιμη και πραγματικά περιορισμένη. Νέα δίκτυα που δημιουργούνται χωρίς ρητό --subnet κόβονται από τη νέα δεξαμενή· τα υπάρχοντα δεν ήταν ποτέ σε αυτή τη δεξαμενή. Μια επανεκκίνηση δεν ξαναχτίζει δίκτυα και δεν μετακινεί containers μεταξύ τους. Αν το σύμπτωμα επιμένει μετά την αλλαγή, η αλλαγή ήταν πραγματική και η διάγνωση ελλιπής.
Βασική περιοχή και εκχωρημένο πρόθεμα
Η διαμόρφωση έχει δύο πεδία που μπερδεύονται εύκολα. Το base είναι η περιοχή από την οποία κόβει ο εκχωρητής, και το size είναι το μήκος προθέματος κάθε εκχωρημένου δικτύου, οπότε μια βάση 10.10.0.0/16 με μέγεθος 24 δίνει /24 μέσα σε αυτό το /16. Η αντιστροφή των ρόλων παράγει μοτίβο εκχώρησης που δεν θέλατε, συνήθως ένα τεράστιο δίκτυο ή μια εξαντλημένη δεξαμενή.
Η δεξαμενή είναι κράτηση, όχι απόδειξη. Το Docker αποφεύγει συγκρούσεις που βλέπει στον πίνακα δρομολόγησης του host και δεν μπορεί να δει VPN στο οποίο δεν έχετε συνδεθεί ακόμη.
Αυτός ο περιορισμός είναι ο λόγος για να διαλέξετε συνειδητά. Οι περιοχές για σύγκριση είναι αυτές που πρέπει να φτάνει ο host: το LAN του γραφείου, τα εσωτερικά υποδίκτυα του εταιρικού VPN, τα προθέματα του εργαστηρίου ή του staging και οποιοσδήποτε άλλος host containers στο ίδιο overlay. Γράψτε τα ως CIDR πριν αγγίξετε τον δαίμονα, γιατί μια λίστα στο κεφάλι θα παραλείψει ακριβώς αυτή που έχει σημασία. Μετά διαλέξτε μια βάση που δεν επικαλύπτεται με καμία και κρατήστε τη λίστα μαζί με την ανάπτυξη ώστε ο επόμενος να μην επαναλάβει την άσκηση από μνήμης.
Καταγράψτε πριν διαλέξετε
Καταγράψτε πρώτα τι υπάρχει. Το docker network ls απαριθμεί τα δίκτυα και το docker network inspect bridge -f '{{.IPAM.Config}}' εκτυπώνει το υποδίκτυο που χρησιμοποιεί ένα συγκεκριμένο. Επαναλάβετε για κάθε δίκτυο που ορίζει ο χρήστης, γιατί τα έργα Compose δημιουργούν δικά τους και ένα ρητό --subnet σε αρχείο compose παρακάμπτει εντελώς τη δεξαμενή.
Το τελευταίο σημείο είναι αυτό που επιβιώνει της μετάβασης. Μια αλλαγή δεξαμενής δεν εμποδίζει έναν συνάδελφο να καρφιτσώσει το 172.18.0.0/16 σε αρχείο compose και η σύγκρουση επιστρέφει με άλλον συγγραφέα.
Μεταφορά ό,τι υπάρχει ήδη
Η μεταφορά υπαρχόντων δικτύων είναι ξεχωριστή, υποστηριζόμενη λειτουργία. Κάθε επηρεαζόμενο δίκτυο πρέπει να ξαναδημιουργηθεί με το νέο υποδίκτυο, που σημαίνει αποσύνδεση και επανασύνδεση των containers που το χρησιμοποιούν, και η επαναδημιουργία δικτύου αφαιρεί τις προσαρτήσεις containers αντί να τις μετακινεί. Διατηρήστε τους τόμους και τη διαμόρφωση και αντιμετωπίστε την επαναδημιουργία ως ανάπτυξη, όχι ως επαναφορά δεδομένων. Κάντε τη δουλειά σε παράθυρο συντήρησης, γιατί τα containers σε επαναδημιουργημένο δίκτυο επανεκκινούν είτε το σχεδιάσατε είτε όχι.
Ακολουθήστε την τεκμηριωμένη διαμόρφωση του δαίμονα και τη διαδικασία επανεκκίνησης και συντονίστε τη διακοπή. Σε host με έναν δαίμονα, το systemctl restart docker επανεκκινεί containers σύμφωνα με τις πολιτικές επανεκκίνησής τους, και αυτή είναι συμπεριφορά που αξίζει να τη γνωρίζετε πριν και όχι μετά.
Μετά επαληθεύστε τα δύο πράγματα που η αλλαγή υποτίθεται ότι θα διόρθωνε. Επιθεωρήστε το νέο υποδίκτυο με docker network inspect και επιβεβαιώστε ότι βρίσκεται μέσα στη βάση που διαλέξατε, μετά ελέγξτε τη διαδρομή προς έναν αντιπροσωπευτικό προορισμό VPN με ip route get 10.20.30.40 και επιβεβαιώστε ότι πηγαίνει εκεί που περιμένετε και όχι σε γέφυρα. Δοκιμάστε επίσης την ανακάλυψη υπηρεσιών και την επικοινωνία container-με-container, γιατί ένα δίκτυο που ξαναδημιουργήθηκε με άλλη διευθυνσιοδότηση μπορεί να σπάσει την επίλυση ονομάτων με τρόπους που μοιάζουν με σφάλμα εφαρμογής.
Τι σπάει ακόμη μετά
Το διαρκές μέρος είναι το αρχείο. Κρατήστε τη λίστα εκχωρήσεων, τη βάση και το μέγεθος που διαλέξατε, και τα δίκτυα που ξαναδημιουργήθηκαν στο ίδιο μέρος με την ανάπτυξη.
Το ότι μια περιοχή είναι ιδιωτική δεν την κάνει ασφαλή για επαναχρησιμοποίηση. Το 10.0.0.0/8 είναι ιδιωτικό και επίσης το πιο πιθανό να χρησιμοποιείται ήδη κάπου στη διαδρομή, γι' αυτό η απάντηση είναι συγκεκριμένη κράτηση και όχι προτίμηση σε ένα μπλοκ. Η τεκμηρίωση δικτύων του Docker περιγράφει την αυτόματη εκχώρηση υποδικτύων και τα πεδία της δεξαμενής. Διαλέξτε την περιοχή με βάση τι πρέπει να φτάσετε, όχι με βάση τι φαίνεται τακτοποιημένο.