Αν σας αρέσουν οι φάλαινες ή απλά ενδιαφέρεστε για γρήγορη και ανώδυνη συνεχή παράδοση του λογισμικού σας στην παραγωγή, σας καλώ να διαβάσετε αυτό το εισαγωγικό Docker Tutorial. Όλα δείχνουν ότι τα κοντέινερ λογισμικού είναι το μέλλον της πληροφορικής, οπότε ας πάμε για μια γρήγορη βουτιά με τις φάλαινες κοντέινερ Moby Dock και υποκοριστικό της Mary .
Το Docker, που αντιπροσωπεύεται από ένα λογότυπο με μια φιλική φάλαινα, είναι ένα έργο ανοιχτού κώδικα που διευκολύνει την ανάπτυξη εφαρμογών μέσα σε δοχεία λογισμικού. Η βασική λειτουργικότητά του ενεργοποιείται από δυνατότητες απομόνωσης πόρων του πυρήνα Linux, αλλά παρέχει ένα φιλικό προς το χρήστη API. Η πρώτη έκδοση κυκλοφόρησε το 2013 και έκτοτε έγινε εξαιρετικά δημοφιλής και χρησιμοποιείται ευρέως από πολλούς μεγάλους παίκτες όπως eBay, Spotify, Baidu και άλλα . Στον τελευταίο γύρο χρηματοδότησης, Ο Ντόκερ έχει προσγειώσει τεράστια 95 εκατομμύρια δολάρια , και είναι σε καλό δρόμο να γίνει βασικό στοιχείο Υπηρεσίες DevOps .
Η φιλοσοφία πίσω από το Docker θα μπορούσε να απεικονιστεί με την ακόλουθη απλή αναλογία. Στη διεθνή βιομηχανία μεταφορών, τα εμπορεύματα πρέπει να μεταφέρονται με διαφορετικά μέσα όπως περονοφόρα ανυψωτικά οχήματα, φορτηγά, τρένα, γερανοί και πλοία. Αυτά τα προϊόντα διατίθενται σε διαφορετικά σχήματα και μεγέθη και έχουν διαφορετικές απαιτήσεις αποθήκευσης: σάκοι ζάχαρης, δοχεία γάλακτος, φυτά κ.λπ. Ιστορικά, ήταν μια επώδυνη διαδικασία ανάλογα με τη χειροκίνητη παρέμβαση σε κάθε σημείο διέλευσης για φόρτωση και εκφόρτωση.
τι είναι το pmo στη διαχείριση έργου
Όλα άλλαξαν με την πρόσληψη διατροπικών δοχείων. Καθώς διατίθενται σε τυποποιημένα μεγέθη και κατασκευάζονται με γνώμονα τη μεταφορά, όλα τα σχετικά μηχανήματα μπορούν να σχεδιαστούν για να τα χειρίζονται με ελάχιστη ανθρώπινη παρέμβαση. Το πρόσθετο πλεονέκτημα των σφραγισμένων δοχείων είναι ότι μπορούν να διατηρήσουν το εσωτερικό περιβάλλον, όπως η θερμοκρασία και η υγρασία για ευαίσθητα προϊόντα. Ως αποτέλεσμα, η βιομηχανία μεταφορών μπορεί να σταματήσει να ανησυχεί για τα ίδια τα προϊόντα και να επικεντρωθεί στη μεταφορά τους από το Α στο Β.
Και εδώ έρχεται το Docker και φέρνει παρόμοια οφέλη στο λογισμικό βιομηχανία.
Με μια γρήγορη ματιά, εικονικές μηχανές και κοντέινερ Docker μπορεί να μοιάζουν. Ωστόσο, οι κύριες διαφορές τους θα γίνουν εμφανείς όταν ρίξετε μια ματιά στο παρακάτω διάγραμμα:
Οι εφαρμογές που εκτελούνται σε εικονικές μηχανές, εκτός από τον επόπτη, απαιτούν μια πλήρη παρουσία του λειτουργικού συστήματος και τυχόν υποστηρικτικών βιβλιοθηκών. Τα κοντέινερ, από την άλλη πλευρά, μοιράζονται το λειτουργικό σύστημα με τον κεντρικό υπολογιστή. Το Hypervisor είναι συγκρίσιμο με τον κινητήρα του κοντέινερ (αντιπροσωπεύεται ως Docker στην εικόνα) με την έννοια ότι διαχειρίζεται τον κύκλο ζωής των δοχείων. Η σημαντική διαφορά είναι ότι οι διεργασίες που εκτελούνται μέσα στα κοντέινερ είναι ακριβώς όπως οι εγγενείς διεργασίες στον κεντρικό υπολογιστή και δεν εισάγουν γενικά έξοδα που σχετίζονται με την εκτέλεση του επόπτη. Επιπλέον, οι εφαρμογές μπορούν να επαναχρησιμοποιήσουν τις βιβλιοθήκες και να μοιραστούν τα δεδομένα μεταξύ κοντέινερ.
Καθώς και οι δύο τεχνολογίες έχουν διαφορετικά πλεονεκτήματα, είναι σύνηθες να βρίσκουμε συστήματα που συνδυάζουν εικονικές μηχανές και δοχεία. Ένα τέλειο παράδειγμα είναι ένα εργαλείο που ονομάζεται Boot2Docker που περιγράφεται στην ενότητα εγκατάστασης του Docker.
Στην κορυφή του διαγράμματος αρχιτεκτονικής υπάρχουν μητρώα. Από προεπιλογή, το κύριο μητρώο είναι το Docker Hub που φιλοξενεί δημόσιες και επίσημες εικόνες. Οι οργανισμοί μπορούν επίσης να φιλοξενήσουν τα ιδιωτικά τους μητρώα εάν το επιθυμούν.
Στη δεξιά πλευρά έχουμε εικόνες και κοντέινερ. Μπορείτε να κατεβάσετε εικόνες από τα μητρώα ρητά (docker pull imageName
) ή σιωπηρά κατά την εκκίνηση ενός κοντέινερ. Μόλις ληφθεί η εικόνα, αποθηκεύεται προσωρινά στην κρυφή μνήμη.
Τα δοχεία είναι τα στιγμιότυπα των εικόνων - είναι το ζωντανό πράγμα. Θα μπορούσαν να λειτουργούν πολλά κοντέινερ με βάση την ίδια εικόνα.
Στο κέντρο, υπάρχει ο δαίμονας Docker υπεύθυνος για τη δημιουργία, λειτουργία και παρακολούθηση κοντέινερ. Φροντίζει επίσης την κατασκευή και αποθήκευση εικόνων. Τέλος, στην αριστερή πλευρά υπάρχει ένας πελάτης Docker. Μιλά στον δαίμονα μέσω HTTP. Οι υποδοχές Unix χρησιμοποιούνται όταν βρίσκονται στο ίδιο μηχάνημα, αλλά η απομακρυσμένη διαχείριση είναι δυνατή μέσω API που βασίζεται σε HTTP.
Για τις πιο πρόσφατες οδηγίες πρέπει πάντα να ανατρέξετε στο επίσημη τεκμηρίωση .
Το Docker εκτελείται εγγενώς στο Linux, οπότε ανάλογα με την κατανομή στόχων θα μπορούσε να είναι τόσο εύκολο όσο το sudo apt-get install docker.io
. Ανατρέξτε στην τεκμηρίωση για λεπτομέρειες. Κανονικά στο Linux, προπληρώνετε τις εντολές Docker με sudo
, αλλά θα το παραλείψουμε σε αυτό το άρθρο για λόγους σαφήνειας.
Καθώς ο δαίμονας Docker χρησιμοποιεί λειτουργίες πυρήνα για Linux, δεν είναι δυνατό να εκτελέσετε εγγενώς το Docker σε Mac OS ή Windows. Αντ 'αυτού, θα πρέπει να εγκαταστήσετε μια εφαρμογή που ονομάζεται Boot2Docker. Η εφαρμογή αποτελείται από μια εικονική μηχανή VirtualBox, το ίδιο το Docker και τα βοηθητικά προγράμματα διαχείρισης Boot2Docker. Μπορείτε να ακολουθήσετε τις επίσημες οδηγίες εγκατάστασης για MacOS και Παράθυρα για να εγκαταστήσετε το Docker σε αυτές τις πλατφόρμες.
Ας ξεκινήσουμε αυτήν την ενότητα με ένα γρήγορο παράδειγμα:
τι είναι ένα γωνιακό συστατικό
docker run phusion/baseimage echo 'Hello Moby Dock. Hello Molly.'
Πρέπει να δούμε αυτήν την έξοδο:
Hello Moby Dock. Hello Molly.
Ωστόσο, πολλά περισσότερα έχουν συμβεί πίσω από τα παρασκήνια από ό, τι νομίζετε:
Κατά την πρώτη εκτέλεση, ενδέχεται να παρατηρήσετε καθυστέρηση πριν από την εκτύπωση του κειμένου στην οθόνη. Εάν η εικόνα είχε προσωρινά αποθηκευτεί τοπικά, όλα θα είχαν πάρει ένα κλάσμα του δευτερολέπτου. Λεπτομέρειες σχετικά με το τελευταίο κοντέινερ μπορούν να ανακτηθούν εκτελώντας docker ps -l
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af14bec37930 phusion/baseimage:latest 'echo 'Hello Moby Do 2 minutes ago Exited (0) 3 seconds ago stoic_bardeen
Όπως μπορείτε να πείτε, η εκτέλεση μιας απλής εντολής στο Docker είναι τόσο εύκολη όσο η εκτέλεση απευθείας σε ένα τυπικό τερματικό. Για να δείξουμε μια πιο πρακτική περίπτωση χρήσης, σε όλο το υπόλοιπο αυτού του άρθρου, θα δούμε πώς μπορούμε να χρησιμοποιήσουμε το Docker για να αναπτύξουμε μια απλή εφαρμογή διακομιστή ιστού. Για να διατηρήσουμε τα πράγματα απλά, θα γράψουμε ένα πρόγραμμα Java που χειρίζεται αιτήματα HTTP GET στο «/ ping» και θα ανταποκρίνεται με τη συμβολοσειρά «pong n».
import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; public class PingPong { public static void main(String[] args) throws Exception { HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); server.createContext('/ping', new MyHandler()); server.setExecutor(null); server.start(); } static class MyHandler implements HttpHandler { @Override public void handle(HttpExchange t) throws IOException { String response = 'pong
'; t.sendResponseHeaders(200, response.length()); OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); } } }
Πριν μεταβείτε και δημιουργήσετε τη δική σας εικόνα Docker, είναι καλή πρακτική να ελέγξετε πρώτα εάν υπάρχει ήδη στο Docker Hub ή σε ιδιωτικά μητρώα στα οποία έχετε πρόσβαση. Για παράδειγμα, αντί να εγκαταστήσουμε τους εαυτούς μας Java, θα χρησιμοποιήσουμε μια επίσημη εικόνα: java:8
.
Για να δημιουργήσουμε μια εικόνα, πρώτα πρέπει να αποφασίσουμε για μια βασική εικόνα που πρόκειται να χρησιμοποιήσουμε. Δηλώνεται με ΑΠΟ εντολή. Εδώ, είναι μια επίσημη εικόνα για Java 8 από το Docker Hub. Θα το αντιγράψουμε στο αρχείο Java εκδίδοντας ένα ΑΝΤΙΓΡΑΦΟ εντολή. Στη συνέχεια, θα το συντάξουμε ΤΡΕΞΙΜΟ . ΕΚΘΕΤΩ Η οδηγία υποδηλώνει ότι η εικόνα θα παρέχει μια υπηρεσία σε μια συγκεκριμένη θύρα. ΣΗΜΕΙΟ ΕΙΣΟΔΟΥ είναι μια οδηγία που θέλουμε να εκτελέσουμε κατά την εκκίνηση ενός κοντέινερ που βασίζεται σε αυτήν την εικόνα και CMD υποδεικνύει τις προεπιλεγμένες παραμέτρους που θα μεταβιβαστούμε σε αυτήν.
FROM java:8 COPY PingPong.java / RUN javac PingPong.java EXPOSE 8080 ENTRYPOINT ['java'] CMD ['PingPong']
Αφού αποθηκεύσουμε αυτές τις οδηγίες σε ένα αρχείο που ονομάζεται 'Dockerfile', μπορούμε να δημιουργήσουμε την αντίστοιχη εικόνα Docker εκτελώντας:
docker build -t toptal/pingpong .
Η επίσημη τεκμηρίωση για το Docker έχει ένα ενότητα αφιερωμένη στις βέλτιστες πρακτικές σχετικά με το γράψιμο του Dockerfile.
Όταν η εικόνα έχει δημιουργηθεί, μπορούμε να την φέρουμε στη ζωή ως δοχείο. Υπάρχουν πολλοί τρόποι με τους οποίους θα μπορούσαμε να τρέξουμε κοντέινερ, αλλά ας ξεκινήσουμε με έναν απλό:
docker run -d -p 8080:8080 toptal/pingpong
που -p [port-on-the-host]: [port-in-the-container] δηλώνει τη χαρτογράφηση θυρών στον κεντρικό υπολογιστή και το κοντέινερ αντίστοιχα. Επιπλέον, λέμε στο Docker να τρέξει το κοντέινερ ως διαδικασία δαίμονα στο παρασκήνιο καθορίζοντας -ρε . Μπορείτε να ελέγξετε εάν η εφαρμογή διακομιστή ιστού εκτελείται προσπαθώντας να αποκτήσετε πρόσβαση στο 'http: // localhost: 8080 / ping'. Σημειώστε ότι σε πλατφόρμες όπου χρησιμοποιείται το Boot2docker, θα πρέπει να αντικαταστήσετε το 'localhost' με τη διεύθυνση IP της εικονικής μηχανής όπου εκτελείται το Docker.
Σε Linux:
curl http://localhost:8080/ping
Σε πλατφόρμες που απαιτούν Boot2Docker:
curl $(boot2docker ip):8080/ping
Εάν όλα πάνε καλά, θα πρέπει να δείτε την απάντηση:
pong
Hurray, το πρώτο μας προσαρμοσμένο κοντέινερ Docker είναι ζωντανό και κολυμπά! Θα μπορούσαμε επίσης να ξεκινήσουμε το κοντέινερ σε διαδραστική λειτουργία -α- . Στην περίπτωσή μας, θα παρακάμψουμε το σημείο εισόδου εντολή, ώστε να έχουμε ένα τερματικό bash. Τώρα μπορούμε να εκτελέσουμε τις εντολές που θέλουμε, αλλά η έξοδος από το κοντέινερ θα το σταματήσει:
docker run -i -t --entrypoint='bash' toptal/pingpong
Υπάρχουν πολλές ακόμη διαθέσιμες επιλογές για την εκκίνηση των κοντέινερ. Ας καλύψουμε μερικά ακόμη. Για παράδειγμα, εάν θέλουμε να διατηρήσουμε δεδομένα εκτός του κοντέινερ, θα μπορούσαμε να μοιραστούμε το σύστημα αρχείων κεντρικού υπολογιστή με το κοντέινερ χρησιμοποιώντας -β . Από προεπιλογή, η λειτουργία πρόσβασης είναι ανάγνωση-εγγραφή, αλλά θα μπορούσε να αλλάξει σε λειτουργία μόνο για ανάγνωση προσαρτώντας :ro
στη διαδρομή έντασης εντός του κοντέινερ. Οι τόμοι είναι ιδιαίτερα σημαντικοί όταν πρέπει να χρησιμοποιήσουμε τυχόν πληροφορίες ασφαλείας, όπως διαπιστευτήρια και ιδιωτικά κλειδιά μέσα στα δοχεία, τα οποία δεν πρέπει να αποθηκεύονται στην εικόνα. Επιπλέον, θα μπορούσε επίσης να αποτρέψει την επανάληψη δεδομένων, για παράδειγμα, χαρτογραφώντας το τοπικό αποθετήριο Maven στο κοντέινερ για να σας σώσει από τη λήψη του Διαδικτύου δύο φορές.
Ο κόμβος js κάνει την ασύγχρονη κλήση σύγχρονη
Το Docker έχει επίσης τη δυνατότητα σύνδεσης των εμπορευματοκιβωτίων. Τα συνδεδεμένα εμπορευματοκιβώτια μπορούν να μιλούν μεταξύ τους ακόμη και αν καμία από τις θύρες δεν είναι εκτεθειμένη. Μπορεί να επιτευχθεί με –Συνδέστε το όνομα άλλου κοντέινερ . Ακολουθεί ένα παράδειγμα που συνδυάζει τις παραπάνω παραμέτρους:
docker run -p 9999:8080 --link otherContainerA --link otherContainerB -v /Users/$USER/.m2/repository:/home/user/.m2/repository toptal/pingpong
Δεν αποτελεί έκπληξη το γεγονός ότι η λίστα των λειτουργιών που μπορεί να εφαρμοστεί στα κοντέινερ και τις εικόνες είναι αρκετά μεγάλη. Για συντομία, ας δούμε μερικά μόνο από αυτά:
Η τελευταία εντολή θα μπορούσε να είναι ιδιαίτερα χρήσιμη για σκοπούς εντοπισμού σφαλμάτων, καθώς σας επιτρέπει να συνδεθείτε σε ένα τερματικό ενός τρέχοντος κοντέινερ:
docker exec -i -t bash
Εάν έχετε κάτι παραπάνω από δύο διασυνδεδεμένα δοχεία, είναι λογικό να χρησιμοποιήσετε ένα εργαλείο όπως λιμενεργάτης . Σε ένα αρχείο διαμόρφωσης, περιγράφετε πώς να ξεκινήσετε τα κοντέινερ και πώς πρέπει να συνδέονται μεταξύ τους. Ανεξάρτητα από την ποσότητα των εμπορευματοκιβωτίων που εμπλέκονται και τις εξαρτήσεις τους, θα μπορούσατε να τα έχετε όλα σε λειτουργία με μία εντολή: docker-compose up
.
Ας ρίξουμε μια ματιά σε τρία στάδια του κύκλου ζωής του έργου και ας δούμε πώς θα μπορούσε να βοηθήσει η φιλική μας φάλαινα.
Το Docker σάς βοηθά να διατηρείτε το περιβάλλον τοπικής ανάπτυξης καθαρό. Αντί να έχετε εγκατεστημένες πολλές εκδόσεις διαφορετικών υπηρεσιών, όπως Java, Kafka, Spark, Cassandra κ.λπ., μπορείτε απλώς να ξεκινήσετε και να σταματήσετε ένα απαιτούμενο κοντέινερ όταν είναι απαραίτητο. Μπορείτε να προχωρήσετε ένα βήμα παραπέρα και να εκτελέσετε πολλές στοίβες λογισμικού παράλληλα, αποφεύγοντας τη μίξη των εκδόσεων εξάρτησης.
Με το Docker, μπορείτε να εξοικονομήσετε χρόνο, προσπάθεια και χρήματα. Εάν το έργο σας είναι πολύ περίπλοκο για να το ρυθμίσετε, 'λιπαίνετε'. Περάστε από τον πόνο της δημιουργίας μιας εικόνας Docker μία φορά, και από αυτό το σημείο όλοι μπορούν να ξεκινήσουν ένα κοντέινερ σε μια στιγμή.
Μπορείτε επίσης να έχετε ένα 'περιβάλλον ενσωμάτωσης' που εκτελείται τοπικά (ή σε CI) και να αντικαταστήσετε τα stubs με πραγματικές υπηρεσίες που εκτελούνται σε κοντέινερ Docker.
Με το Dockerfile, είναι εύκολο να επιτύχετε αναπαραγωγές εκδόσεις. Οι Jenkins ή άλλες λύσεις CI μπορούν να ρυθμιστούν ώστε να δημιουργούν μια εικόνα Docker για κάθε έκδοση. Θα μπορούσατε να αποθηκεύσετε μερικές ή όλες τις εικόνες σε ένα ιδιωτικό μητρώο Docker για μελλοντική αναφορά.
Με το Docker, δοκιμάζετε μόνο όσα πρέπει να δοκιμάσετε και βγάζετε το περιβάλλον από την εξίσωση. Η εκτέλεση δοκιμών σε ένα κοντέινερ που τρέχει μπορεί να βοηθήσει να διατηρήσουμε τα πράγματα πολύ πιο προβλέψιμα.
Ένα άλλο ενδιαφέρον χαρακτηριστικό της ύπαρξης κοντέινερ λογισμικού είναι ότι είναι εύκολο να ξεδιπλωθούν οι σκλάβοι με την ίδια ρύθμιση ανάπτυξης. Μπορεί να είναι ιδιαίτερα χρήσιμο για τη δοκιμή φορτίων των ομαδοποιημένων αναπτύξεων.
Το Docker μπορεί να είναι μια κοινή διεπαφή μεταξύ προγραμματιστών και προσωπικού λειτουργίας εξαλείφοντας μια πηγή τριβής. Ενθαρρύνει επίσης την ίδια εικόνα / δυαδικά αρχεία να χρησιμοποιούνται σε κάθε βήμα του αγωγού. Επιπλέον, η δυνατότητα ανάπτυξης πλήρως δοκιμασμένου κοντέινερ χωρίς διαφορές περιβάλλοντος συμβάλλει στη διασφάλιση ότι δεν εισάγονται σφάλματα στη διαδικασία κατασκευής.
γ******* συλλογή
Μπορείτε να μεταφέρετε απρόσκοπτα εφαρμογές στην παραγωγή. Κάτι που κάποτε ήταν μια κουραστική και ασταθή διαδικασία μπορεί τώρα να είναι τόσο απλό όσο:
docker stop container-id; docker run new-image
Και αν κάτι πάει στραβά κατά την ανάπτυξη μιας νέας έκδοσης, μπορείτε πάντα να κάνετε γρήγορη επαναφορά ή αλλαγή σε άλλο κοντέινερ:
docker stop container-id; docker start other-container-id
… Εγγυημένη ότι δεν θα αφήσει κανένα χάος πίσω ή αφήσει τα πράγματα σε ασυνεπή κατάσταση.
Μια καλή περίληψη του τι κάνει ο Docker περιλαμβάνεται στο δικό του σύνθημα: Κατασκευή, αποστολή, εκτέλεση .
Καλή διασκέδαση κολύμπι με τις φάλαινες!
Μέρος αυτού του έργου είναι εμπνευσμένο από ένα εξαιρετικό βιβλίο Χρησιμοποιώντας το Docker από τον Adrian Mouat.