Docker Compose - Όρια μνήμης

Docker Compose Memory Limits



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

Γυρίζουμε διαφορετικά δοχεία για να χειριστούμε διαφορετικό φόρτο εργασίας μιας εφαρμογής και χρησιμοποιούμε το Docker Compose για να το κάνουμε αυτό εύκολα. Κάθε λογικά διαφορετικός φόρτος εργασίας αναφέρεται ως διαφορετικός υπηρεσία Το Για παράδειγμα, ο διακομιστής http του frontend θα καταχωρηθεί ως υπηρεσία προσώπου που εκτελεί Apache ή εικόνα Nginx ως κοντέινερ.







Όλες οι υπηρεσίες, οι ανάγκες δικτύωσης, οι απαιτήσεις αποθήκευσης κ.λπ. μπορούν να καθοριστούν σε ένα αρχείο docker-compose.yml. Θα επικεντρωθούμε στον καθορισμό της χρήσης μνήμης εδώ.



Θα χρειαστείτε τα ακόλουθα εργαλεία στο οπλοστάσιό σας για να ακολουθήσετε:



  1. Βασική κατανόηση του Docker
  2. Docker για Windows ή Mac ή εάν χρησιμοποιείτε Linux, DockerCE για Linux
  3. Docker Compose binar y (Οι χρήστες Windows και Mac θα το έχουν ήδη εγκαταστήσει)

Θα τηρήσουμε την έκδοση 2.4 για τα αρχεία docker-compose.yml, καθώς υποστηρίζει την έκδοση 17.12 και νεότερη έκδοση του Docker Engine και νεότερη. Θα μπορούσαμε να έχουμε πάει με την έκδοση 3 που είναι πιο πρόσφατη, αλλά δεν υποστηρίζει παλιά σύνταξη περιορισμού μνήμης. Εάν προσπαθήσετε να χρησιμοποιήσετε τη νεότερη σύνταξη, αντ 'αυτού επιμένει να χρησιμοποιήσετε το Docker στη λειτουργία Swarm. Έτσι, για να διατηρήσω την απλή υπόθεση για τους απλούς χρήστες του Docker, θα παραμείνω στην έκδοση 2.4





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

Δείγμα εφαρμογής

Ας δοκιμάσουμε να εκτελέσουμε μια απλή υπηρεσία Nginx στη θύρα 80 χρησιμοποιώντας πρώτα το CLI και στη συνέχεια ένα απλό docker-compose.yml. Στην επόμενη ενότητα, θα διερευνήσουμε τους περιορισμούς και τη χρήση της μνήμης και θα τροποποιήσουμε το docker-compose.yml για να δούμε πώς επιβάλλονται οι προσαρμοσμένοι περιορισμοί.



Ας ξεκινήσουμε έναν απλό διακομιστή nginx χρησιμοποιώντας το Docker-CLI:

$ docker run -d -όνομα my -nginx -p80:80nginx: τελευταία

Μπορείτε να δείτε τον διακομιστή nginx να λειτουργεί όταν επισκέπτεστε http: // localhost ή αντικαταστήστε το lcoalhost

Με τη διεύθυνση IP του κεντρικού υπολογιστή Docker. Αυτό το κοντέινερ μπορεί δυνητικά να χρησιμοποιήσει ολόκληρη τη διαθέσιμη μνήμη στον κεντρικό υπολογιστή Docker (στην περίπτωσή μας είναι περίπου 2 GB). Για να ελέγξουμε τη χρήση της μνήμης, μεταξύ άλλων, μπορούμε να χρησιμοποιήσουμε την εντολή:

$ docker stats my-nginx

ΟΝΟΜΑ ΚΟΙΝΟΠΟΙΗΤΙΚΟΥ CPU % MEM ΧΡΗΣΗ/LIMIT MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 my-nginx0,00% 2,133MiB / 1,934GiB0,11% 3,14kB / 2,13kB 0B / 0B2

Το MEM USAGE/LIMIT είναι στα 2.133MiB από το σύνολο των 1.934GiB. Ας αφαιρέσουμε αυτό το κοντέινερ και ας αρχίσουμε να γράφουμε σενάρια για σύνταξη docker.

$ docker stop my-nginx
$ docker rm my-nginx

Ισοδύναμο αρχείο ym

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

$ mkdir my-compose
$ cd my-compose
$ vim docker-compose.yml

Δημιουργούμε έναν νέο κενό κατάλογο και δημιουργούμε ένα αρχείο docker-compose.yml σε αυτόν. Όταν θα εκτελέσουμε το docker-compose από αυτόν τον κατάλογο, θα αναζητήσει αυτό το συγκεκριμένο αρχείο (αγνοώντας όλα τα άλλα) και θα δημιουργήσει ανάλογα την ανάπτυξη μας. Προσθέστε τα ακόλουθα περιεχόμενα μέσα σε αυτό το αρχείο .yml.

εκδοχή:'3'
Υπηρεσίες:
my-nginx:
εικόνα: nginx: τελευταία
θύρες:
-'80: 80 '

$ docker -compose up -d

Η σημαία -d προστίθεται έτσι ώστε τα νεοδημιουργημένα κοντέινερ να λειτουργούν στο παρασκήνιο. Διαφορετικά, το τερματικό θα προσαρτηθεί στα δοχεία και θα ξεκινήσει την εκτύπωση αναφορών από αυτό. Τώρα μπορούμε να δούμε τα στατιστικά στοιχεία των νέων δοχείων (ων):

στατιστικά $ docker -όλα

ΟΝΟΜΑ ΚΟΙΝΟΠΟΙΗΤΙΚΟΥ CPU% MEM ΧΡΗΣΗ/LIMIT MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10,00% 2,25MiB/1,934GiB0,11% 1,65kB/0B 7,35MB/0B2

