Έχεις μια web υπηρεσία που τρέχει σε nginx container. Έχει βγει νέα έκδοση του nginx docker image και χρειάζεσαι αυτή την νέα έκδοση. Τι κάνεις με το container που χρησιμοποιήθηκε μια παλιά έκδοση nginx; Πως το αναβαθμίζεις στην νέα έκδοση;
Μέχρι στιγμής, παίξαμε με την δημιουργία των container και την διασύνδεση τους, την αποθήκευση και διατήρηση των δεδομένων που παράγουν κλπ.
Όλη η σειρά οδηγών «Πως χρησιμοποιούμε το Docker βρίσκεται στον σύνδεσμο»:
Όμως, ποτέ ένα image στο οποίο βασίζεται το container μας δεν μένει στην ίδια έκδοση. Όπως συμβαίνει και με όλα τα άλλα λογισμικά έχουν και αυτά έναν κύκλο ζωής οπότε και νέες εκδόσεις. Ακόμα και εμείς, που θα μάθουμε σε επόμενο οδηγό να χτίζουμε δικά μας images, θα χρειαστεί να φτιάχνουμε νέα container από κάθε νέο image που θα φτιάχνουμε.
Άρα πρέπει να έχουμε έναν τρόπο που θα μπορούμε να αναβαθμίζουμε τα docker container μας στις τελευταίες εκδόσεις.
Οι τρόποι που θα δείξουμε παρακάτω μπορούν να εφαρμοστούν σε μικρής κλίμακας εγκαταστάσεις με docker και όχι σε multi-node εγκαταστάσεις.
Επειδή όμως η σειρά Docker Intro αφορά εσάς που τώρα μαθαίνετε για το Docker, θα εστιάσουμε στα απόλυτα βασικά, διότι ακόμα και οι λύσεις μεγάλης κλίμακας δεν κάνουν κάτι εντελώς διαφορετικό αφού οι βασικές αρχές είναι οι ίδιες.
Σε μικρής κλίμακας εγκαταστάσεις λοιπόν, υπάρχουν δύο τρόποι:
- Ο … manual τρόπος και
- Ο αυτόματος τρόπος…
Εκπληκτικό έτσι…
Σε γενικές γραμμές και οι δυο τρόποι περιλαμβάνουν:
- Την λήψη της νέας έκδοση Docker image στο οποίο βασίστηκε το Container μας.
- Σταμάτημα και διαγραφή του container
- Δημιουργία νέου container και σύνδεση του με το υπάρχον volume ή φάκελο δεδομένων.
Manual αναβάθμιση του Docker Container σε νέα έκδοση
Ας πάρουμε λοιπόν το εξής απλό σενάριο.
Ας πούμε ότι έχω ένα Nginx ως Docker container με όνομα nginx-statiki
χρησιμοποιώντας την επίσημη έκδοση nginx
docker image.
Έστω ότι το Container είχε δημιουργηθεί πριν αρκετούς μήνες και χρησιμοποιεί δεδομένα (ένα html αρχείο) που τραβάει από τον φάκελο με όνομα statiki-selida
που βρίσκεται στον home φάκελο του χρήστη του server.
Έστω τώρα ότι είχα μια αρκετά παλιά έκδοση:
docker images | grep nginx nginx latest df2f62220164 6 months ago 102MB nginx 1.18.0 6ae8fb7db539 6 months ago 47.3MB
Για να βεβαιωθώ ότι έχω την τελευταία έκδοση, τρέχω την παράμετρο pull
:
docker pull nginx Using default tag: latest latest: Pulling from library/nginx bf5952930446: Already exists cb9a6de05e5a: Pull complete 9513ea0afb93: Pull complete b49ea07d2e93: Pull complete a5e4a503d449: Pull complete Digest: sha256:b0ad43f7ee5edbc0effbc14645ae7055e21bc1973aee5150745632a24a752661 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest
Ωραία ! Τώρα, το τοπικό αποθετήριο μου με τα docker images περιέχει μια ενημερωμένη έκδοση Nginx. Το container όμως που λειτουργεί αυτήν τη στιγμή εξακολουθεί να χρησιμοποιεί το αρχικό (παλιό) image.
Για να το χρησιμοποιήσω, πρέπει να αφαιρέσω το παλιό container και να ξεκινήσω ένα νέο container με βάση τη συγκεκριμένη ενημερωμένη εικόνα αλλά και να το συνδέσω στο παλιό volume.
docker stop nginx-statiki docker rm nginx-statiki
Τέλεια… έφυγε το παλιό, οπότε φτιάχνω πάλι ένα container που θα χρησιμοποιήσει το νέο φρεσκότατο image και το συνδέω με τον φάκελο που ήταν συνδεδεμένο και το παλιό container:
docker run -d \ -p 80:80 \ --name nginx-statiki \ -v ~/statiki-selida/:/usr/share/nginx/html/ \ nginx
Πάω λοιπόν να δω αν η σελίδα δουλεύει όπως θα έπρεπε και βλέπω ότι όντως δουλεύει μια χαρά !

