- Οι εικόνες Docker πολλαπλών αρχιτεκτονικών βασίζονται σε λίστες μανιφέστων που ομαδοποιούν παραλλαγές για AMD64, ARM64 και άλλα συστήματα.
- Τα QEMU και Docker Buildx σάς επιτρέπουν να μεταγλωττίζετε εικόνες πολλαπλών πλατφορμών, έτοιμες για χρήση σε διαφορετικά περιβάλλοντα από έναν μόνο κεντρικό υπολογιστή Linux.
- Με το Docker Manifest και το BuildX, οι παραλλαγές μπορούν εύκολα να συνδυαστούν και να δημοσιευτούν σε μία μόνο ετικέτα προσβάσιμη από οποιαδήποτε αρχιτεκτονική.
- Η ενσωμάτωση πολλαπλών αρχιτεκτονικών συστημάτων στο CI/CD απλοποιεί τις αναπτύξεις σε ετερογενή συμπλέγματα και διευκολύνει τη μετεγκατάσταση σε διακομιστές ARM χωρίς αλλαγή ετικετών.
Η δημιουργία εικόνων Docker που λειτουργούν εξίσου καλά σε AMD64 και ARM64 δεν είναι πλέον απλώς μια ιδιοτροπία των τεχνών. Είναι πρακτικά απαραίτητη εάν εργάζεστε με Apple Silicon Mac, Raspberry Pi, Graviton σε AWS ή διακομιστές ARM στο cloud. Το τυπικό πρόβλημα: μεταγλωττίζετε στο μηχάνημά σας, ανεβάζετε την εικόνα και όταν την εκτελείτε σε άλλη αρχιτεκτονική, καταρρέει επειδή τα δυαδικά αρχεία δεν ταιριάζουν με την CPU.
Τα καλά νέα είναι ότι Docker, Buildx, QEMU και μανιφέστα πολλαπλών αρχιτεκτονικών Μας επιτρέπουν να δημιουργούμε "μετα-εικόνες" που προσαρμόζονται αυτόματα στην αρχιτεκτονική του κεντρικού υπολογιστή. Δημιουργείτε ένα docker pull με μία μόνο ετικέτα και η μηχανή φροντίζει για τη λήψη της σωστής παραλλαγής για AMD64, ARM64, Windows ή Linux χωρίς να χρειάζεται να παλεύετε με περίεργες ετικέτες.
Τι είναι το Docker και γιατί έχει σημασία η αρχιτεκτονική;

