Μετάβαση στο περιεχόμενο

Ρυθμίσεις cookies

Επιλέξτε ανά κατηγορία ποια cookies επιτρέπετε. Μπορείτε να αλλάξετε την επιλογή σας οποιαδήποτε στιγμή μέσω των Ρυθμίσεων cookies στο κάτω μέρος κάθε σελίδας. Δήλωση απορρήτου

Απαραίτητα

Πάντα ενεργά

Χρειάζονται για τη σύνδεση, για να διατηρείται το καλάθι σας και για να θυμόμαστε τις επιλογές σας. Είναι πάντα ενεργά.

Ποια cookies;
  • weboke_sessie, weboke_klant, weboke_remember: η συνεδρία σας και η παραμονή σε σύνδεση
  • weboke_basket: το καλάθι σας
  • wkBtwIncl: εμφάνιση τιμών με ή χωρίς ΦΠΑ
  • wok_cookies: η επιλογή σας για τα cookies, 12 μήνες

Μετρούν ποια διαφήμιση οδηγεί σε επίσκεψη ή παραγγελία, ώστε να μην πληρώνουμε για διαφημίσεις που δεν αποδίδουν.

Ποια cookies;
  • Google Ads μέσω Google Tag Manager (_gcl_au, _gcl_aw), έως 90 ημέρες
  • OpenAI Ads, διαφημίσεις στο ChatGPT
  • wok_aff: μέσω ποιου συνεργάτη ήρθατε σε εμάς (πρόγραμμα συνεργατών), 60 ημέρες

4,6

Χώρα και γλώσσα

Κάθε χώρα έχει τη δική της ιστοσελίδα, με τιμές και ΦΠΑ της χώρας αυτής.

Προβολή

Εγκατάσταση του Docker και το πρώτο σας container

Ενότητα 9: Docker και docker compose · Χρόνος ανάγνωσης: 11 λεπτά

Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να εγκαταστήσετε το Docker Engine από την επίσημη πηγή πακέτων, να εκκινείτε, να εξετάζετε, να βλέπετε το εσωτερικό και να καθαρίζετε containers, και γνωρίζετε γιατί η ομάδα docker ισοδυναμεί με root.

Βασικές έννοιες: Docker Engine, Docker Desktop, επίσημη πηγή apt, docker.io του Debian, ομάδα docker, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df

Ποιο Docker;

Σε έναν server εγκαθιστάτε το Docker Engine: την υπηρεσία παρασκηνίου (dockerd) μαζί με την εντολή docker. Το Docker Desktop είναι κάτι άλλο: ένα πρόγραμμα με παράθυρα για Windows, macOS και επιτραπέζια συστήματα Linux. Αυτό δεν ανήκει σε έναν server.

Υπάρχουν δύο αξιόπιστες πηγές για το Docker Engine:

  1. Η πηγή πακέτων της ίδιας της Docker (download.docker.com). Πάντα η νεότερη έκδοση, μαζί με το plug-in docker compose που θα χρησιμοποιήσετε στο μάθημα 9.3. Αυτό περιγράφει η τεκμηρίωση του Docker και αυτό χρησιμοποιεί αυτή η σειρά μαθημάτων.
  2. Το πακέτο docker.io του Debian ή του Ubuntu. Παλαιότερο, αλλά ενημερώνεται από τη διανομή μέσω των συνηθισμένων ενημερώσεων ασφαλείας σας (μάθημα 4.2). Ιδανικό αν προτιμάτε να μην έχετε τίποτα εκτός διανομής· ελέγξτε όμως ότι το docker compose (με κενό) είναι διαθέσιμο.

Επιλέξτε μία από τις δύο. Η μεικτή εγκατάσταση προκαλεί συγκρούσεις· γι' αυτό η τεκμηρίωση του Docker λέει να αφαιρέσετε πρώτα ανεπίσημα πακέτα όπως τα docker.io, docker-compose και podman-docker.

Εγκατάσταση από την πηγή πακέτων της Docker

Αυτά είναι τα βήματα από την τεκμηρίωση του Docker για το Debian, με το κλειδί ξεχωριστά και ένα δικό του Signed-By (μάθημα 4.1). Αν το προτιμάτε, δημιουργήστε πρώτα ένα snapshot.

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc

Στη συνέχεια το αρχείο πηγής /etc/apt/sources.list.d/docker.sources (μορφή deb822):

Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

Στο Suites μπαίνει η κωδική ονομασία της δικής σας έκδοσης (cat /etc/os-release, μάθημα 4.3) και στο Architectures η έξοδος της εντολής dpkg --print-architecture. Στο Ubuntu η URL είναι https://download.docker.com/linux/ubuntu και η suite για παράδειγμα noble.

Έπειτα η εγκατάσταση:

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.

Στο Debian και στο Ubuntu το Docker ξεκινά αυτόματα μετά την εγκατάσταση και επίσης μετά από κάθε επανεκκίνηση (systemctl status docker, μάθημα 6.1).

Προσοχή: το unattended-upgrades (μάθημα 4.2) από προεπιλογή δεν ενημερώνει αυτόματα πακέτα από αυτή την πηγή. Συμπεριλάβετε το sudo apt update && sudo apt upgrade για το Docker στον ρυθμό συντήρησής σας (μάθημα 10.4) ή προσθέστε συνειδητά την πηγή στις αυτόματες ενημερώσεις σας.

Η ομάδα docker είναι root

Παντού στο διαδίκτυο θα διαβάσετε ότι πρέπει να προσθέσετε τον εαυτό σας στην ομάδα docker, ώστε να μη χρειάζεται πλέον να πληκτρολογείτε sudo:

anna@web1:~$ sudo usermod -aG docker anna

Κάντε το μόνο αν καταλαβαίνετε τι σημαίνει. Η τεκμηρίωση του Docker είναι σαφής: η ομάδα docker δίνει δικαιώματα σε επίπεδο root. Όποιος μπορεί να ελέγχει την υπηρεσία Docker μπορεί να εκκινήσει ένα container με ολόκληρο τον δίσκο του host προσαρτημένο μέσα:

docker run -it -v /:/host debian chroot /host

και έτσι γίνεται root στον server σας, χωρίς κωδικό πρόσβασης και χωρίς καταγραφή στο αρχείο του sudo. Η τεκμηρίωση του Docker το διατυπώνει ως εξής: μόνο αξιόπιστοι χρήστες πρέπει να μπορούν να ελέγχουν την υπηρεσία Docker.

Για έναν server που διαχειρίζεστε μόνο εσείς, πρόκειται για επιλογή: ευκολία έναντι ενός επιπλέον δρόμου προς το root. Ασφαλέστερο είναι να συνεχίσετε να πληκτρολογείτε sudo docker ...· έτσι κάθε εντολή καταγράφεται στο αρχείο του sudo (μάθημα 3.2). Σε κάθε περίπτωση, μην προσθέτετε ποτέ στην ομάδα έναν χρήστη που δεν επιτρέπεται να είναι root, όπως έναν χρήστη υπηρεσίας για έναν ιστότοπο.

Rootless mode

Το Docker μπορεί επίσης να λειτουργεί χωρίς root: η υπηρεσία και τα containers εκτελούνται τότε υπό έναν κανονικό χρήστη, με δικό τους user namespace. Το εγκαθιστάτε ως αυτός ο χρήστης με το dockerd-rootless-setuptool.sh install (από το πακέτο docker-ce-rootless-extras· χρειάζεται προηγουμένως το πακέτο uidmap). Ένα κενό ασφαλείας σε ένα container δεν δίνει τότε root στον host. Υπάρχουν περιορισμοί και η ρύθμιση είναι πιο δύσκολη· σε αυτή τη σειρά μαθημάτων χρησιμοποιούμε την κανονική εγκατάσταση και διατηρούμε την ασφάλεια με τους κανόνες αυτής της ενότητας.

Ένα πρώτο πραγματικό container

Εκκινούμε έναν web server nginx σε ένα container, προσβάσιμο μόνο από τον ίδιο τον server:

anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...

Τα μέρη:

ΜέροςΣημασία
-dΕκτέλεση στο παρασκήνιο (detached)
--name proefΈνα όνομα, ώστε να μη χρειάζεται να δουλεύετε με μεγάλα ID
-p 127.0.0.1:8080:80Η θύρα 80 στο container γίνεται θύρα 8080 στον host, μόνο στο loopback
nginx:stableΤο επίσημο image του nginx, tag stable

Έλεγχος:

anna@web1:~$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  STATUS         PORTS                    NAMES
3f1c9e0d7a2b   nginx:stable   "/docker-entrypoint.…"   Up 5 seconds   127.0.0.1:8080->80/tcp   proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))

Το ss (μάθημα 5.1) επιβεβαιώνει: μόνο στο 127.0.0.1. Αν είχατε πληκτρολογήσει -p 8080:80, θα εμφανιζόταν 0.0.0.0:8080 και [::]:8080, και το container σας θα ήταν προσβάσιμο από το διαδίκτυο, ακόμη κι αν το ufw δεν επιτρέπει τη θύρα 8080 (μάθημα 9.3). Η έκδοση στο header Server μπορεί να διαφέρει στο δικό σας σύστημα.

Εξερεύνηση και παρέμβαση

anna@web1:~$ sudo docker logs proef            # ό,τι έγραψε το πρόγραμμα (stdout και stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef   # οι τελευταίες 20 γραμμές και συνεχής παρακολούθηση
anna@web1:~$ sudo docker exec -it proef sh     # ένα shell μέσα στο container που εκτελείται
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef           # διακοπή και αφαίρεση

Το docker logs είναι το πρώτο σημείο που κοιτάτε όταν ένα container δεν κάνει αυτό που περιμένετε, όπως το journalctl για τις κανονικές υπηρεσίες (μάθημα 6.2). Με το docker exec βλέπετε το εσωτερικό, αλλά καλύτερα να μην αλλάζετε τίποτα εκεί: οι αλλαγές μέσα στο container χάνονται με την επόμενη ενημέρωση (μάθημα 9.1).

Καθαρισμός

Τα images και τα σταματημένα containers παραμένουν μέχρι να τα καθαρίσετε. Σε ένα VPS με μικρό δίσκο αυτό συσσωρεύεται χωρίς να το καταλάβετε.

anna@web1:~$ sudo docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         3         1.9GB     1.2GB (63%)
Containers      3         3         12MB      0B (0%)
Local Volumes   2         2         180MB     0B (0%)
Build Cache     0         0         0B        0B
anna@web1:~$ sudo docker image prune

Το docker image prune αφαιρεί images χωρίς όνομα που δεν ανήκουν πλέον πουθενά· με το -a αφαιρεί επίσης όλα τα images που δεν χρησιμοποιούνται από κανένα container. Να είστε προσεκτικοί με το docker system prune --volumes: αφαιρεί επίσης ανώνυμα volumes (χωρίς όνομα) που εκείνη τη στιγμή δεν ανήκουν σε κάποιο container, και το docker volume prune -a ακόμη και volumes με όνομα. Σε αυτά μπορεί να βρίσκονται τα δεδομένα σας. Γι' αυτό δίνετε πάντα όνομα στα volumes ή χρησιμοποιείτε ένα bind mount (μάθημα 9.1), και ελέγξτε πρώτα με το docker volume ls.

Τα logs των containers μπορούν επίσης να μεγαλώνουν. Το Docker τα αποθηκεύει από προεπιλογή σε αρχεία JSON χωρίς όριο μεγέθους. Ένα όριο ορίζετε στο /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Έπειτα sudo systemctl restart docker· η ρύθμιση ισχύει μόνο για νέα containers, τα υπάρχοντα containers τα δημιουργείτε ξανά.

Στην πράξη

Το Docker λειτουργεί σε ένα VPS της WebOké ακριβώς όπως σε οποιονδήποτε άλλο πάροχο: είναι λογισμικό μέσα στον δικό σας server, το οποίο εγκαθιστάτε και ενημερώνετε μόνοι σας. Σε ένα μικρό VPS ελέγχετε τακτικά τον χώρο στον δίσκο με το docker system df και το df -h (μάθημα 1.4).

Σύνοψη

  • Εγκαταστήστε το Docker Engine από την πηγή πακέτων της Docker (με δικό του κλειδί και Signed-By) ή το docker.io από τη διανομή, όχι και τα δύο.
  • Η ομάδα docker ισοδυναμεί με root· το sudo docker αφήνει ίχνος στο αρχείο του sudo. Το rootless mode είναι μια ασφαλέστερη αλλά πιο περιορισμένη εναλλακτική.
  • Το docker run -d --name ... -p 127.0.0.1:host:container image:tag εκκινεί ένα container που είναι προσβάσιμο μόνο τοπικά· ελέγξτε με το ss.
  • Τα docker ps, logs, exec, stop, rm είναι τα καθημερινά σας εργαλεία.
  • Καθαρίζετε τα images με το docker image prune, βάζετε όριο στα logs των containers (από προεπιλογή απεριόριστα) και χρησιμοποιείτε με φειδώ το --volumes.

Κουίζ

1. Γιατί η συμμετοχή στην ομάδα docker δίνει στην ουσία δικαιώματα root;



2. Μετά το docker run -d -p 8080:80 nginx το ss -tlnp εμφανίζει τη γραμμή 0.0.0.0:8080. Τι έπρεπε να πληκτρολογήσετε ώστε η θύρα να δημοσιευτεί μόνο τοπικά;



3. Ένα container ξεκινά, αλλά ο ιστότοπος μέσα σε αυτό δεν λειτουργεί. Τι ελέγχετε πρώτα;



4. Γιατί επιλέγετε μία πηγή για το Docker και δεν εγκαθιστάτε ανάμεικτα το docker.io και το docker-ce;



5. Τι κάνει το docker system prune --volumes που πρέπει να γνωρίζετε καλά;



Άσκηση

Άσκηση O9.2: Το πρώτο σας container. Εγκαταστήστε το Docker Engine στον server σας σύμφωνα με το μάθημα (ή σε ένα δοκιμαστικό μηχάνημα). Εκκινήστε ένα container nginx που ακούει μόνο στο 127.0.0.1:8080, ελέγξτε με τα docker ps, curl -I και ss -tlnp, δείτε τα logs και στη συνέχεια καθαρίστε το. Απαντήστε στις ερωτήσεις: από ποια πηγή εγκαταστήσατε το Docker, τι έδειξε το ss για τη θύρα 8080 και προσθέσατε τον εαυτό σας στην ομάδα docker (γιατί ναι ή γιατί όχι);

Άσκηση O9.2: Το πρώτο σας container

Αυτή την άσκηση την κάνετε μόνοι σας: κανείς δεν την ελέγχει. Σημειώστε τι έχετε κάνει και επισημάνετε την άσκηση ως ολοκληρωμένη.




Τα τικ και οι σημειώσεις σας παραμένουν μόνο σε αυτό το πρόγραμμα περιήγησης· δεν τα στέλνουμε πουθενά. Αν έχετε εγγραφεί, αποθηκεύουμε στο Τα μαθήματά μου μόνο ότι έχετε ολοκληρώσει την άσκηση.

Για περαιτέρω μελέτη

Μια στιγμή…

Ρυθμίστε τα domains σας

Ρυθμίστε για κάθε domain τους nameservers, τη σύνδεση με το hosting σας και ποιος θα είναι ο κάτοχος.

Φόρτωση των domains σας…