Ποια είναι η διαφορά μεταξύ μιας εικόνας Docker και ενός εμπορευματοκιβωτίου;

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

Έτσι, τελικά έχω ένα image για την παρουσία μου στην PostgreSQL και ένα image για την web εφαρμογή μου, οι αλλαγές στις οποίες συνεχίζουν να διατηρούνται.

Τι είναι ένα εμπορευματοκιβώτιο;

Λύση

Μια περίπτωση μιας εικόνας ονομάζεται περιέκτης. Έχετε μια εικόνα, η οποία είναι ένα σύνολο επιπέδων, όπως περιγράφετε. Εάν εκκινήσετε αυτή την εικόνα, έχετε ένα τρέχον δοχείο αυτής της εικόνας. Μπορείτε να έχετε πολλά τρέχοντα κοντέινερ της ίδιας εικόνας.

Μπορείτε να δείτε όλες τις εικόνες σας με την εντολή docker images ενώ μπορείτε να δείτε τα τρέχοντα containers σας με την εντολή docker ps (και μπορείτε να δείτε όλα τα containers με την εντολή docker ps -a).

Έτσι, μια εκτελούμενη παρουσία ενός image είναι ένα container.

Σχόλια (14)

Από το άρθρο μου Αυτοματοποίηση των αναπτύξεων Docker:

Docker Images vs. Containers

Στη χώρα του 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
                                  4ab0d9120985        3 months ago        486.5 MB

Κάποια πράγματα που πρέπει να σημειωθούν:

  1. Το IMAGE ID είναι οι πρώτοι 12 χαρακτήρες του πραγματικού αναγνωριστικού μιας εικόνας. Μπορείτε να δημιουργήσετε πολλές ετικέτες μιας δεδομένης εικόνας, αλλά τα αναγνωριστικά τους θα είναι όλα τα ίδια (όπως παραπάνω).
  2. Το VIRTUAL SIZE είναι virtual επειδή αθροίζει τα μεγέθη όλων των ξεχωριστών υποκείμενων επιπέδων. Αυτό σημαίνει ότι το άθροισμα όλων των τιμών σε αυτή τη στήλη είναι πιθανότατα πολύ μεγαλύτερο από το χώρο στο δίσκο που χρησιμοποιείται από όλες αυτές τις εικόνες.
  3. Η τιμή στη στήλη REPOSITORY προέρχεται από τη σημαία -t της εντολής docker build ή από την ετικέτα docker tag-ing μιας υπάρχουσας εικόνας. Είστε ελεύθεροι να επισημάνετε εικόνες χρησιμοποιώντας μια ονοματολογία που έχει νόημα για εσάς, αλλά να ξέρετε ότι το docker θα χρησιμοποιήσει την ετικέτα ως θέση μητρώου σε ένα docker push ή docker pull.
  4. Η πλήρης μορφή μιας ετικέτας είναι [REGISTRYHOST/][USERNAME/]NAME[:TAG]. Για το ubuntu παραπάνω, το REGISTRYHOST συμπεραίνεται ότι είναι το registry.hub.docker.com. Έτσι, αν σκοπεύετε να αποθηκεύσετε την εικόνα σας με το όνομα my-application σε ένα μητρώο στο docker.example.com, θα πρέπει να επισημάνετε την εικόνα αυτή με την ετικέτα docker.example.com/my-application.
  5. Η στήλη TAG είναι απλώς το μέρος [:TAG] της ετικέτας full. Πρόκειται για ατυχή ορολογία.
  6. Η ετικέτα latest δεν είναι μαγική, είναι απλά η προεπιλεγμένη ετικέτα όταν δεν καθορίζετε ετικέτα.
  7. Μπορείτε να έχετε εικόνες χωρίς ετικέτες που αναγνωρίζονται μόνο από τα IMAGE ID τους. Αυτές θα λάβουν τις ετικέτες `` και 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, έτσι ώστε να έχω ένα ιδιωτικό μέρος για να αποθηκεύω τις εικόνες μου. Και πάλι, μερικά πράγματα που πρέπει να σημειωθούν:

  1. Όπως και το IMAGE ID, το CONTAINER ID είναι το πραγματικό αναγνωριστικό του εμπορευματοκιβωτίου. Έχει την ίδια μορφή, αλλά προσδιορίζει ένα διαφορετικό είδος αντικειμένου.
  2. Το docker ps εξάγει μόνο τα τρέχοντα εμπορευματοκιβώτια. Μπορείτε να δείτε όλα τα εμπορευματοκιβώτια (running ή stopped) με την εντολή docker ps -a.
  3. Τα NAMES μπορούν να χρησιμοποιηθούν για την αναγνώριση ενός εκκινούμενου εμπορευματοκιβωτίου μέσω της σημαίας --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 και μπορεί να αντιμετωπιστούν σε μελλοντικές εκδόσεις. Ωστόσο, με μια σαφή κατανόηση των εικόνων και των εμπορευματοκιβωτίων, αυτές οι καταστάσεις μπορούν να αποφευχθούν με μερικές πρακτικές:

  1. Να αφαιρείτε πάντα ένα άχρηστο, σταματημένο container με την εντολή docker rm [CONTAINER_ID].
  2. Αφαιρείτε πάντα την εικόνα πίσω από ένα άχρηστο, σταματημένο container με την εντολή docker rmi [IMAGE_ID].
Σχόλια (11)

Αν και είναι πιο απλό να σκεφτούμε ένα κοντέινερ ως μια εικόνα που τρέχει, αυτό δεν είναι ακριβές.

Ένα image είναι στην πραγματικότητα ένα πρότυπο που μπορεί να μετατραπεί σε container. Για να μετατραπεί ένα image σε container, η μηχανή Docker παίρνει το image, προσθέτει ένα σύστημα αρχείων ανάγνωσης-εγγραφής από πάνω και αρχικοποιεί διάφορες ρυθμίσεις, συμπεριλαμβανομένων των θυρών δικτύου, του ονόματος του container, του ID και των ορίων των πόρων. Ένα τρέχον εμπορευματοκιβώτιο έχει μια τρέχουσα διεργασία εκτέλεσης, αλλά ένα εμπορευματοκιβώτιο μπορεί επίσης να σταματήσει (ή να εξέλθει στην ορολογία του Docker). Ένα container που έχει τερματιστεί δεν είναι το ίδιο με ένα image, καθώς μπορεί να επανεκκινηθεί και θα διατηρήσει τις ρυθμίσεις του και τυχόν αλλαγές στο σύστημα αρχείων.

Σχόλια (5)