Αυτόματη αναβάθμιση του Docker Container σε νέα έκδοση
Μια από τις πιο δημοφιλής εφαρμογές αυτόματης αναβάθμισης των container είναι το Watchtower.
To Watchtower είναι και αυτό ένα docker container και δουλεύει ως μία υπηρεσία που παρακολουθεί για νέες εκδόσεις των docker images και όταν χρειαστεί τα κατεβάζει και κάνει αναβάθμιση με βάση αυτά όλα τα container μας.
Επίσης με το Watchtower μπορείτε να ενημερώσετε την τρέχουσα έκδοση της web containered εφαρμογής σας απλώς στέλνοντας ένα νέο image στο Docker Hub. Το Watchtower θα κατεβάσει τη νέα εικόνα, θα κλείσει το υπάρχον κοντέινερ σας και θα το επανεκκινήσει με τις ίδιες επιλογές και ρυθμίσεις που χρησιμοποιήθηκαν όταν είχε δημιουργηθεί για πρώτη φορά. αρχικά.
Οπότε πάμε να το κάνουμε deploy:
docker run -d \ -e TZ=Europe/Athens \ -e WATCHTOWER_CLEANUP=true \ -e WATCHTOWER_DEBUG=true \ -v /var/run/docker.sock:/var/run/docker.sock \ --restart unless-stopped \ --name updater \ containrrr/watchtower
Με το παραπάνω, φτιάχνουμε ένα container με όνομα updater
και του ρυθμίζουμε την ζώνη ώρας Αθήνα
, του λέμε να διαγράφει τα παλιά images αφού αναβαθμιστούν και να μην σταματάει εκτός και αν το πούμε εμείς.
Μια πλήρη λίστα με τις παραμέτρους που λαμβάνει το Watchtower βρίσκεται στην επίσημη τεκμηρίωσή του:
Αυτό ήταν ! Δεν χρειάζεται να κάνουμε τίποτα άλλο. Μπορούμε να δούμε μάλιστα μέσα από το Portainer που είχαμε στήσει στο προηγούμενο οδηγό, τα logs του Watchtower για να δούμε τι κάνει.

Επίλογος
Στον σημερινό οδηγό, μάθαμε σε γενικές γραμμές τι σημαίνει «αναβαθμίζω – κάνω deploy νέα έκδοση ενός container». Συνοψίζοντας, η διαδικασία είτε αυτόματη είτε με το χέρι, περιλαμβάνει την λήψη νέας έκδοσης image, διακοπή και διαγραφή παλιού container και δημιουργία νέου container με βάση την νέα έκδοση του image.
Σου άρεσε το άρθρο; Πες την άποψή σου... έστω και Ανώνυμα: