Table of Contents
Γιατί Συνδυάζεται με Docker για την παραγωγή deplations
Οι σύγχρονες απαιτήσεις υποδομής που απαιτούν οι υπηρεσίες που υπόκεινται σε εμπορευματοκιβώτια επιβιώνουν από αναπάντεχες επανεκκινήσεις, αστοχίες υλικού ή ενημερώσεις πακέτων. Ενώ το Docker παρέχει πολιτικές επανεκκίνησης ([[LFT:0]]]), αυτές οι πολιτικές λειτουργούν μόνο όσο τρέχει το δαίμονα Docker. Συστημένο ⁇ το σύστημα εισαγωγής που χρησιμοποιείται από τους Ubuntu, Debian, Fedora, CentOS, και οι περισσότερες σύγχρονες διανομές Linux ⁇ παίρνει αυτό περαιτέρω με τη διαχείριση του κύκλου ζωής του δαίμονα Docker και μπορεί να ξεκινήσει δοχεία ακόμα και πριν από την υποδοχή Docker γίνει διαθέσιμη.
- Εγγυημένη εντολή εκκίνησης μέσω οδηγιών εξάρτησης (π.χ. μετά το δίκτυο.στόχος, μετά το docker.service)
- Ενοποιημένη καταγραφή μέσω , κάνοντας την αποσφαλμάτωση απλή
- Ο έλεγχος των ορίων των πόρων με λεπτόκοκκο (CPU, μνήμη, I/O) με τη χρήση συστηματοποιημένων οδηγιών μονάδων
- Αυτόματη επανεκκίνηση σε αποτυχία με ρυθμιζόμενη καθυστέρηση και όρια έκρηξης
- Υποστήριξη για ενεργοποίηση υποδοχής και προγραμματισμένη εκκίνηση
Περιτυλίσσοντας κάθε δοχείο Docker σε ένα σύστημα αρχείο υπηρεσιών, οι ομάδες επιχειρήσεων αποκτούν μια συνεπή διεπαφή για την έναρξη, τη διακοπή, και την παρακολούθηση των εμπορευματοκιβωτίων, μειώνοντας την εξάρτηση από τα scripts ad-hoc και τη χειροκίνητη παρέμβαση.
Δημιουργία μιας Συστημένης Υπηρεσίας για ένα ενιαίο δοχείο Docker
Η τυπική προσέγγιση περιλαμβάνει τη συγγραφή ενός αρχείου μονάδας υπηρεσίας που καλεί τις εντολές Docker να τρέξει και να σταματήσει το δοχείο.
Βήμα 1: Γράψτε το αρχείο μονάδων υπηρεσιών
Δημιουργία ενός αρχείου με όνομα . Χρησιμοποιήστε το ακόλουθο πρότυπο ως σημείο εκκίνησης:
[Unit]
Description=My Application Container
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service
[Service]
Restart=always
RestartSec=10
StartLimitBurst=3
ExecStartPre=-/usr/bin/docker kill myapp
ExecStartPre=-/usr/bin/docker rm myapp
ExecStart=/usr/bin/docker run --rm --name myapp \
-e DB_HOST=10.0.1.50 \
-e DB_PORT=5432 \
-v /data/myapp:/app/data \
-p 8080:8080 \
myregistry/myapp:latest
ExecStop=/usr/bin/docker stop -t 10 myapp
ExecStopPost=-/usr/bin/docker rm myapp
[Install]
WantedBy=multi-user.target
Εξήγηση βασικών οδηγιών:
- ⁇ εξασφαλίζει ότι το δαίμονας Docker εκτελείται πριν από την έναρξη του περιέκτη.
- ⁇ αν σταματήσει ο Ντόκερ, η υπηρεσία αυτή σταματά επίσης.
- ⁇ καθαρίζει οποιοδήποτε δοχείο που έχει απομείνει από προηγούμενη διαδρομή (το πρόθεμα σημαίνει ότι οι αποτυχίες εδώ είναι μη θανατηφόρες).
- ⁇ χρησιμοποιεί για να απομακρύνει αυτόματα το δοχείο όταν σταματήσει.
- ⁇ με χάρη σταματά το δοχείο με ένα τάιμ άουτ (10 δευτερόλεπτα).
- ⁇ επανεκκινεί το δοχείο ανεξάρτητα από τον κωδικό εξόδου.
- ⁇ περιμένει 10 δευτερόλεπτα πριν την επανεκκίνηση.
- ⁇ όρια επανεκκινούν σε 3 προσπάθειες ανά διάστημα (προκαθορισμένα 10 δευτερόλεπτα) για να αποφύγουν τους βρόχους επανεκκίνησης.
Βήμα 2: Ενεργοποίηση και έναρξη της υπηρεσίας
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
Το λέει συστημένο να ξαναδιαβάσει αρχεία υπηρεσιών. δημιουργεί το symlink ώστε η υπηρεσία να ξεκινήσει από την εκκίνηση.
Διαχείριση της Υπηρεσίας με τις Τυποποιημένες Συστημένες Εντολές
Μόλις η υπηρεσία λειτουργεί, μπορείτε να το ελέγξετε ακριβώς όπως κάθε άλλη υπηρεσία συστήματος:
- Ξεκίνησε:
- Σταματήστε:
- Επανεκκίνηση:
- Στατιστικό:
- Εγγραφές: (ακολουθούν ζωντανά αρχεία καταγραφής)
Προχωρημένα πρότυπα ρύθμισης
Οι εφαρμογές παραγωγής συχνά απαιτούν κάτι περισσότερο από ένα απλό [[LFT:22]]. Παρακάτω είναι κοινές βελτιώσεις που μπορείτε να προσθέσετε στα αρχεία υπηρεσιών που έχετε συστημένη.
Μεταβλητές περιβάλλοντος διέλευσης
Δεν συνιστάται η κωδικοποίηση μυστικών ή ρυθμίσεων στο αρχείο υπηρεσιών. Αντ 'αυτού, χρησιμοποιήστε ένα ξεχωριστό αρχείο περιβάλλοντος:
[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
--env-file /etc/myapp/env.conf \
myregistry/myapp:latest
Το πρόθεμα πριν από τη διαδρομή σημαίνει ότι η υπηρεσία θα ξεκινήσει ακόμα και αν το αρχείο δεν υπάρχει (χρήσιμο κατά την αρχική ρύθμιση).
Δικτύωση και συνδέσεις λιμένων
Για τα δοχεία που πρέπει να επικοινωνούν μεταξύ τους στον ίδιο ξενιστή, εξετάστε τη χρήση [[[LFT:25]]] ή δικτύων γεφυρών που ορίζονται από το χρήστη. Παράδειγμα:
ExecStart=/usr/bin/docker run --rm --name web \
--network=my-net \
-p 443:443 \
-v /etc/ssl/certs:/etc/ssl/certs:ro \
myregistry/web:latest
Αν χρησιμοποιείτε προσαρμοσμένο δίκτυο, βεβαιωθείτε ότι το δίκτυο υπάρχει πριν ξεκινήσει η υπηρεσία. Μπορείτε να προσθέσετε μια εντολή για τη δημιουργία του:
ExecStartPre=/usr/bin/docker network create my-net
Εξαρτήσεις μεταξύ εμπορευματοκιβωτίων
Όταν ένα δοχείο απαιτεί από ένα άλλο να είναι έτοιμο πριν από την έναρξη (π.χ., μια εφαρμογή ιστού που περιμένει μια βάση δεδομένων), το σύστημα μπορεί να επιβάλει την παραγγελία. Δημιουργία ενός δεύτερου αρχείου υπηρεσιών για τη βάση δεδομένων και στη συνέχεια:
[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service
συνδέει τον κύκλο ζωής της εφαρμογής στο δοχείο της βάσης δεδομένων ⁇ αν σταματήσει η βάση δεδομένων, η εφαρμογή του διαδικτύου επίσης σταματά.
Έλεγχοι υγείας και ετοιμότητα
Οι έλεγχοι υγείας Docker μπορούν να ενσωματωθούν με σύστημα για την πρόληψη της πρόωρης διαθεσιμότητας υπηρεσιών. Χρήση [[LFT:31]] με σενάριο που δημοσκοπεί το τελικό σημείο υγείας:
ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30
Το σενάριο πρέπει να βγει από το 0 μόνο όταν το δοχείο είναι υγιές. Αν αποτύχει, το σύστημα σηματοδοτεί τη μονάδα ως αποτυχημένη.
Όρια πόρων μέσω του συστήματος
Μπορείτε να περιορίσετε την ΚΜΕ ενός εμπορευματοκιβωτίου και τη μνήμη σε επίπεδο cgroup χωρίς τις σημαίες πόρων του Docker. Αυτό είναι ιδιαίτερα χρήσιμο κατά την εκτέλεση πολλαπλών εμπορευματοκιβωτίων σε έναν μόνο υπολογιστή:
[Service]
MemoryMax=512M
CPUQuota=50%
Αυτές οι ρυθμίσεις δημιουργούν ένα σκληρό όριο που το σύστημα επιβάλλει ανεξάρτητα από το Docker.
Διαχείριση πολλαπλών εμπορευματοκιβωτίων: Συστηματοποιημένη εναντίον Docker Composition
Για ένα μικρό αριθμό εμπορευματοκιβωτίων (π.χ., 2-5), τα μεμονωμένα αρχεία υπηρεσιών που είναι συστηματοποιημένα είναι απλά και συντηρήσιμα. Ωστόσο, όταν ένα έργο περιλαμβάνει πολλές διασυνδεδεμένες υπηρεσίες, το Docker Compluse γίνεται πιο βολικό. Μπορείτε ακόμα να χρησιμοποιήσετε το σύστημα για να ενορχηστρώσετε ολόκληρη τη στοίβα Docker Compluse δημιουργώντας μια ενιαία μονάδα υπηρεσιών που καλεί ]. Παράδειγμα:
[Unit]
Description=My Application Stack
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
[Install]
WantedBy=multi-user.target
Η προσέγγιση αυτή σας δίνει την απλότητα της σύνθεσης για τον καθορισμό υπηρεσιών σε συνδυασμό με τη διαχείριση του κύκλου ζωής του συστήματος. Σημειώστε ότι [[LFT:36]] χρησιμοποιείται επειδή [[LFT:37]] εξέρχεται αμέσως. [[LFT:38]] διατηρεί τη μονάδα σε «ενεργή» κατάσταση μέχρι να κληθεί [[LFT:39]]].
Ποια μέθοδο θα πρέπει να επιλέξετε;
- Ατομικές συστηματοποιημένες υπηρεσίες ⁇ καλύτερες για τις εφαρμογές κληρονομιάς, υπηρεσίες με αυστηρή εντολή εκκίνησης, ή όταν χρειάζεστε όρια πόρων ανά εμπορευματοκιβώτιο.
- Γιατρός Συνθέστε με συστημένη ⁇ ιδανική για μικρουπηρεσίες στοίβες όπου οι εξαρτήσεις χειρίζονται εσωτερικά από την Compusit, και θέλετε μια ενιαία μονάδα να διαχειρίζεται ολόκληρη την ομάδα.
Αντιμετώπιση προβλημάτων
Παρακάτω είναι συχνές παγίδες και οι λύσεις τους.
Η υπηρεσία αποτυγχάνει με το “Δεν μπορεί να συνδεθεί με το δαίμονα Docker”
Αυτό συνήθως σημαίνει ότι η υπηρεσία ξεκινά πριν την υποδοχή Docker είναι έτοιμη. Βεβαιωθείτε ότι η μονάδα σας περιέχει [[LFT:40]] και [[LFT:41]]. Επίσης ελέγξτε ότι το δαίμονα Docker είναι ενεργοποιημένο: [[LFT:42]].
Το κοντέινερ επανεκκινεί σε μια αναψυχή
Εάν το δοχείο εξέλθει αμέσως, το σύστημα θα συνεχίσει να το επανεκκινεί σύμφωνα με [[LFT:43]]] και [[LFT:44]]. Ελέγξτε τα αρχεία καταγραφής του δοχείου με [[LFT:45]]]. Αύξηση [[LFT:46]] (π.χ., 30 δευτερόλεπτα) και ρυθμίστε [[LFT:47]] για την πρόληψη ενός πολυσύχναστου βρόχου.
Η Υπηρεσία Δεν Σταματάει Καθαρά
Ένα λανθασμένα ρυθμισμένο μπορεί να αφήσει το δοχείο σε λειτουργία. Επιβεβαιώστε ότι [[LFT:49]] χρησιμοποιεί το σωστό όνομα δοχείου. Χρησιμοποιήστε [[LFT:50]] για να αφαιρέσετε με τη βία το δοχείο εάν η στάση αποτύχει.
Οι μεταβλητές περιβάλλοντος δεν φορτώνονται
Αν χρησιμοποιείτε [[LFT:51]], επιβεβαιώστε ότι το αρχείο υπάρχει και είναι αναγνώσιμο από τη ρίζα. Αποφύγετε την αναφορά θεμάτων ⁇ συστηματοποιημένες ταινίες εισαγωγικές από μεταβλητές τιμές. Για μυστική ένεση, εξετάστε τη χρήση συστηματοποιημένων διαπιστευτηρίων ή ενός ειδικού μυστικού διαχειριστή.
Συνεκτίμηση της ασφάλειας
Η λειτουργία των κοντέινερ Docker μέσω των συστηματοποιημένων υψώνει μερικά σημεία ασφαλείας:
- Πάντα να εκτελείτε την υπηρεσία με σύστημα ως μη-ρίζα χρήστη, εάν είναι δυνατόν (χρησιμοποιήστε [[[LFT:52]]]] και [[LFT:53]] οδηγίες, αλλά βεβαιωθείτε ότι ο χρήστης έχει πρόσβαση στην υποδοχή Docker ή να εκτελείται σε λειτουργία χωρίς ρίζα).
- Αποφύγετε τη χρήση [ σε συστημένες μονάδες εκτός εάν είναι απολύτως απαραίτητο.
- Χρησιμοποιήστε βάσεις σύνδεσης μόνο για ανάγνωση ([[LFT:55]]]) όποτε το δοχείο δεν χρειάζεται να γράψει στον ξενιστή.
- Τα συστήματα μόχλευσης και για να σκληρύνει τη μονάδα κατά των διαφυγών.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser
Εξωτερικοί πόροι
Για περαιτέρω ανάγνωση, συμβουλευθείτε τις ακόλουθες επίσημες παραπομπές:
- Έγγραφα που επανεκκινούν την τεκμηρίωση πολιτικών
- Βασικό εγχειρίδιο μονάδας υπηρεσίας
- Εποπτεία σύνταξης γιατρών
Συμπέρασμα
Η ενσωμάτωση του συστήματος με τα δοχεία Docker σας δίνει έναν ισχυρό, αυτοματοποιημένο μηχανισμό εκκίνησης που ενσωματώνει απρόσκοπτα με το υπόλοιπο σύστημα Linux. Με τη συγγραφή καλοδομημένων αρχείων μονάδων υπηρεσιών, μπορείτε να ελέγξετε την εντολή εκκίνησης, να διαχειριστείτε εξαρτήσεις, να ορίσετε όρια πόρων και να παρακολουθείτε τα αρχεία καταγραφής χρησιμοποιώντας εργαλεία που ήδη γνωρίζει η ομάδα λειτουργίας σας. Είτε επιλέξετε μεμονωμένες υπηρεσίες για κάθε δοχείο ή μια ενιαία μονάδα για να ενορχηστρώσετε μια στοίβα σύνθεσης, το σύστημα παρέχει την αξιοπιστία και την προβλεψιμότητα που απαιτούν τα περιβάλλοντα παραγωγής.
Ξεκινήστε με ένα απλό αρχείο μονάδας, εξετάστε το προσεκτικά, στη συνέχεια, στρώμα σε προηγμένες επιλογές, όπως τα αρχεία περιβάλλοντος, τους ελέγχους υγείας, και τη σκλήρυνση ασφαλείας. Με αυτή την προσέγγιση, Docker δοχεία σας θα επιβιώσει επανεκκίνηση, καταρρεύσεις, και αλλαγές διαμόρφωσης χωρίς χειροκίνητη παρέμβαση, απελευθερώνοντας την ομάδα σας να επικεντρωθεί σε εφαρμογές κατασκευής.