Επιστροφή στο blog

Κοινή χρήση δεδομένων μεταξύ κοντέινερ Docker

Κοινή χρήση δεδομένων μεταξύ κοντέινερ Docker

Εισαγωγή

Docker είναι μια πλατφόρμα κοντέινερ (container platform) που αποτελεί ένα ελαφρύ, εικονικοποιημένο, φορητό, καθορισμένο από λογισμικό τυποποιημένο περιβάλλον που επιτρέπει στο λογισμικό να εκτελείται σε απομόνωση από άλλο λογισμικό που εκτελείται στο φυσικό μηχάνημα υποδοχής. Το Docker είναι ένα καθοριστικό στοιχείο της πτυχής της Συνεχούς Ανάπτυξης και Ενσωμάτωσης (Continuous Development and Integration) της Ανάπτυξης Λογισμικού. Παρέχοντας ένα συνεπές περιβάλλον χρόνου εκτέλεσης, το Docker διασφαλίζει ότι το λογισμικό συμπεριφέρεται με τον ίδιο τρόπο ανεξάρτητα από το φυσικό μηχάνημα υποδοχής στο οποίο έχει εγκατασταθεί. Για μια ενδελεχή επισκόπηση του οικοσυστήματος του Docker, δείτε αυτό το άρθρο.

Παρόλο που τα κοντέινερ του Docker είναι αυτόνομα, μερικές φορές χρειάζεται να μοιράζονται την πρόσβαση σε δεδομένα ή να διατηρούν δεδομένα στον δίσκο μετά τη διακοπή λειτουργίας του κοντέινερ. Τα δεδομένα μπορεί να είναι με τη μορφή βάσεων δεδομένων, αρχείων καταγραφής (log files) ή δεδομένων που δημιουργούνται από τον χρήστη. Τέτοια δεδομένα είναι αδύνατο να συμπεριληφθούν σε ένα αρχείο ρυθμίσεων εικόνας Docker, αλλά πρέπει να είναι διαθέσιμα για να εκτελείται η εφαρμογή σας όπως αναμένεται. Η κοινή χρήση και η διατήρηση δεδομένων στα κοντέινερ του Docker γίνεται μέσω των Docker Volumes. Τα Docker Volumes μπορούν να δημιουργηθούν κατά τη δημιουργία του κοντέινερ ή να δημιουργηθούν αργότερα και να προσαρτηθούν σε κοντέινερ. Σε αυτόν τον οδηγό, θα συζητήσουμε τους τέσσερις διαφορετικούς τρόπους κοινής χρήσης δεδομένων μεταξύ κοντέινερ.

Προαπαιτούμενα

Λάβετε υπόψη ότι, παρόλο που εργαζόμαστε με το Ubuntu 20.04, οι οδηγίες και οι εντολές για το Docker θα λειτουργούν σε οποιοδήποτε άλλο λειτουργικό σύστημα με εγκατεστημένο το Docker και τον χρήστη sudo προστιθέμενο στην ομάδα docker, όπως εξηγείται στα παραπάνω προαπαιτούμενα.

Βήμα 1: Δημιουργία Ανεξάρτητων Docker Volumes

Θα ξεκινήσουμε δημιουργώντας ανεξάρτητα volumes που δεν σχετίζονται με κανένα κοντέινερ Docker. Για να το πετύχουμε αυτό, έχουμε την εντολή docker volume create που εισήχθη στην έκδοση Docker 1.9. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε ένα volume με το όνομα Step1DataVolume :

Θα πρέπει να δείτε το ακόλουθο αποτέλεσμα που υποδεικνύει ότι η δημιουργία του volume ήταν επιτυχής:

Docker Volume Create

Τώρα που έχουμε ένα ανεξάρτητο volume, μπορούμε να δημιουργήσουμε ένα νέο κοντέινερ από την επίσημη εικόνα Ubuntu ως παράδειγμα για να το χρησιμοποιήσουμε. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε το κοντέινερ και να προσαρτήσετε το volume:

Σε αυτήν την εντολή, η σημαία --rm θα διαγράψει αυτόματα το κοντέινερ μετά την έξοδο. Η σημαία -v χρησιμοποιείται για τον καθορισμό και την προσάρτηση του volume. Η σημαία -v παίρνει το όνομα του volume, μια άνω-κάτω τελεία και την απόλυτη διαδρομή μέσα στο κοντέινερ όπου θα πρέπει να εμφανίζεται το volume. Λάβετε υπόψη ότι όταν εκτελείται η εντολή, εάν οι καθορισμένοι κατάλογοι στη διαδρομή δεν υπάρχουν, θα δημιουργηθούν. Εάν υπάρχουν ήδη, το προσαρτημένο volume θα αποκρύψει το υπάρχον περιεχόμενο. Για τη σημαία -ti, το -t δίνει πρόσβαση στο τερματικό, και το -i μας επιτρέπει να αλληλεπιδρούμε με το κοντέινερ μέσω του τερματικού.

