Έχεις μια web υπηρεσία που τρέχει σε nginx container. Έχει βγει νέα έκδοση του nginx docker image και χρειάζεσαι αυτή την νέα έκδοση. Τι κάνεις με το container που χρησιμοποιήθηκε μια παλιά έκδοση nginx; Πως το αναβαθμίζεις στην νέα έκδοση;

Μέχρι στιγμής, παίξαμε με την δημιουργία των container και την διασύνδεση τους, την αποθήκευση και διατήρηση των δεδομένων που παράγουν κλπ.

Όλη η σειρά οδηγών «Πως χρησιμοποιούμε το Docker βρίσκεται στον σύνδεσμο»:

– cerebrux.net/tag/docker-intro

Όμως, ποτέ ένα image στο οποίο βασίζεται το container μας δεν μένει στην ίδια έκδοση. Όπως συμβαίνει και με όλα τα άλλα λογισμικά έχουν και αυτά έναν κύκλο ζωής οπότε και νέες εκδόσεις. Ακόμα και εμείς, που θα μάθουμε σε επόμενο οδηγό να χτίζουμε δικά μας images, θα χρειαστεί να φτιάχνουμε νέα container από κάθε νέο image που θα φτιάχνουμε.

Advertisements

Άρα πρέπει να έχουμε έναν τρόπο που θα μπορούμε να αναβαθμίζουμε τα docker container μας στις τελευταίες εκδόσεις.

Οι τρόποι που θα δείξουμε παρακάτω μπορούν να εφαρμοστούν σε μικρής κλίμακας εγκαταστάσεις με docker και όχι σε multi-node εγκαταστάσεις.

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

Σε μικρής κλίμακας εγκαταστάσεις λοιπόν, υπάρχουν δύο τρόποι:

  1. Ο … manual τρόπος και
  2. Ο αυτόματος τρόπος…

Εκπληκτικό έτσι…

Σε γενικές γραμμές και οι δυο τρόποι περιλαμβάνουν:

  • Την λήψη της νέας έκδοση 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

Πάω λοιπόν να δω αν η σελίδα δουλεύει όπως θα έπρεπε και βλέπω ότι όντως δουλεύει μια χαρά !

συνδέω με τον φάκελο που ήταν συνδεδεμένο και το παλιό container
Advertisements

Αυτόματη αναβάθμιση του 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 βρίσκεται στην επίσημη τεκμηρίωσή του:

https://containrrr.dev/watchtower/arguments/

Αυτό ήταν ! Δεν χρειάζεται να κάνουμε τίποτα άλλο. Μπορούμε να δούμε μάλιστα μέσα από το Portainer που είχαμε στήσει στο προηγούμενο οδηγό, τα logs του Watchtower για να δούμε τι κάνει.

τα logs του Watchtower για να δούμε τι κάνει

Επίλογος

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