Θα παρατηρήσετε ότι ένα παρόμοιο δοχείο όπως πριν δημιουργήθηκε με παρόμοια όρια μνήμης και ακόμη και χρήση. Από τον ίδιο κατάλογο που περιέχει το αρχείο yml. Εκτελέστε την ακόλουθη εντολή για να διαγράψετε το νεοδημιουργημένο κοντέινερ, μαζί με το δίκτυο γέφυρας πελατών που δημιουργήθηκε.

$λιμενεργάτης-συνθέτω κάτω

Αυτό θα επιστρέψει το docker σε καθαρή κατάσταση με εξαίρεση τους όγκους που δημιουργήθηκαν (δεν δημιουργήσαμε κανέναν, οπότε αυτό δεν προκαλεί ανησυχία.)

Όρια μνήμης και κρατήσεις μνήμης

Τα όρια μνήμης και οι κρατήσεις μνήμης είναι δύο διαφορετικές πτυχές για να διασφαλίσετε την ομαλή λειτουργία των εφαρμογών σας και του κεντρικού υπολογιστή Docker που εκτελείτε στην κορυφή.

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

Οι κρατήσεις μνήμης, από την άλλη πλευρά, είναι λιγότερο άκαμπτες. Όταν το σύστημα έχει χαμηλή μνήμη και προσπαθεί να ανακτήσει κάποια από αυτήν. Προσπαθεί να φέρει την κατανάλωση μνήμης του κοντέινερ στο ή κάτω από το όριο κράτησης. Εάν υπάρχει άφθονη μνήμη, ωστόσο, η εφαρμογή μπορεί να επεκταθεί μέχρι το σκληρό όριο μνήμης.

Να συνοψίσουμε:

  1. Όριο μνήμης: Ένα αυστηρό ανώτατο όριο στο ποσό της μνήμης που διατίθεται σε ένα δοχείο.
  2. Κράτηση μνήμης: Αυτό πρέπει να οριστεί ως το ελάχιστο όριο μνήμης που χρειάζεται μια εφαρμογή για να εκτελεστεί σωστά. Επομένως, δεν καταρρέει ή δεν λειτουργεί σωστά όταν το σύστημα προσπαθεί να ανακτήσει μέρος της μνήμης.

Εάν η κράτηση μνήμης είναι μεγαλύτερη από το όριο μνήμης, το όριο μνήμης έχει προτεραιότητα.

Καθορισμός ορίων μνήμης και κράτησης

Έκδοση 2

Ας επιστρέψουμε στο docker-compose.yml που γράψαμε νωρίτερα και προσθέστε όριο μνήμης σε αυτό. Αλλάξτε την έκδοση σε 2.4 για λόγους που συζητούνται στην ενότητα προϋποθέσεις.

εκδοχή:'2,4'
Υπηρεσίες:
my-nginx:
εικόνα: nginx: τελευταία
θύρες:
-'80: 80 '
mem_limit: 300μ

Η τελευταία γραμμή ορίζει το όριο για την υπηρεσία my-nginx στα 300MiB. Μπορείτε να χρησιμοποιήσετε το k για το KiB και το g για το GiB και το b για μόνο byte. Ωστόσο, ο αριθμός πριν από αυτόν πρέπει να είναι ακέραιος. Δεν μπορείτε να χρησιμοποιήσετε τιμές όπως 2,4m, θα πρέπει αντ 'αυτού να χρησιμοποιήσετε 2400k. Τώρα αν τρέξετε:

$ docker stat -όλα

ΟΝΟΜΑ ΚΟΙΝΟΠΟΙΗΤΙΚΟΥ CPU % MEM ΧΡΗΣΗ/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10,00% 2,141MiB/300MiB0,71% 1,16kB/0B 0B/0B2

Θα παρατηρήσετε ότι το όριο μνήμης έχει οριστεί στα 300 MiB. Η ρύθμιση της κράτησης μνήμης είναι εξίσου εύκολη, απλά προσθέστε μια γραμμή mem_reservation: xxx στο τέλος.

εκδοχή:'2,4'
Υπηρεσίες:
my-nginx:
εικόνα: nginx: τελευταία
θύρες:
-'80: 80 '
mem_limit: 300μ
mem_reservation: 100μ

Έκδοση 3 (προαιρετικό)

Για να χρησιμοποιήσετε την έκδοση τρία, πρέπει να εκτελέσετε το Docker σε κατάσταση σμήνους. Για Windows και Mac μπορείτε να το ενεργοποιήσετε χρησιμοποιώντας το μενού ρυθμίσεων Docker. Οι χρήστες Linux θα πρέπει να εκτελέσουν εκκίνηση docker swarm init. Περισσότερες πληροφορίες σχετικά με αυτό μπορείτε να βρείτε εδώ Το Ωστόσο, δεν είναι απαραίτητο βήμα, και αν δεν το έχετε ενεργοποιήσει, είναι επίσης καλό. Αυτή η ενότητα είναι για άτομα ήδη λειτουργεί σε κατάσταση σμήνους και μπορεί να κάνει χρήση της νεότερης έκδοσης.

εκδοχή:'3'
Υπηρεσίες:
my-nginx:
εικόνα: nginx: τελευταία
θύρες:
-'80: 80 '
παρατάσσω:
πόροι:
όρια:
μνήμη: 300μ
κρατήσεις:
μνήμη: 100μ

Ορίζουμε όλα αυτά κάτω από την επιλογή πόρων. Τα όρια και η κράτηση γίνονται πρωταρχικά κλειδιά και η μνήμη δεν είναι παρά ένας από τους πολλούς πόρους που διαχειρίζονται εδώ. Η CPU είναι μια άλλη σημαντική παράμετρος.

Περαιτέρω πληροφορίες

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

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