Ενώ βρίσκεστε μέσα στο κοντέινερ, εκτελέστε την ακόλουθη εντολή για να γράψετε κάποια δεδομένα στο volume:

Πληκτρολογήστε exit και πατήστε enter για να βγείτε από το κοντέινερ. Όπως εξηγήθηκε, το κοντέινερ διαγράφεται αυτόματα όταν βγαίνετε, χάρη στη σημαία --rm, ωστόσο, το volume θα εξακολουθεί να είναι προσβάσιμο.

Για να επαληθεύσετε ότι το volume εξακολουθεί να υπάρχει, μπορείτε να χρησιμοποιήσετε την εντολή docker volume inspect:

Θα πρέπει να δείτε το ακόλουθο αποτέλεσμα:

Docker Volume Inspect

Στη συνέχεια, ας δημιουργήσουμε ένα νέο κοντέινερ. Αρχικά, προσαρτήστε το volume και δείτε αν μπορούμε να έχουμε πρόσβαση στο κείμενο που δημιουργήσαμε στο προηγούμενο κοντέινερ. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε και να εκτελέσετε το κοντέινερ χρησιμοποιώντας τη σημαία ubuntu εικόνα:

Μέσα στο container, εκτελέστε την ακόλουθη εντολή για να επαληθεύσετε ότι το StepOne.txt αρχείο υπάρχει:

Θα πρέπει να δείτε ένα παρόμοιο αποτέλεσμα:

Docker Volume Content 1

Στη συνέχεια, πληκτρολογήστε exit και πιέστε enter για να βγείτε από το container. Σε αυτό το βήμα, μάθατε πώς να χειρίζεστε τη διατήρηση δεδομένων χρησιμοποιώντας ανεξάρτητα Docker volumes και πώς να προσαρτάτε volumes σε containers.

Βήμα 2: Δημιουργία ενός Docker Volume που διατηρεί τα δεδομένα όταν διαγράφετε ένα Container

Σε αυτό το βήμα, θα χρησιμοποιήσουμε μια ενιαία εντολή για να δημιουργήσουμε ένα volume ταυτόχρονα με τη δημιουργία ενός container. Στη συνέχεια, θα διαγράψουμε το container και θα προσαρτήσουμε το volume σε ένα νέο container. Η εντολή είναι παρόμοια με αυτή που χρησιμοποιήθηκε στο Βήμα 1, ωστόσο, προσθέτουμε μία σημαία --name, για να καθορίσουμε ένα όνομα για το container:

Ενώ βρίσκεστε μέσα στο container, εισαγάγετε την ακόλουθη εντολή για να γράψετε δεδομένα στο volume και να επαληθεύσετε ότι τα δεδομένα βρίσκονται εκεί:

Παρακάτω είναι το αποτέλεσμα των τριών εντολών:

Persistent Docker Volume

Στη συνέχεια, βγείτε από το container. Όταν επανεκκινήσετε το container χρησιμοποιώντας την ακόλουθη εντολή, το volume θα προσαρτηθεί αυτόματα:

Μέσα στο container, επαληθεύστε ότι το volume είναι προσαρτημένο ελέγχοντας την ύπαρξη του StepTwo.txt αρχείου χρησιμοποιώντας την εντολή:

Εδώ είναι το αποτέλεσμα:

Docker Volume After Restart

Μπορείτε να βγείτε από το container τώρα. Το Docker εμποδίζει την αφαίρεση ενός volume που αναφέρεται από ένα άλλο container. Μπορείτε να δοκιμάσετε να αφαιρέσετε το volume χρησιμοποιώντας την εντολή:

Θα πρέπει να δείτε το μήνυμα σφάλματος στο αποτέλεσμα:

Error Response

Ας αφαιρέσουμε το container χρησιμοποιώντας το container id που εμφανίζεται στο αποτέλεσμα με την εντολή docker rm:

Αντικαταστήστε το επισημασμένο container id με το id του δικού σας container που εμφανίζεται στο τερματικό σας. Η εντολή αφαιρεί το container, αλλά δεν αφαιρεί το volume που δημιουργήσαμε. Μπορείτε να δείτε τη λίστα με τα διαθέσιμα volumes χρησιμοποιώντας την εντολή docker volume ls για να το επαληθεύσετε:

Εδώ είναι το αποτέλεσμα:

Docker Volume List

Για να αφαιρέσετε το container που δημιουργήθηκε στο Βήμα 2, εισαγάγετε την ακόλουθη εντολή:

Σε αυτό το βήμα, μπορέσατε να δημιουργήσετε ένα Docker volume ταυτόχρονα με τη δημιουργία ενός container. Ας δούμε πώς μπορούμε να δημιουργήσουμε ένα volume από έναν υπάρχοντα κατάλογο με δεδομένα.

Βήμα 3: Δημιουργία ενός Docker Volume από έναν Υπάρχοντα Κατάλογο με Δεδομένα

Αν θέλετε να αντιγράψετε δεδομένα σε ένα volume, μπορείτε να δημιουργήσετε ένα volume κατά τη δημιουργία ενός container και να παρέχετε τη διαδρομή προς έναν κατάλογο που περιέχει τα δεδομένα στην εικόνα βάσης. Στην παρακάτω εντολή, δημιουργούμε ένα container και προσθέτουμε ένα volume δεδομένων στο /var, το οποίο είναι ένας κατάλογος που περιέχει δεδομένα στην εικόνα βάσης:

Όταν εκτελείται η εντολή, το περιεχόμενο από τον κατάλογο /var της εικόνας βάσης θα αντιγραφεί στο volume. Το volume μπορεί να προσαρτηθεί σε ένα νέο container. Στη συνέχεια, βγείτε από το container:

Create Docker Volume

Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε το container, να προσαρτήσετε το volume και να εμφανίσετε τα περιεχόμενα του volume χρησιμοποιώντας την εντολή ls:

Θα πρέπει να δείτε ένα παρόμοιο αποτέλεσμα από την εντολή, το οποίο είναι ένα αντίγραφο των περιεχομένων του καταλόγου /var από την εικόνα βάσης, το οποίο είναι πλέον διαθέσιμο στο Step3DataVolume:

Copy Docker Volume

Αν και η προσάρτηση του /var καταλόγου όπως κάναμε σε αυτό το παράδειγμα μπορεί να μην είναι πρακτική, μας βοηθά να κατανοήσουμε ότι μπορείτε να προσαρτήσετε οποιονδήποτε κατάλογο δημιουργείται στις προσαρμοσμένες εικόνες σας σε έναν τόμο Docker για να καταστήσετε τα δεδομένα διαθέσιμα σε άλλους περιέκτες.

Βήμα 4: Κοινή χρήση δεδομένων μεταξύ πολλαπλών περιεκτών Docker

Στις περισσότερες περιπτώσεις, θα θέλετε πολλαπλοί περιέκτες να έχουν πρόσβαση σε δεδομένα από έναν τόμο Docker. Στα προηγούμενα παραδείγματα, έχουμε συνδέσει έναν τόμο μόνο σε έναν περιέκτη. Τώρα, θα μάθετε πώς να συνδέετε έναν τόμο σε πολλαπλούς περιέκτες. Αν και μπορείτε να το επιτύχετε εύκολα, το Docker δεν διαχειρίζεται το κλείδωμα αρχείων. Για πολλαπλούς περιέκτες που γράφουν στον ίδιο τόμο, πρέπει να σχεδιάσετε ξεχωριστά τις εφαρμογές που εκτελούνται σε αυτούς τους περιέκτες ώστε να χειρίζονται την εγγραφή σε κοινόχρηστους χώρους αποθήκευσης δεδομένων για την αποφυγή καταστροφής δεδομένων.

  • Δημιουργήστε το Step4Container1 και το Step4DataVolume

Χρησιμοποιήστε την εντολή docker run με τη σημαία --name για να δημιουργήσετε έναν επώνυμο περιέκτη:

Μέσα στον περιέκτη, εκτελέστε την ακόλουθη εντολή για να δημιουργήσετε ένα αρχείο κειμένου και να προσθέσετε κάποιο κείμενο:

Μετά από αυτό, βγείτε από τον περιέκτη και επιστρέψτε στο περιβάλλον του κεντρικού υπολογιστή. Τώρα, θέλουμε να δημιουργήσουμε έναν άλλο περιέκτη και να προσαρτήσουμε τους τόμους από το Step4Container1 σε αυτόν.

  • Δημιουργήστε το Step4Container2 και συνδέστε τους τόμους από τον περιέκτη Step4Container1

Εκτελέστε την ακόλουθη εντολή για να δημιουργήσετε το Step4Container2 και να προσαρτήσετε τόμους από το Step4Container1:

Μέσα στον περιέκτη, χρησιμοποιήστε την εντολή cat για να επαληθεύσετε την επιμονή των δεδομένων:

Θα πρέπει να δείτε το ακόλουθο αποτέλεσμα:

Container Data Sharing

Μπορούμε να προσθέσουμε λίγο ακόμα κείμενο στο αρχείο από το Step4Container2 εισάγοντας την ακόλουθη εντολή:

Βγείτε από τον περιέκτη μετά από αυτό και θα επιστρέψουμε στο Step4Container1 για να ελέγξουμε αν τα δεδομένα είναι ακόμα εκεί.

  • Επαλήθευση αλλαγών που έγιναν στον τόμο Docker μεταξύ διαφορετικών περιεκτών

Για να δείτε τις αλλαγές, θα επανεκκινήσετε πρώτα το Step4Container1 χρησιμοποιώντας την εντολή:

Ελέγξτε για αλλαγές χρησιμοποιώντας την εντολή:

Θα πρέπει να δείτε ένα αποτέλεσμα παρόμοιο με το παρακάτω στιγμιότυπο οθόνης:

Copied Container Data

Αφού επαληθεύσετε ότι και οι δύο περιέκτες μπορούν να διαβάζουν και να γράφουν δεδομένα στον ίδιο τόμο, μπορείτε τώρα να βγείτε από τον περιέκτη. Όπως αναφέρθηκε, το Docker δεν διαχειρίζεται το κλείδωμα αρχείων, είναι δουλειά της λογικής της εφαρμογής σας που εκτελείται μέσα στους περιέκτες να χειρίζεται την πρόσβαση ανάγνωσης-εγγραφής σε κοινόχρηστους χώρους αποθήκευσης δεδομένων. Το Docker επιτρέπει την προσάρτηση τόμων ως μόνο για ανάγνωση για την αποφυγή τυχαίας καταστροφής δεδομένων από περιέκτες που απαιτούν μόνο πρόσβαση ανάγνωσης, προσθέτοντας :ro όπως φαίνεται στο επόμενο παράδειγμα.

  • Προσάρτηση τόμου σε περιέκτη Docker ως μόνο για ανάγνωση

Για αυτό το παράδειγμα, θα δημιουργήσουμε έναν περιέκτη με το όνομα Step4Container3. Στην εντολή δημιουργίας, προσαρτούμε τόμους από το Step4Container1 και προσθέτουμε :ro για να καθορίσουμε ότι αυτός ο περιέκτης έχει πρόσβαση μόνο για ανάγνωση αλλά δεν μπορεί να γράψει στον τόμο. Εκτελέστε την ακόλουθη εντολή στο τερματικό σας:

Μόλις βρεθείτε μέσα στον περιέκτη, μπορείτε να διαβάσετε το αρχείο κειμένου στον τόμο εισάγοντας την ακόλουθη εντολή:

Read Only Mount

Ωστόσο, εάν προσπαθήσετε να αφαιρέσετε το αρχείο χρησιμοποιώντας την εντολή:

Θα λάβετε ένα μήνυμα σφάλματος στο τερματικό σας όπως:

Read Only Error

Μόλις επαληθεύσετε τα δικαιώματα ανάγνωσης-εγγραφής, μπορείτε να βγείτε από το container. Εάν θέλετε να καθαρίσετε τα containers και το volume που δημιουργήθηκαν σε αυτόν τον οδηγό, εκτελέστε τις ακόλουθες εντολές:

Σε αυτό το βήμα, μάθατε πώς να μοιράζεστε δεδομένα μεταξύ πολλαπλών containers χρησιμοποιώντας Docker volumes καθώς και να προσαρτάτε volumes δεδομένων σε containers ως μόνο για ανάγνωση.

Συμπέρασμα

Σε αυτόν τον οδηγό, δημιουργήσατε μερικά Docker volumes και μάθατε πώς να μοιράζεστε δεδομένα μεταξύ Docker containers. Κατά τη διαχείριση της κοινής χρήσης δεδομένων μεταξύ containers, σημειώσαμε ότι η μεμονωμένη λογική της εφαρμογής μέσα στο container πρέπει να χειρίζεται το κλείδωμα αρχείων για την αποτροπή καταστροφής δεδομένων κατά την εγγραφή σε κοινόχρηστους χώρους αποθήκευσης δεδομένων, καθώς το Docker δεν διαθέτει υλοποίηση για το χειρισμό του κλειδώματος αρχείων.

Για περισσότερους πόρους σχετικά με τη χρήση του Docker, ίσως θέλετε να δείτε περισσότερους οδηγούς στο blog μας:

Καλή συνέχεια!

author

Pranay Kapgate

Συγγραφέας · CloudSigma

Ο Preslav Dobrev είναι Δημιουργικός Σχεδιαστής στην CloudSigma, με εστίαση στη συνεπή επιχειρηματική ταυτότητα μέσω παραδοσιακών και καινοτόμων καναλιών μάρκετινγκ. Διαθέτει την ικανότητα να συνδυάζει το καλλιτεχνικό όραμα με το στρατηγικό μάρκετινγκ για τη δημιουργία εντυπωσιακών αφηγήσεων επωνυμίας.

Σχόλια

Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.