Docker | Πώς δημιουργούμε ένα container και ποια είναι τα πρώτα που αξίζει να κατεβάσουμε στον υπολογιστή μας

Είπαμε τις προάλλες πώς μπορεί το Docker να μας βοηθήσει να εγκαταστήσουμε web υπηρεσίες (και όχι μόνο) στον υπολογιστή μας, γλιτώνοντάς μας από τα μειονεκτήματα ενός “κλασικού” server ή μιας εικονικής μηχανής. Σήμερα θα δούμε συγκεκριμένες εντολές δημιουργίας container, ενώ θα προτείνουμε και μερικές χρήσιμες υπηρεσίες που πρέπει όλοι να έχουμε στο σύστημά μας.

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

  • τη μηχανή εκτέλεσης (Docker engine),
  • τα container (containers),
  • τις υπηρεσίες / εφαρμογές που θέλουμε να τρέξουμε (images) και
  • διάφορες παραμέτρους που αφορούν τα container (environment, volumes κλπ.).

Αν υποθέσουμε ότι το Docker είναι ένα πλοίο (Docker engine), τότε οι εφαρμογές που θα του εγκαταστήσουμε είναι πακεταρισμένες σε κιβώτια (images). Για να φορτώσουμε αυτά τα κιβώτια στο πλοίο, πρέπει πρώτα να τα βάλουμε σε container (containers), τα οποία θα πρέπει να τοποθετήσουμε σε συγκεκριμένες θέσεις και με συγκεκριμένο τρόπο (παράμετροι) επάνω στο πλοίο, ανάλογα με το είδος τους.

Η εντολή δημιουργίας ενός container

Έχοντας λοιπόν αυτή την εικόνα στο μυαλό μας, μπορούμε τώρα να μιλήσουμε για την εντολή δημιουργίας ενός container η οποία είναι κάπως έτσι:

docker run -d --name=Kitsos --restart=unless-stopped -v Kitsos_data:/data_folder -p 8123:80 -e TZ=Europe/Athens DrAndroid/Kitsos

Μπορεί επίσης να τη δούμε και ως εξής:

docker run -d \
  --name=Kitsos \
  --restart=unless-stopped \
  -v Kitsos_data:/docker_data \
  -p 8123:80 \
  -e TZ=Europe/Athens \
  DrAndroid/Kitsos

Ας πάρουμε όμως ένα προς ένα όλα τα παραπάνω για να δούμε τι σημαίνουν:

  • docker run -d: Είναι η εντολή για τη δημιουργία και την εκκίνηση ενός container. Ο δείκτης “-d” προέρχεται από τη λέξη “detached” και πρακτικά σημαίνει ότι θέλουμε το container μας να συνεχίσει να τρέχει αφού κλείσουμε το τερματικό μας.
  • –name=Kitsos: Εδώ δίνουμε ένα όνομα στο container μας για να μπορούμε να το ξεχωρίσουμε στη συνέχεια.
  • –restart=unless-stopped: Εδώ λέμε στο Docker ότι το συγκεκριμένο container θέλουμε να επανεκκινεί σε όλες τις περιπτώσεις (π.χ. μετά από διακοπή ρεύματος), εκτός από την περίπτωση που το έχουμε σταματήσει εμείς.
  • -v Kitsos_data:/docker_data: Με το δείκτη “-v” που προέρχεται από το “volume”, λέμε στο container μας ότι θέλουμε να αποθηκεύει τα δεδομένα του σε ένα χώρο που του έχουμε δημιουργήσει. Στη συγκεκριμένη περίπτωση ο χώρος ονομάζεται “Kitsos_data” και βρίσκεται στο φάκελο “docker_data” του λειτουργικού μας συστήματος.
  • -p 8123:80: Με το δείκτη “-p” που προέρχεται από το “port”, λέμε στο Docker ότι η υπηρεσία μας η οποία κανονικά τρέχει στην πόρτα 80, θέλουμε στο σύστημά μας να τρέχει στην 8123. Ο λόγος που το κάνουμε αυτό είναι γιατί αν έχουμε περισσότερες από μία υπηρεσίες, η κάθε μία από αυτές πρέπει να λειτουργεί σε διαφορετική πόρτα.
  • -e TZ=Europe/Athens: Με το δείκτη “-e” που προέρχεται από το “environment” δηλώνουμε κάποιες ειδικές παραμέτρους που είναι αναγκαίες για μερικά container. Για παράδειγμα το δικό μας θέλει να γνωρίζει προκαταβολικά το timezone στο οποίο βρισκόμαστε για να λειτουργεί σωστά.
  • DrAndroid/Kitsos: Εδώ τέλος δηλώνουμε το image που θέλουμε να κατεβάσουμε από το DockerHub και το όνομα του developer.

Κάποια από τα παραπάνω είναι απαραίτητα ενώ κάποια άλλα προαιρετικά και αυτό εξαρτάται από το κάθε container. Το καλό είναι ότι δε χρειάζεται να τα γνωρίζουμε απ’ έξω, αφού τα αναφέρει ο κάθε δημιουργός στο DockerHub .

Μερικά χρήσιμα container που αξίζει να έχεις στον υπολογιστή σου

Στο προηγούμενο άρθρο εγκαταστήσαμε το Heimdall, μία “Αρχική σελίδα” στην οποία μπορούμε να προσθέσουμε όλες τις Docker υπηρεσίες μας (και όχι μόνο) για να τις βρίσκουμε εύκολα. Για να το δούμε πάλι:

docker volume create heimdall
docker run -d \
  --name=heimdall \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=europe/athens \
  -p 8001:80 \
  -p 9001:443 \
  -v heimdall:/config \
  --restart unless-stopped \
  linuxserver/heimdall

Με την πρώτη εντολή δημιουργούμε το “volume” που χρειάζεται το Heimdall για να λειτουργήσει, το οποίο δηλώνουμε στη δεύτερη εντολή (-v) ότι θέλουμε να βρίσκεται στο φάκελο “config” του συστήματος. Στη δεύτερη δίνουμε επίσης τις τρεις παραμέτρους περιβάλλοντος (-e) που χρειάζεται το Heimall, όπως επίσης και δύο πόρτες (-p), τις οποίες στέλνουμε σε άλλες θύρες γιατί εκεί μας βολεύει να το χρησιμοποιούμε.

Αφού τρέξουμε την εντολή μπορούμε να ανοίξουμε έναν browser στη διεύθυνση “localhost:8001” και θα δούμε την υπηρεσία του Heimdall.

Δεύτερο παράδειγμα το Portainer, το οποίο είναι μία εφαρμογή διαχείρισης του Docker με γραφικό περιβάλλον. Αυτό τρέχει με την εξής εντολή:

docker volume create portainer
docker run -d \
  --name=portainer \
  -p 8000:8000 \
  -p 9000:9000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer:/data \
  --restart unless-stopped \
  portainer/portainer

Η εντολή είναι παρόμοια αλλά υπάρχουν κάποιες διαφοροποιήσεις. Για παράδειγμα οι πόρτες στις οποίες τρέχει το Portainer (8000 και 9000) μας βολεύουν οπότε δεν τις αλλάξαμε. Επίσης εκτός από το “volume” που δημιουργήσαμε, το Portainer χρειάζεται να προσδεθεί και στο “docker.sock” για τους δικούς του λόγους που δε μας απασχολούν αυτή τη στιγμή.

Σε αυτή την περίπτωση το Portainer τρέχει στη διεύθυνση "localhost:9000"

Τρίτο παράδειγμα το Watchtower, μία υπηρεσία που αναλαμβάνει να αναβαθμίζει αυτόματα όλα τα container που έχουμε στον υπολογιστή μας. Αυτό εγκαθίσταται ως εξής:

docker run -d \
  --name watchtower \
  -e TZ=Europe/Athens \
  -e WATCHTOWER_CLEANUP=true \
  -e WATCHTOWER_INCLUDE_STOPPED=true \
  -e WATCHTOWER_POLL_INTERVAL=86400 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower

Στην περίπτωση αυτή έχουμε τέσσερις περιβαλλοντικούς παράγοντες (-e). Ο πρώτος είναι το timezone στο οποίο βρισκόμαστε. Με τον δεύτερο διαγράφονται αυτόματα όλα τα παλιά image που έχουν πλέον αναβαθμιστεί. Με τον τρίτο αναβαθμίζονται ακόμη και τα container που τα έχουμε σταματήσει. Με τον τέταρτο η αναζήτηση για να αναβαθμίσεις γίνεται κάθε 86400 δευτερόλεπτα, δηλαδή μία φορά τη μέρα.

Σε αυτή την περίπτωση επίσης δε χρειάζεται να δημιουργήσουμε κάποιο “volume”, καθώς το Watchtower δεν αποθηκεύει δεδομένα πουθενά, ενώ τέλος δε δηλώνουμε και κάποιο port, αφού δε διαθέτει γραφικό περιβάλλον για να επισκεφτούμε.

Εν κατακλείδι

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

10 «Μου αρέσει»

Επ, τι έγινε Χρηστάρα το ρίξαμε στα κοντέινερς; :smiley: :smiley: :smiley:

Συμβουλή: Ωραία, τώρα απεγκατέστησε το docker και χρησιμοποίησε το podman (ιδιες εντολες είναι) για να μην έχεις τζάμπα έναν χοντρό daemon που τρέχει. Θα μπορέσεις να τρέξεις και non-root έτσι. Γενικά ο κόσμος φεύγει (οι μεγάλοι έχουν ήδη φύγει) από το docker.

4 «Μου αρέσει»

Γεια σου ρε Πάνο!

Ότι καινούριο μαθαίνεις καλό είναι. Θα ρίξω μια ματιά και στο podman, ευχαριστώ.

2 «Μου αρέσει»

Καλησπέρα!

Να κάνω μία ερώτηση μάλλον χαζή, αλλά να την πάρει το ποτάμι…

Μπορεί κανείς σε ένα πχ debian + docker να τρέξει σε ένα container ένα windows 10 πρόγραμμα (χωρίς wine - natively)?

Φαντάζομαι ότι όχι, αλλά ας ρωτήξω την κοτσάνα μου… :wink:

Μπορεί, αλλά από προσωπική εμπειρία δεν αξίζει… Το Windows Server image που υπάρχει για docker, είναι αρκετά βαρύ και μεγάλο και δε συμφέρει για να τρέξεις μια απλή υπηρεσία, πχ έναν Web Server.
Επίσης, μην ξεχνάς ότι δεν υποστηρίζει εύκολα γραφικό περιβάλλον, αν σκέφτεσαι να τρέξεις εφαρμογή που δεν είναι διαθέσιμη σε Linux.