Το Docker είναι μια πλατφόρμα κοντέινερ που συσκευάζει μια εφαρμογή και όλες τις εξαρτήσεις της σε μια αυτόνομη, ελαφριά και απομονωμένη μονάδα. Αυτές οι μονάδες ονομάζονται εικόνες και όταν τις εκτελείτε, λαμβάνετε κοντέινερ. Το κλειδί είναι ότι η εικόνα περιλαμβάνει όλα όσα είναι απαραίτητα για τη λειτουργία της: βασικό σύστημα, βιβλιοθήκες, δυαδικά αρχεία, διαμόρφωση και ούτω καθεξής.
Η χρήση κοντέινερ εξαλείφει πολλά προβλήματα τύπου "λειτουργεί στο μηχάνημά μου", επειδή το περιβάλλον είναι αναπαραγώγιμο σε οποιονδήποτε κεντρικό υπολογιστή συμβατό με Docker. Ωστόσο, υπάρχει ένας σημαντικός περιορισμός: ο κεντρικός υπολογιστής πρέπει να είναι σε θέση να εκτελεί τα δυαδικά αρχεία που περιέχονται στην εικόνα, και εδώ είναι που η αρχιτεκτονική της CPU και το λειτουργικό σύστημα μπαίνουν στο παιχνίδι.
Όταν μιλάμε για αρχιτεκτονική με το Docker, δεν αναφερόμαστε μόνο στο AMD64 έναντι του ARM64 , αλλά και στο λειτουργικό σύστημα: Linux, Windows, διαφορετικές εκδόσεις πυρήνα, κ.λπ. Ένας κεντρικός υπολογιστής Linux x86-64 δεν μπορεί να εκτελέσει απευθείας μια εικόνα με δυαδικά αρχεία των Windows και ένας κεντρικός υπολογιστής ARM64 δεν μπορεί να εκτελέσει δυαδικά αρχεία που έχουν μεταγλωττιστεί μόνο για x86-64 χωρίς εξομοίωση.
AMD64, ARM64 και η άνοδος της ARM στα κέντρα δεδομένων
Η AMD64 (ή x86-64) είναι η εξέλιξη της παλαιότερης αρχιτεκτονικής x86 32-bit, η οποία σχεδιάστηκε αρχικά από την AMD και υιοθετήθηκε σχεδόν από όλους τους κατασκευαστές. Είναι η τυπική αρχιτεκτονική στους περισσότερους επιτραπέζιους υπολογιστές, φορητούς υπολογιστές και πολλούς τρέχοντες διακομιστές. Προσφέρει υποστήριξη 64-bit, μεγαλύτερο χώρο διευθύνσεων και καλύτερη απόδοση σε σύγκριση με την x86 32-bit, διατηρώντας παράλληλα συμβατότητα με παλαιότερο λογισμικό.
Από την άλλη πλευρά, η ARM64 (γνωστή και ως AArch64) είναι μια αρχιτεκτονική RISC που χρησιμοποιείται ιστορικά σε κινητές συσκευές, ενσωματωμένα συστήματα και συσκευές χαμηλής κατανάλωσης. Οι επεξεργαστές της επικεντρώνονται ιδιαίτερα στην ενεργειακή απόδοση, με απλούστερα σχέδια που εκτελούν πολλές μικρές λειτουργίες πολύ γρήγορα, χρησιμοποιώντας λιγότερη ενέργεια και λιγότερο φυσικό χώρο στην πλακέτα κυκλώματος.
Τα τελευταία χρόνια, η ARM έχει κάνει το άλμα στον κόσμο των κέντρων δεδομένων . Κατασκευαστές όπως η AWS (με τους επεξεργαστές Graviton), η Ampere, ακόμη και η Apple με τα τσιπ M1/M2 έχουν αποδείξει ότι η ARM μπορεί να προσφέρει πολύ ελκυστική απόδοση ανά watt σε σύγκριση με το x86-64 για πολλά σύγχρονα φόρτα εργασίας.
Οι κύριοι λόγοι για τους οποίους η ARM κάνει τόσο ισχυρή ώθηση στα κέντρα δεδομένων είναι αρκετοί: καλύτερη ενεργειακή απόδοση (χαμηλότερο κόστος ηλεκτρικής ενέργειας και ψύξης), υψηλότερη πυκνότητα διακομιστών στο ίδιο rack, φθηνότερα τσιπ για κατασκευή και σχέδια βελτιστοποιημένα για φόρτους εργασίας όπως η Τεχνητή Νοημοσύνη, οι βάσεις δεδομένων και οι μικροϋπηρεσίες. Όλα αυτά καθιστούν επιθυμητό για πολλές εταιρείες να μπορούν να αναπτύσσουν τα ίδια κοντέινερ τόσο στο x86-64 όσο και στο ARM64 χωρίς σημαντικά προβλήματα.
Εικόνες πολλαπλών αρχιτεκτονικών: τι πραγματικά είναι
Όταν ακούτε για εικόνες Docker πολλαπλών αρχιτεκτονικών ή πολλαπλών πλατφορμών, μπορεί να φαίνεται ότι υπάρχει μία μόνο μαγική εικόνα ικανή να εκτελεστεί σε οποιαδήποτε CPU ή λειτουργικό σύστημα. Στην πραγματικότητα, αυτό που έχετε στην πραγματικότητα είναι αρκετές "κανονικές" εικόνες, καθεμία κατασκευασμένη για διαφορετική πλατφόρμα, και μια λίστα δηλώσεων ή ευρετήριο που τις ομαδοποιεί κάτω από την ίδια ετικέτα.
Κάθε μεμονωμένη εικόνα περιγράφεται από ένα μανιφέστο εικόνας . Αυτό είναι ένα αρχείο JSON που περιέχει το συνοπτικό αρχείο διαμόρφωσης της εικόνας (κατακερματισμός SHA256), τα επίπεδα των συστατικών της, τα μεγέθη τους και τα μεταδεδομένα. Ουσιαστικά, είναι ένα τεχνικό φύλλο δεδομένων για τη συγκεκριμένη εικόνα. Στο Docker και σε μητρώα όπως το Azure Container Registry, μπορείτε να ελέγξετε αυτά τα μανιφέστα για να δείτε τις λεπτομέρειές τους.
Πάνω από αυτό βρίσκεται η λίστα μανιφέστων (ή ο δείκτης εικόνας OCI) . Αυτή η λίστα ομαδοποιεί πολλά μεμονωμένα μανιφέστα, ένα ανά αρχιτεκτονική/λειτουργικό σύστημα, συμπεριλαμβανομένων των πεδίων πλατφόρμας: CPU (amd64, arm64, 386, ppc64le, s390x, κ.λπ.), λειτουργικό σύστημα (Linux, Windows) και πρόσθετες λεπτομέρειες όπως η έκδοση των Windows.
Όταν κάνετε ένα docker pull miimagen:tag όπου αυτό Η ετικέτα αναφέρεται στην πραγματικότητα σε μια λίστα μανιφέστωνΤο πρόγραμμα-πελάτης Docker ανιχνεύει αυτήν τη δομή, ελέγχει τη δική του αρχιτεκτονική και λειτουργικό σύστημα και κατεβάζει μόνο το μανιφέστο και τα επίπεδα που αντιστοιχούν στην πλατφόρμα του. Στον χρήστη, εμφανίζεται ως μία μόνο εικόνα. Εσωτερικά, είναι ένα μανιφέστο που αναφέρεται σε πολλά ανεξάρτητα αντικείμενα.
Μανιφέστο, λίστες μανιφέστο και πώς να τα διαχειριστείτε
Καθημερινά, το κύριο εργαλείο για την αντιμετώπιση πολλαπλών αρχειοθετημένων μανιφέστων είναι η εντολή docker manifest από το CLI. Αυτή η εντολή είναι πειραματική, επομένως σε ορισμένες διαμορφώσεις Docker πρέπει να ενεργοποιήσετε τις πειραματικές λειτουργίες στη διαμόρφωση του προγράμματος-πελάτη (αρχείο ~/.docker/config.json με "experimental": "enabled").
Ένα τυπικό μανιφέστο εικόνας περιέχει πεδία όπως schemaVersion, mediaType, config και η λίστα των layersΗ λίστα δηλώσεων (για multi-arch) είναι ένα άλλο αρχείο JSON με mediaType ειδικά για λίστες και έναν πίνακα manifests όπου κάθε καταχώρηση υποδεικνύει την αρχιτεκτονική, το λειτουργικό σύστημα, την περίληψη της συγκεκριμένης εικόνας και το μέγεθος. Με docker manifest inspect Μπορείτε να δείτε ακριβώς ποιους συνδυασμούς υποστηρίζει μια δεδομένη ετικέτα.
Μητρώα όπως το Azure Container Registry ή το Docker Hub Κατανοούν εγγενώς αυτές τις λίστες μανιφέστωνΣτο Azure, για παράδειγμα, μπορείτε να δείτε πληροφορίες μανιφέστο χρησιμοποιώντας το CLI (az acr manifest list-metadata) ή από την πύλη. Για να εισαγάγετε μια υπάρχουσα εικόνα πολλαπλών τόξων στο ACR, απλώς χρησιμοποιήστε az acr import Όπως ακριβώς και με μια απλή εικόνα: το ACR θα διατηρήσει την πολυτοξική δομή χωρίς να χρειάζεται να κάνετε κάτι ιδιαίτερο.
Εκτός από το Docker CLI, το Azure ACR Tasks και άλλα συστήματα CI/CD σάς επιτρέπουν να ορίσετε ροές εργασίας πολλαπλών βημάτων στο YAML όπου δημιουργούνται εικόνες συγκεκριμένες για την αρχιτεκτονική, μεταφορτώνονται στο μητρώο και στη συνέχεια δημιουργείται και δημοσιεύεται το ενοποιημένο μανιφέστο. Αυτό ταιριάζει καλά με αγωγούς που ήδη δημιουργούν ξεχωριστά αντικείμενα AMD64 και ARM64.
Γιατί σας ενδιαφέρει η χρήση εικόνων πολλαπλών αρχιτεκτονικών;
Πέρα από τη θεωρία, τα πρακτικά πλεονεκτήματα της απεικόνισης πολλαπλών τόξων είναι αρκετά σαφή όταν εργάζεστε σε μικτές ομάδες ή υβριδικές υποδομές:
- Ίδια ετικέτα για όλουςΟι προγραμματιστές σε Mac ARM, Linux x86-64, Raspberry Pi ή διακομιστές ARM μπορούν να κάνουν
docker pull miapp:latestΚαι ο καθένας θα λάβει την παραλλαγή που του αντιστοιχεί, χωρίς να χρειάζεται να θυμάται επιθήματα ή ετικέτες για την αρχιτεκτονική. - Συμβατότητα με ετερογενείς συστάδεςΣτο Kubernetes ή στο Docker Swarm μπορείτε να έχετε κόμβους AMD64 και ARM64 και να μοιράζεστε βασικές εικόνες για μικροϋπηρεσίες, εργαλεία, βοηθητικά προγράμματα κ.λπ.
- Προοδευτικές μεταναστεύσειςΕίναι εύκολο να δοκιμάσετε ARM και x86-64 παράλληλα. Μπορείτε να εκτελέσετε περιβάλλοντα δοκιμών σε ARM (για λόγους κόστους) και περιβάλλοντα παραγωγής σε x86-64 ή αντίστροφα, και να κάνετε εναλλαγή χωρίς να χρειάζεται να αλλάξετε αναφορές εικόνας.
- Εξοικονόμηση σε CI/CD και cloudΕάν ρυθμίσετε τον διακομιστή δημιουργίας σας σε ARM (για παράδειγμα, μια παρουσία Graviton), μπορείτε να δημιουργήσετε εικόνες πολλαπλών αρχιτεκτονικών δομών και για τις δύο πλατφόρμες από έναν μόνο κεντρικό υπολογιστή χρησιμοποιώντας QEMU και Buildx, εξοικονομώντας χρήματα σε σύγκριση με τη χρήση μόνο μηχανημάτων x86-64.
Δύο στρατηγικές: κλασικό μανιφέστο εναντίον Docker BuildX
Σήμερα έχετε δύο βασικούς τρόπους για να αποκτήσετε μια εικόνα πολλαπλών τόξων συμβατή με AMD64 και ARM64 (και περισσότερες αρχιτεκτονικές αν θέλετε):
Η πρώτη είναι η «κλασική» προσέγγιση, η οποία χρησιμοποιεί docker manifest createΜε αυτήν τη μέθοδο δημιουργείτε μία εικόνα ανά αρχιτεκτονική, η καθεμία με τη δική της ετικέτα (για παράδειγμα miimagen:amd64 y miimagen:arm64), τα ανεβάζετε στο μητρώο και, στη συνέχεια, δημιουργείτε ένα μανιφέστο που τα ομαδοποιεί κάτω από μια «εικονική» ετικέτα (για παράδειγμα miimagen:multi o miimagen:latestΤέλος, προωθείτε αυτό το μανιφέστο στο μητρώο με docker manifest push.
Η δεύτερη στρατηγική περιλαμβάνει τη χρήση Docker BuildxΤο Buildx είναι ένα πρόσθετο CLI που αναθέτει δομές στο BuildKit και προσθέτει εγγενή υποστήριξη για δομές μεταξύ πλατφορμών. Με το Buildx, μπορείτε να δημιουργήσετε και να δημοσιεύσετε όλες τις παραλλαγές και το μανιφέστο σε μία μόνο εντολή, χωρίς να δημιουργείτε και να προωθείτε χειροκίνητα ξεχωριστές εικόνες. Εκτός από --platformΤο Buildx ενσωματώνει σημαίες όπως π.χ. --push να στείλετε απευθείας στο μητρώο και --output για τον έλεγχο του προορισμού (tar, τοπικός, κ.λπ.).
Η επιλογή της μίας ή της άλλης προσέγγισης εξαρτάται από το περιβάλλον σας: Το Docker Manifest είναι πολύ διαφανές και εύκολο στη σύνδεση με την υπάρχουσα υποδομή , ειδικά εάν μεταγλωττίζετε εγγενώς σε κάθε αρχιτεκτονική. Το Buildx, από την άλλη πλευρά, ξεχωρίζει όταν θέλετε να κεντράρετε τη μεταγλώττιση σε έναν μόνο κεντρικό υπολογιστή και να ρυθμίσετε αυτοματοποιημένες διοχετεύσεις για πολλαπλούς στόχους από ένα σημείο.
Προετοιμασία του Ubuntu 24.04 για τη δημιουργία εικόνων AMD64 και ARM64
Εάν εργάζεστε σε Linux, για παράδειγμα Ubuntu 24.04 σε έναν υπολογιστή x86-64 (AMD Ryzen ή Intel), μπορείτε να ρυθμίσετε ένα περιβάλλον ικανό να δημιουργεί εικόνες και για τις δύο αρχιτεκτονικές χρησιμοποιώντας QEMU και Buildx. Αυτό προϋποθέτει ότι το Docker είναι ήδη εγκατεστημένο και λειτουργεί σωστά.
Το πρώτο πράγμα που πρέπει να κάνετε είναι να βεβαιωθείτε ότι το σύστημα είναι ενημερωμένο :
sudo apt update
sudo apt upgrade
Στη συνέχεια, εγκαταστήστε τα απαραίτητα στοιχεία για τη μεταγλώττιση σε πολλαπλές πλατφόρμες: docker-buildxQEMU και υποστήριξη για πολλαπλές δυαδικές μορφές:
sudo apt install docker-buildx qemu-system-arm qemu-user-static binfmt-support
Αυτό θα επιτρέψει στον πυρήνα να χρησιμοποιήσει το QEMU σε λειτουργία χρήστη για να μιμηθεί κλήσεις συστήματος ARM64 σε ένα μηχάνημα AMD64. Στη συνέχεια, συνιστάται να επαληθεύσετε ότι το Docker αναγνωρίζει τις πρόσθετες αρχιτεκτονικές μέσω του BuildX.
sudo docker buildx inspect --bootstrap
Το επόμενο βήμα είναι να δημιουργήσετε ένα συγκεκριμένο εργαλείο δημιουργίας πολλαπλών πλατφορμών και να το ενεργοποιήσετε:
sudo docker buildx create --name multibuilder
sudo docker buildx use multibuilder
sudo docker buildx ls
Στην έξοδο θα δείτε έναν κόμβο με έναν οδηγό docker-container και μια λίστα με τις υποστηριζόμενες πλατφόρμες, μεταξυ τους linux/amd64 y linux/arm64Από εδώ μπορείτε να δημιουργήσετε εικόνες που στοχεύουν και στις δύο αρχιτεκτονικές από το ίδιο μηχάνημα.
Πρακτικό παράδειγμα: εικόνα Ubuntu 24.04 με Apache για AMD64 και ARM64
Για να ελέγξετε ότι όλα λειτουργούν, είναι σύνηθες να προετοιμάζετε ένα απλό αρχείο Docker Με βάση το Ubuntu 24.04, εγκαταστήστε το Apache και εμφανίστε μια σελίδα HTML με το μήνυμα "Hello World". Ας υποθέσουμε ότι έχετε τα αρχεία στο /mnt/storage/dockerfiles/ubuntu-24.04-apache-basic/ και θέλετε να δημιουργήσετε ξεχωριστές εικόνες για AMD64 και ARM64.
Με το Buildx μπορείτε να ξεκινήσετε δύο builds, μία ανά πλατφόρμα, εξάγοντας κάθε αποτέλεσμα ως αρχείο .tar για να το φορτώσετε αργότερα σε άλλα μηχανήματα:
sudo /usr/bin/docker buildx build --platform linux/amd64 \
/mnt/storage/dockerfiles/ubuntu-24.04-apache-basic/ \
-t ubuntu-24.04-apache-basic:latest \
--output type=docker,dest=/mnt/storage/dockerimages/ubuntu-24.04-apache-basic/$(date+"%Y%m%d-%H%M").AMD64.tar
sudo /usr/bin/docker buildx build --platform linux/arm64 \
/mnt/storage/dockerfiles/ubuntu-24.04-apache-basic/ \
-t ubuntu-24.04-apache-basic:latest \
--output type=docker,dest=/mnt/storage/dockerimages/ubuntu-24.04-apache-basic/$(date+"%Y%m%d-%H%M").ARM64.tar
Δεν δημιουργείται ακόμη ένα μανιφέστο πολλαπλών αρχιτεκτονικών αρχιτεκτονικών. Αντίθετα, δημιουργούνται δύο ξεχωριστές εικόνες, μία για κάθε αρχιτεκτονική . Αυτό είναι χρήσιμο για την επαλήθευση ότι κάθε παραλλαγή εκτελείται σωστά στην εγγενή πλατφόρμα της πριν από την ομαδοποίησή της.
Επαληθεύστε την εικόνα σε AMD64 και ARM64
Σε έναν επιτραπέζιο υπολογιστή με Linux x86-64 (για παράδειγμα, έναν επεξεργαστή Ryzen ή Intel), μπορείτε Φορτώστε την εικόνα AMD64 και δοκιμάστε το κοντέινερΑρχικά, ελέγχετε την αρχιτεκτονική του κεντρικού υπολογιστή με hostnamectl (θα δεις) x86-64 ή παρόμοιο), και στη συνέχεια:
sudo docker load -i /mnt/storage/dockerimages/ubuntu-24.04-apache-basic/20251013-0244.AMD64.tar
με docker images Επαληθεύετε ότι η εικόνα είναι διαθέσιμη και, στη συνέχεια, ανασηκώνετε το κοντέινερ:
sudo docker run -d -p 8080:80 --name ubuntu-24.04-apache-basic ubuntu-24.04-apache-basic
Αν ανοίξετε το πρόγραμμα περιήγησής σας στο http://127.0.0.1:8080 Θα πρέπει να δείτε τη σελίδα "Hello World" που παρέχεται από τον Apache. Σε ένα Raspberry Pi 4 (ARM64) Η διαδικασία είναι παρόμοια: εξετάζετε την αρχιτεκτονική με hostnamectl, φορτώνει το .tar Για ARM64, και εκτελείτε το κοντέινερ στη θύρα 8080. Κατά την πρόσβαση στη διεύθυνση IP του Pi (για παράδειγμα http://10.0.0.190:8080) θα διαπιστώσετε ότι λειτουργεί και η παραλλαγή ARM.
Μόλις ολοκληρωθούν οι δοκιμές, είναι καλή ιδέα να καθαρίσετε τα κοντέινερ και τις εικόνες και στα δύο μηχανήματα με:
sudo docker container stop ubuntu-24.04-apache-basic
sudo docker container rm ubuntu-24.04-apache-basic
sudo docker image rm ubuntu-24.04-apache-basic
Δημιουργήστε και δημοσιεύστε ένα μανιφέστο πολλαπλών αρχιτεκτονικών αρχείων χειροκίνητα.
Αν έχετε ήδη δημιουργήσει και ανεβάσει όλες τις παραλλαγές (για παράδειγμα miimagen:arm64 y miimagen:amd64 στο Docker Hub ή στο ACR), το επόμενο βήμα είναι συνδυάστε τις εικόνες σε ένα ενιαίο μανιφέστο πολλαπλών αρχιτεκτονικών ...Για τον σκοπό αυτό, χρησιμοποιούμε docker manifest create υποδεικνύοντας την «μετα-ετικέτα» και τις εικόνες που θα αποτελούν μέρος αυτής.
Ένα τυπικό παράδειγμα για το Azure Container Registry με δύο αρχιτεκτονικές Linux θα ήταν:
docker tag myimage:arm64 \
myregistry.azurecr.io/multi-arch-samples/myimage:arm64
docker push myregistry.azurecr.io/multi-arch-samples/myimage:arm64
docker tag myimage:amd64 \
myregistry.azurecr.io/multi-arch-samples/myimage:amd64
docker push myregistry.azurecr.io/multi-arch-samples/myimage:amd64
Και στη συνέχεια δημιουργείται η λίστα με τα μανιφέστα:
docker manifest create myregistry.azurecr.io/multi-arch-samples/myimage:multi \
myregistry.azurecr.io/multi-arch-samples/myimage:arm64 \
myregistry.azurecr.io/multi-arch-samples/myimage:amd64
Τέλος, υποβάλλετε το μανιφέστο στο μητρώο με:
docker manifest push myregistry.azurecr.io/multi-arch-samples/myimage:multi
Από εκεί και πέρα, οποιοσδήποτε docker pull επί myregistry.azurecr.io/multi-arch-samples/myimage:multi Θα επιστρέψει την κατάλληλη παραλλαγή για την πλατφόρμα από την οποία υποβάλλεται το αίτημα, χωρίς ο χρήστης να χρειάζεται να ανησυχεί για το αν ο κεντρικός υπολογιστής είναι AMD64 ή ARM64.
Αυτοματοποίηση μανιφέστο και πολλαπλής αρχειοθέτησης σε CI/CD
Η ενσωμάτωση αυτής της διαδικασίας σε έναν αγωγό CI/CD εξαλείφει την ανάγκη χειροκίνητης πληκτρολόγησης εντολών κάθε φορά που ανεβάζετε μια νέα έκδοση. Σε περιβάλλοντα όπως το Azure DevOps, μπορείτε να ορίσετε ξεχωριστές εργασίες για τη δημιουργία και την αποστολή των εικόνων Linux και Windows ή των εικόνων AMD64 και ARM64, και στη συνέχεια μια τελική εργασία που δημιουργεί και δημοσιεύει το μανιφέστο πολλαπλών αρχιτεκτονικών αρχιτεκτονικών.
Σε αυτά τα σενάρια, η ενσωματωμένη εργασία Docker χρησιμοποιείται συχνά για Συνδεθείτε με ασφάλεια για να εγγραφείτε (Docker Hub, ACR, κ.λπ.), επιτρέποντας στον αγωγό να χειρίζεται τα διαπιστευτήρια μέσω συνδέσεων υπηρεσίας. Στη συνέχεια, ένα σενάριο Bash μπορεί να αντιγράψει το αρχείο διαμόρφωσης που δημιουργείται από την εργασία Docker, να ενεργοποιήσει την πειραματική λειτουργία και να εκτελέσει docker manifest create y docker manifest push για τις ετικέτες που σας ενδιαφέρουν (για παράδειγμα dev y latest).
Το κλειδί είναι ότι η εργασία δημιουργίας του μανιφέστου εξαρτάται από τις εργασίες που δημιουργούν και προωθούν τις εικόνες . Αυτό διασφαλίζει ότι το μανιφέστο δείχνει πάντα στα σωστά digests. Να θυμάστε ότι εάν επαναμεταγλωττίσετε μία από τις παραλλαγές, το hash SHA256 θα αλλάξει και το μανιφέστο θα πρέπει να δημιουργηθεί ξανά για να αποφευχθεί η παρωχημένη κατάσταση.
Buildx: δομές πολλαπλών πλατφορμών σε μία μόνο εντολή
Το Docker Buildx προχωρά ένα βήμα παραπέρα από την κλασική προσέγγιση, ενσωματώνοντας πολλαπλές αρχιτεκτονικές απευθείας στη διαδικασία κατασκευής . Αντί να δημιουργείτε ξεχωριστές εικόνες και στη συνέχεια να τις συνδυάζετε, μπορείτε να δημιουργήσετε και να δημοσιεύσετε όλες τις αρχιτεκτονικές που χρειάζεστε ταυτόχρονα, μαζί με τις αντίστοιχες λίστες μανιφέστων τους.
Για να χρησιμοποιήσετε το Buildx χρειάζεστε το Docker 19.03 ή νεότερη έκδοση και έναν σύγχρονο πυρήνα (σε Linux, 5.x ή νεότερη έκδοση). Σε πολλές τρέχουσες διανομές, το Buildx διατίθεται ήδη ως πρόσθετο (plugin)docker-buildx-plugin) και απλώς πρέπει να βεβαιωθείτε ότι είναι εγκατεστημένο. Σε άλλες περιπτώσεις, μπορείτε να κατεβάσετε το δυαδικό αρχείο από το GitHub και να το εγκαταστήσετε. ~/.docker/cli-plugins/docker-buildx, επισημαίνοντάς το ως εκτελέσιμο.
Μόλις εγκατασταθεί, δημιουργείτε ένα εργαλείο δημιουργίας και το ενεργοποιείτε :
docker buildx create --name mbuilder
docker buildx use mbuilder
docker buildx inspect --bootstrap
Στην έξοδο θα δείτε ότι ο οδηγός είναι docker-container και μια λίστα με πλατφόρμες που περιλαμβάνει linux/arm64, linux/amd64 και πολλά άλλα (riscv64, ppc64le, s390x, arm v7 και v6…). Αυτό σημαίνει ότι ο κατασκευαστής σας είναι έτοιμος να δημιουργήσει εικόνες για όλες αυτές τις αρχιτεκτονικές χρησιμοποιώντας QEMU σε λειτουργία χρήστη, εάν χρειαστεί.
Το επόμενο βήμα θα ήταν να πάρετε ένα απλό αρχείο Dockerfile, για παράδειγμα:
FROM alpine
RUN apk add util-linux
CMD ["lscpu"]
Και ξεκινήστε μια έκδοση πολλαπλών αρχιτεκτονικών δομών απευθείας στο μητρώο με:
docker buildx build --platform linux/amd64,linux/arm64 -t usuario/demo-multiarch:2 --push .
Με αυτήν την εντολή ο κατασκευαστής Δημιουργεί τις εικόνες για AMD64 και ARM64 παράλληλα., επιλύει την εικόνα βάσης πολλαπλών τόξων (alpineΣε κάθε πλατφόρμα, δημιουργεί τη λίστα δηλώσεων και ανεβάζει τα πάντα στο μητρώο. Στη συνέχεια, μπορείτε να ελέγξετε το αποτέλεσμα με docker buildx imagetools inspect usuario/demo-multiarch:2 Και θα δείτε μια δομή JSON με δύο μανιφέστα, ένα ανά αρχιτεκτονική.
Χρήση σε πραγματικό κόσμο: εκτέλεση της ίδιας εικόνας σε AMD64 και ARM64
Μόλις δημοσιεύσετε μια εικόνα πολλαπλών τόξων, Η κατανάλωση δεν αλλάζει σε σύγκριση με μια κανονική εικόναΑπλώς το κάνεις docker run usuario/demo-multiarch:2 Σε οποιονδήποτε κεντρικό υπολογιστή, το Docker φροντίζει για την ανάκτηση των κατάλληλων δεδομένων. Σε έναν υπολογιστή AMD64, το κοντέινερ θα καταλήξει να αναφέρει Architecture: x86_64 όταν τρέχω lscpu; σε ένα μηχάνημα ARM64 θα εμφανιστεί aarch64.
Αυτό το μοτίβο είναι ιδιαίτερα βολικό εάν αναπτύσσετε σε Mac με τσιπ M1/M2 αλλά αναπτύσσετε σε διακομιστές EC2 AMD64 ή εάν έχετε ένα μείγμα κόμβων Raspberry Pi και x86-64 στην υποδομή σας. Αντί να μεταγλωττίζετε χειροκίνητα στον διακομιστή-στόχο ή να διατηρείτε παράλληλα αποθετήρια εικόνων, συγκεντρώνετε την κατασκευή και δημοσιεύετε μία μόνο αναφορά.
Για γλώσσες με καλή υποστήριξη πολλαπλών αρχιτεκτονικών αρχιτεκτονικών (όπως Go ή Java) μπορείτε ακόμη και μεταγλώττιση του δυαδικού αρχείου μόνο μία φορά για την πλατφόρμα κατασκευής χρησιμοποιώντας --platform=$BUILDPLATFORM σε FROM από το Dockerfile σας και αφήστε το τμήμα χρόνου εκτέλεσης να βασίζεται σε μια εικόνα πολλαπλών αρχιτεκτονικών γραφικών (για παράδειγμα amazoncorretto:11). Με αυτόν τον τρόπο, το ίδιο αρχείο jar ή δυαδικό αρχείο μεταφορτώνεται σε πολλές τελικές εικόνες για διαφορετικές αρχιτεκτονικές.
Έχοντας όλα αυτά κατά νου, η ύπαρξη ενός σαφούς αγωγού και ροής εργασίας για τη δημιουργία εικόνων Docker πολλαπλών αρχιτεκτονικών και τη δημοσίευση του μανιφέστο τους για AMD64 και ARM64 σάς επιτρέπει να μετακινείστε ομαλά μεταξύ ετερογενών περιβαλλόντων ανάπτυξης, να αξιοποιείτε καλύτερα τις CPU ARM στο cloud και να απλοποιείτε τη διαχείριση ετικετών και ανάπτυξης, ελαχιστοποιώντας τα τυπικά προβλήματα συμβατότητας μεταξύ διαφορετικών μηχανημάτων.
Παθιασμένος συγγραφέας για τον κόσμο των byte και της τεχνολογίας γενικότερα. Μου αρέσει να μοιράζομαι τις γνώσεις μου μέσω της γραφής, και αυτό θα κάνω σε αυτό το blog, θα σας δείξω όλα τα πιο ενδιαφέροντα πράγματα σχετικά με τα gadget, το λογισμικό, το υλικό, τις τεχνολογικές τάσεις και πολλά άλλα. Στόχος μου είναι να σας βοηθήσω να περιηγηθείτε στον ψηφιακό κόσμο με απλό και διασκεδαστικό τρόπο.

