Όταν χρησιμοποιούμε το Docker, ξεκινάμε με μια βασική εικόνα. Την εκκινούμε, δημιουργούμε αλλαγές και αυτές οι αλλαγές αποθηκεύονται σε στρώματα σχηματίζοντας μια άλλη εικόνα.
Έτσι, τελικά έχω ένα image για την παρουσία μου στην PostgreSQL και ένα image για την web εφαρμογή μου, οι αλλαγές στις οποίες συνεχίζουν να διατηρούνται.
Τι είναι ένα εμπορευματοκιβώτιο;
Μια περίπτωση μιας εικόνας ονομάζεται περιέκτης. Έχετε μια εικόνα, η οποία είναι ένα σύνολο επιπέδων, όπως περιγράφετε. Εάν εκκινήσετε αυτή την εικόνα, έχετε ένα τρέχον δοχείο αυτής της εικόνας. Μπορείτε να έχετε πολλά τρέχοντα κοντέινερ της ίδιας εικόνας.
Μπορείτε να δείτε όλες τις εικόνες σας με την εντολή docker images
ενώ μπορείτε να δείτε τα τρέχοντα containers σας με την εντολή docker ps
(και μπορείτε να δείτε όλα τα containers με την εντολή docker ps -a
).
Έτσι, μια εκτελούμενη παρουσία ενός image είναι ένα container.
Από το άρθρο μου Αυτοματοποίηση των αναπτύξεων Docker:
Στη χώρα του Docker, υπάρχουν τα images και τα containers. Τα δύο είναι στενά συνδεδεμένα, αλλά διακριτά. Για μένα, η κατανόηση αυτής της διχοτόμησης έχει αποσαφηνίσει το Docker σε μεγάλο βαθμό.
Μια εικόνα είναι ένα αδρανές, αμετάβλητο αρχείο που αποτελεί ουσιαστικά ένα στιγμιότυπο ενός εμπορευματοκιβωτίου. Οι εικόνες δημιουργούνται με την εντολή build, και θα παράγουν ένα δοχείο όταν ξεκινούν με την εντολή run. Οι εικόνες αποθηκεύονται σε ένα μητρώο του Docker, όπως το registry.hub.docker.com. Επειδή μπορούν να γίνουν αρκετά μεγάλα, οι εικόνες έχουν σχεδιαστεί ώστε να αποτελούνται από στρώματα άλλων εικόνων, επιτρέποντας την αποστολή ελάχιστων δεδομένων κατά τη μεταφορά εικόνων μέσω δικτύου.
Οι τοπικές εικόνες μπορούν να καταχωρηθούν εκτελώντας την εντολή docker images
:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Κάποια πράγματα που πρέπει να σημειωθούν:
-t
της εντολής docker build
ή από την ετικέτα docker tag
-ing μιας υπάρχουσας εικόνας. Είστε ελεύθεροι να επισημάνετε εικόνες χρησιμοποιώντας μια ονοματολογία που έχει νόημα για εσάς, αλλά να ξέρετε ότι το docker θα χρησιμοποιήσει την ετικέτα ως θέση μητρώου σε ένα docker push
ή docker pull
.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Για το ubuntu
παραπάνω, το REGISTRYHOST συμπεραίνεται ότι είναι το registry.hub.docker.com
. Έτσι, αν σκοπεύετε να αποθηκεύσετε την εικόνα σας με το όνομα my-application
σε ένα μητρώο στο docker.example.com
, θα πρέπει να επισημάνετε την εικόνα αυτή με την ετικέτα docker.example.com/my-application
.latest
δεν είναι μαγική, είναι απλά η προεπιλεγμένη ετικέτα όταν δεν καθορίζετε ετικέτα.<none>
και REPOSITORY. Είναι εύκολο να τις ξεχάσετε.Περισσότερες πληροφορίες σχετικά με τις εικόνες είναι διαθέσιμες από την τεκμηρίωση του Docker και το γλωσσάριο.
Για να χρησιμοποιήσουμε μια μεταφορά προγραμματισμού, αν μια εικόνα είναι μια κλάση, τότε ένα εμπορευματοκιβώτιο είναι μια περίπτωση μιας κλάσης - ένα αντικείμενο χρόνου εκτέλεσης. Τα εμπορευματοκιβώτια είναι ελπίζω ο λόγος για τον οποίο χρησιμοποιείτε το Docker- είναι ελαφρές και φορητές ενθυλακώσεις ενός περιβάλλοντος στο οποίο εκτελούνται εφαρμογές.
Δείτε τα τοπικά κοντέινερ που εκτελούνται με το docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
Εδώ τρέχω μια dockerized έκδοση του docker registry, έτσι ώστε να έχω ένα ιδιωτικό μέρος για να αποθηκεύω τις εικόνες μου. Και πάλι, μερικά πράγματα που πρέπει να σημειωθούν:
docker ps
εξάγει μόνο τα τρέχοντα εμπορευματοκιβώτια. Μπορείτε να δείτε όλα τα εμπορευματοκιβώτια (running ή stopped) με την εντολή docker ps -a
.--name
.Μία από τις πρώτες απογοητεύσεις μου με το Docker ήταν η φαινομενικά συνεχής συσσώρευση εικόνων χωρίς ετικέτες και σταματημένων containers. Σε μια χούφτα περιπτώσεις αυτή η συσσώρευση είχε ως αποτέλεσμα να φτάσουν στο μέγιστο οι σκληροί δίσκοι και να επιβραδύνουν τον φορητό μου υπολογιστή ή να σταματήσει η αυτοματοποιημένη αγωγός κατασκευής μου. Μιλάμε για "κοντέινερ παντού"!
Μπορούμε να αφαιρέσουμε όλες τις εικόνες χωρίς ετικέτες συνδυάζοντας το docker rmi
με το πρόσφατο ερώτημα dangling=true
:
docker images -q --filter "dangling=true" | xargs docker rmi
Το Docker δεν θα μπορέσει να αφαιρέσει εικόνες που βρίσκονται πίσω από υπάρχοντα containers, οπότε ίσως χρειαστεί να αφαιρέσετε πρώτα τα σταματημένα containers με το docker rm
:
docker rm `docker ps --no-trunc -aq`
Αυτά είναι γνωστά σημεία πόνου με το Docker και μπορεί να αντιμετωπιστούν σε μελλοντικές εκδόσεις. Ωστόσο, με μια σαφή κατανόηση των εικόνων και των εμπορευματοκιβωτίων, αυτές οι καταστάσεις μπορούν να αποφευχθούν με μερικές πρακτικές:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.Αν και είναι πιο απλό να σκεφτούμε ένα κοντέινερ ως μια εικόνα που τρέχει, αυτό δεν είναι ακριβές.
Ένα image είναι στην πραγματικότητα ένα πρότυπο που μπορεί να μετατραπεί σε container. Για να μετατραπεί ένα image σε container, η μηχανή Docker παίρνει το image, προσθέτει ένα σύστημα αρχείων ανάγνωσης-εγγραφής από πάνω και αρχικοποιεί διάφορες ρυθμίσεις, συμπεριλαμβανομένων των θυρών δικτύου, του ονόματος του container, του ID και των ορίων των πόρων. Ένα τρέχον εμπορευματοκιβώτιο έχει μια τρέχουσα διεργασία εκτέλεσης, αλλά ένα εμπορευματοκιβώτιο μπορεί επίσης να σταματήσει (ή να εξέλθει στην ορολογία του Docker). Ένα container που έχει τερματιστεί δεν είναι το ίδιο με ένα image, καθώς μπορεί να επανεκκινηθεί και θα διατηρήσει τις ρυθμίσεις του και τυχόν αλλαγές στο σύστημα αρχείων.