Ενότητα 9 · 9.2
Εγκατάσταση του 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:
- Η πηγή πακέτων της ίδιας της Docker (
download.docker.com). Πάντα η νεότερη έκδοση, μαζί με το plug-indocker composeπου θα χρησιμοποιήσετε στο μάθημα 9.3. Αυτό περιγράφει η τεκμηρίωση του Docker και αυτό χρησιμοποιεί αυτή η σειρά μαθημάτων. - Το πακέτο
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.
Κουίζ
Άσκηση
Άσκηση 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
Αυτή την άσκηση την κάνετε μόνοι σας: κανείς δεν την ελέγχει. Σημειώστε τι έχετε κάνει και επισημάνετε την άσκηση ως ολοκληρωμένη.
Από την πηγή του Docker, το unattended-upgrades δεν το ενημερώνει από προεπιλογή· το docker.io από τη διανομή το ενημερώνει. Το ss πρέπει να δείχνει 127.0.0.1:8080, όχι 0.0.0.0:8080. Η ομάδα docker δίνει δικαιώματα root· με sudo docker κάθε εντολή καταγράφεται στο αρχείο καταγραφής του sudo.
Τα τικ και οι σημειώσεις σας παραμένουν μόνο σε αυτό το πρόγραμμα περιήγησης· δεν τα στέλνουμε πουθενά. Αν έχετε εγγραφεί, αποθηκεύουμε στο Τα μαθήματά μου μόνο ότι έχετε ολοκληρώσει την άσκηση.
Για περαιτέρω μελέτη
- Τεκμηρίωση Docker, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Τεκμηρίωση Docker, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Τεκμηρίωση Docker, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Τεκμηρίωση Docker, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Τεκμηρίωση Docker, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Τεκμηρίωση Docker, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
