Στο πρώτο μέρος , μιλήσαμε για το πώς λειτουργούν τα Docker Container και διαφέρουν από άλλες τεχνολογίες και στο δεύτερο μέρος , ετοιμάσαμε το σύστημά μας για τη διαχείριση των Docker Container.
Σε αυτό το μέρος, θα αρχίσουμε να χρησιμοποιούμε Docker στιγμιότυπα (images) και θα δημιουργούμε από αυτά Container με ένα web-based, προσωπικό σημειωματάριο που θα τρέχει σε DokuWiki ή το WordPress. Μπορείτε να επιλέξετε ό, τι σας εξυπηρετεί.
Όλη η σειρά οδηγών «Πως χρησιμοποιούμε το Docker βρίσκεται στον σύνδεσμο»:
Πώς τρέχουμε ένα Docker Container
Πρώτα απ’ όλα πρέπει να σιγουρευτούμε ότι το Docker engine λειτουργεί σωστά, κατεβάζοντας ένα στιγμιότυπο «Hello world» και δημιουργώντας ένα Docker Container από αυτό.
Θυμηθείτε, όταν μιλάμε για ένα στιγμιότυπο (Docker Image), είναι η πακεταρισμένη κατάσταση, ενώ όταν μιλάμε για το Container είναι η εκτελέσιμη κατάσταση του στιγμιότυπου Docker. Σε μια αντίστοιχη αναλογία που μιλήσαμε σε προηγούμενο μέρος, ένα Docker Image είναι σαν το αρχείο ISO μιας διανομής Linux, ενώ το Docker Container είναι η Live συνεδρία του αρχείου ISO σαν να το χρησιμοποιούσατε από μια μονάδα USB.
Για να κατεβάσετε και να δημιουργήσετε ένα Container απο ένα «Hello world» Docekr Image απλώς τρέξετε στο τερματικό:
docker run hello-world
Αυτή η εντολή
- ψάχνει αν υπάρχει ήδη κατεβασμένο το image
hello-world
στο σύστημα μας - αν δεν το βρει κατεβάζει το Docker Image του Hello World
- δημιουργεί ένα container από αυτό και το τρέχει.
- Όταν το Container τρέξει, εκτυπώνει ένα ενημερωτικό μήνυμα και στη συνέχεια, εξέρχεται (σημαίνει ότι κλείνει).

Για να δούμε πόσα Docker Images έχουμε κατεβασμένα στο σύστημα μας, τρέχουμε:
docker images

Μετά απο αυτές τις πρώτες εντολές, είναι εύλογο να αναρωτηθείτε «πώς το σύστημα μου βρήκε αυτό το Docker Image του «Hello World» και από πού προήλθε»; Εδώ λοιπόν μπαίνει στο «παιχνίδι» το Docker Hub.
Εισαγωγή στο Docker Hub
Το Docker Hub είναι μια Cloud υπηρεσία και λειτουργεί ως ένα κεντρικό αποθετήριο για την εύρεση, την δημιουργία αλλά και την διανομή των Docker Images. Συγκεκριμένα, το Docker Hub παρέχει ορισμένα χρήσιμα χαρακτηριστικά και λειτουργίες, τα οποία θα συζητήσουμε περισσότερο σε επόμενα μέρη.
Επί του παρόντος, θα επικεντρωθούμε σε ένα μόνο χαρακτηριστικό και αυτό είναι η εύρεση και η λήψη ενός Docker Image.
Αναζήτηση ενός Docker Image
Μπορείτε να αναζητήσετε ένα «έτοιμο για λήψη και εκτέλεση Docker Image», επισκεπτόμενοι το online Docker Hub ή χρησιμοποιώντας το τερματικό. Εκεί μπορείτε να μάθετε περισσότερα για ένα Docker Image, όπως το πως έχει δημιουργηθεί, πως συντηρούνται κλπ.
Για το σκοπό αυτού του μέρους ας ψάξουμε για το WordPress:
docker search wordpress

Όπως μπορείτε να διαπιστώσετε και μόνοι σας, υπάρχουν πολλά Docker Images για το WordPress, που είναι «χτισμένοι» με διάφορους συνδυασμούς (π.χ. με ή χωρίς την ενσωμάτωση της βάσης δεδομένων), βαθμολογούνται με αστέρια δημοτικότητας και είναι είτε επίσημα (συντηρημένα από την εταιρεία docker) είτε ανεπίσημα (χτισμένα από διάφορους χρήστες του Docker Hub).
Είναι προφανές ότι ο καθένας μπορεί να δημιουργήσει έναν λογαριασμό στον Docker Hub και να ανεβάσει το προσαρμοσμένο στις ανάγκες του Docker Image. Αυτό όμως θα το συζητήσουμε αργότερα.
Λήψη ενός Docker Image
Για το σκοπό αυτού του άρθρου, θα χρησιμοποιήσουμε την τελευταία έκδοση του Docker Image της εταιρείας bitnami. Ας το κατεβάσουμε:
docker pull bitnami/wordpress
Μόλις εκτελέσετε την παραπάνω εντολή, θα επικοινωνήσει με το Docker Hub, θα ρωτήσει εάν υπάρχει ένα αποθετήριο με όνομα «bitnami», έπειτα θα ρωτήσει εάν υπάρχει ένα «WordPress» Docker Image που έχει επισημανθεί ως η «πιο πρόσφατη» (latest) έκδοση και θα την κατεβάσει (pull).

Επί του παρόντος, έχουμε κατεβάσει ένα Docker Image του WordPress και τίποτα άλλο. Μπορούμε να προχωρήσουμε και να κάνουμε λήψη και ενός Docker Image του DokuWiki, αναζητώντας μία έκδοση από το Docker Hub και επιλέγοντας αυτή που μας αρέσει. Εναλλακτικά μπορείτε να χρησιμοποιήσετε την εξής:
sudo docker pull mprasil/dokuwiki
Διαγραφή ενός Docker Image
Τώρα αν ελέγξετε πόσα Docker Image έχετε στο σύστημά σας
docker images
Θα δείτε τα WordPress, DokuWiki και το Hello World. Εάν για οποιονδήποτε λόγο θέλετε να αφαιρέσετε και να διαγράψετε (rmi) ένα από τα Docker Image πρώτα θα πρέπει να διαγράψετε το container που σχετίζεται με αυτό το image
docker ps -a
με την οποία θα δείτε container που τρέχουν ή και εχουν σταματήσει. Άρα στην περίπτωσή μας μπορούμε να διαγράψουμε το container του hello-world:
docekr rm <όνομα η ID του container>
Για το ID μπορείτε να πληκτρολογήσετε πχ τα πρώτα 2 ή 3 ψηφία (αρκεί να μην ξεκινάνε άλλα container με τα ίδια). Στην συνέχεια αφού πλέον έχει αποδεσμευτεί το image μας από όλα τα container που το χρησιμοποιούν πληκτρολογείτε απλά:
docker rmi <όνομα docker image>
Όπου το όνομα Docker Image είναι το όνομα του όπως εμφανίζεται με την εντολή » docker images». Για παράδειγμα, αν θέλουμε να διαγράψουμε το Hello World μπορούμε απλά να πληκτρολογήσουμε:
docker rmi hello-world
Η αρχιτεκτονική του Docker Image
Αν παρατηρήσατε προσεκτικά, κατά την διαδικασία λήψης ενός Docker Image, μπορείτε να δείτε στην πραγματικότητα ότι το docker image είναι πολλαπλών επιπέδων Image η οποία στηρίζεται πάνω σε ένα βασικό Docker Image.
Μπορείτε να δείτε κάθε στρώμα που κατεβαίνει και στη συνέχεια με έναν «μαγικό» τρόπο ενοποιείται. Το παρακάτω διάγραμμα δείχνει Docker Image που έχει ως βάση το Ubuntu που περιλαμβάνει 4 στρώματα-στοιβάδες Image.

Όπως μπορείτε να φανταστείτε, κάθε Docker Image αποτελείται από μια στοιβάδα με στρώματα τα οποία είναι μόνο για ανάγνωση (δεν τροποποιούνται) που αντιπροσωπεύουν διαφορές στο σύστημα αρχείων.
Όταν δημιουργείτε ένα νέο Container, από κάποιο Docker Image, προσθέτετε ένα νέο, εγγράψιμο στρώμα πάνω από την υποκείμενη στοιβάδα. Όλες οι αλλαγές που έγιναν στο Container που «τρέχει» όπως π.χ. η εγγραφή νέων αρχείων, η τροποποίηση των υπαρχόντων αρχείων και η διαγραφή αρχείων, γράφονται σε αυτό το λεπτό εγγράψιμο στρώμα (R/W layer).

Τα Docker Container είναι εφήμερα
Εκ φύσεως τα Docker Container είναι εφήμερα. Με τον όρο «εφήμερο» εννοούμε ότι ένα Container μπορεί να σταματήσει να λειτουργεί και να διαγραφεί κατά το δοκούν και στην συνέχεια να δημιουργηθεί ένα εντελώς νέο από το ίδιο Docker Image από το οποίο προήλθε εξαρχής και να τεθεί σε εφαρμογή (ως Container) με ελάχιστη ρύθμιση και διαμόρφωση.
Επομένως, θα πρέπει να έχετε κατά νου ότι όταν θα δημιουργήσουμε ένα Container από το Docker Image της προτίμησής σας (WordPress ή DokuWiki), τυχόν αλλαγές που θα κάνετε, π.χ. προσθήκη μιας ανάρτησης, εικόνα κλπ, θα χαθούν μόλις σταματήσετε ή διαγράψετε το Container.
Με άλλα λόγια, όταν σταματήσει ένα container, όλα τα δεδομένα που έχουν γραφτεί αλλά δεν είναι αποθηκευμένα σε έναν Data Volume (τόμος δεδομένων), διαγράφονται μαζί με το δοχείο.
Docker Volumes
Ένας τόμος δεδομένων (κάτι σαν αποθηκευτικό μέσον) είναι ένας κατάλογος ή ένα αρχείο στο σύστημα αρχείων του λειτουργικού συστήματος και είναι προσαρτημένο σαν συσκευή αποθήκευσης στο Docker Container.
Με αυτόν τον τρόπο μπορείτε να αντικαταστήσετε το Container με ένα νέο και να διατηρήσετε όλα τα δεδομένα ασφαλή. Σημειώστε ότι μπορείτε να προσαρτήσετε σε ένα Container όσους τομείς δεδομένων (Data Volumes) επιθυμείτε. Επίσης πολλά Container μπορούν να μοιράζονται έναν ή περισσότερα Data Volumes.
Το παρακάτω διάγραμμα δείχνει έναν κεντρικό υπολογιστή που τρέχει το Docker (π.χ. το Ubuntu 16.04) το οποίο έχει «στήσει» δύο Containers. Όπως βλέπετε, υπάρχει επίσης ένα κοινό Data Volume το οποίο βρίσκεται στην διαδρομή /data του λειτουργικού (π.χ. το Ubuntu 16.04) που τρέχει το Docker. Αυτό το Data Volume έχει προσαρτηθεί (mounted) απευθείας και στα δύο Container.

Με αυτόν τον τρόπο, όταν διαγράφεται ένα κοντέινερ, τα δεδομένα που αποθηκεύονται στα Data Volume εξακολουθούν να υπάρχουν στο λειτουργικό σύστημα που εκτελείται η υπηρεσία Docker και μπορούν να γίνουν mount σε ένα νέο Container.
Για παράδειγμα αν ένα docker image υποστηρίζει εγγραφή δεδομένων σε docker volume (συνήθως το αναφέρουν στην τεκμηρίωσή τους το τι και που θα γίνει mount) τότε αυτό γίνεται με την παράμετρο -v
(παλιά μορφή) η την --mount
(νέα μορφή):
Με mount:
docker run -d \ --name devtest \ --mount source=myvol2,target=/app \ nginx:latest
Με v:
docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
Και δύο εντολές
- θα δημιουργήσουν ένα container (
run
) - που θα τρέχει στο background (
-d
) - με όνομα (
--name
) devtest - το οποίο θα προσαρτήσει (
--mount
ή-v
) τον εσωτερικό φάκελό του (target=/app
ή:/app
) στον φάκελο του συστήματός μας (source=myvol2
ήmyvol2
) - και θα προέρχεται από το image
nginx:latest
Με αυτόν τον τρόπο, ακόμα και να μας κρασάρει το container devtest
υα δεδομένα μας είναι δεν θα έχουν χαθεί αφού θα βρίσκονται στον φάκελο myvol2
. Άρα το μόνο που έχουμε να κάνουμε είναι να φτιάξουμε ένα νέο container και να προσαρτήσουμε σε αυτό τον ίδιο φάκελο ώστε η εφαρμογή μας να διαβάσει τα δεδομένα από εκεί που σταμάτησε.
Για να μάθετε περισσότερα σχετικά με τα Data Volumes δείτε στην επίσημη τεκμηρίωση https://docs.docker.com/storage/volumes/
Δικτύωση των Docker Container
Όταν εγκαταστήσαμε το Docker, αυτό δημιούργησε μια συσκευή δικτύου στο σύστημά σας. Μπορείτε να το δείτε χρησιμοποιώντας την εντολή ifconfig στο τερματικό σας (θα ονομάζεται docker0).
Είναι σημαντικό να κατανοήσουμε ότι τα Docker Container είναι απομονωμένα απο το υποκείμενο λειτουργικό σύστημα και ουσιαστικά είναι μεμονωμένες μικρο-υπηρεσίες που έχουν τις δικές τους ιδιότητες δικτύου. Ο τρόπος με τον οποίο επικοινωνούμε με αυτά είναι με την «προσάρτηση» του Port στο οποίο εκθέτει την εκάστοτε υπηρεσία του Container με ένα Port του λειτουργικού μας συστήματος.
Με αυτόν τον τρόπο μπορούμε να εκθέσουμε την υπηρεσία (π.χ. το WordPress) που τρέχει ένα Container ώστε να είναι προσβάσιμο από το λειτουργικό μας σύστημα.
Το υποσύστημα δικτύωσης του Docker είναι προσαρτήσιμο και μπορεί να αλλάζει κατά περίπτωση, χρησιμοποιώντας drivers. Υπάρχουν αρκετοί drivers και παρέχουν βασική λειτουργικότητα δικτύωσης:
- bridged: Το προεπιλεγμένο πρόγραμμα οδήγησης δικτύου. Εάν δεν καθορίσετε πρόγραμμα οδήγησης, αυτός είναι ο τύπος δικτύου που δημιουργείτε. Τα δίκτυα Bridge χρησιμοποιούνται συνήθως όταν οι εφαρμογές σας εκτελούνται σε αυτόνομα container που πρέπει να επικοινωνούν. Δείτε τα δίκτυα γεφυρών.
- host: ;Όταν θέλουμε να καταργήσουμε την απομόνωση δικτύου μεταξύ του κοντέινερ και του λειτουργικού που τρέχει το Docker για να χρησιμοποιήσετε απευθείας τη δικτύωση του.
- none: Απενεργοποιεί όλη την δικτύωση. Συνήθως χρησιμοποιείται σε συνδυασμό με ένα προσαρμοσμένο δικό σας networking driver.
Επομένως για να δείτε τις διαθέσιμες δικτυώσεις :
docker network ls
Docker Default bridge
Ξεκινήστε δύο alpine
containers που τρέχουν ash
, το οποίο είναι το προεπιλεγμένο κέλυφος της Alpine (και όχι το bash).
docker run -dit --name alpine1 alpine ash
docker run -dit --name alpine2 alpine ash
Οι παράμετροι -dit
σημαίνουν ότι ξεκινά το κοντέινερ αποσυνδεδεμένο -d
(στο παρασκήνιο), διαδραστικό -i
(με δυνατότητα πληκτρολόγησης σε αυτό) και με ένα TTY τερματικό -t
(ώστε να μπορείτε να δείτε την είσοδο και την έξοδο). Δεδομένου ότι το ξεκινάτε αποσυνδεδεμένο, δεν θα συνδεθείτε αμέσως με το κοντέινερ. Αντ ‘αυτού, θα εκτυπωθεί το αναγνωριστικό ID του κοντέινερ. Επειδή δεν έχετε καθορίσει παραμέτρους δικτύου, τα κοντέινερ συνδέονται στο προεπιλεγμένο δίκτυο που είναι το bridged mode.
Ελέγξτε ότι και τα δύο κοντέινερ έχουν ξεκινήσει:
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
602dbf1edc81 alpine "ash" 4 seconds ago Up 3 seconds alpine2
da33b7aa74b0 alpine "ash" 17 seconds ago Up 16 seconds alpine1
Ελέγξτε το δίκτυο bridged για να δείτε ποια container είναι συνδεδεμένα σε αυτά:
docker network inspect bridge
Κοντά στην κορυφή της εξόδου της παραπάνω εντολής, αναφέρονται πληροφορίες σχετικά με το δίκτυο bridge, συμπεριλαμβανομένης της διεύθυνσης IP της πύλης μεταξύ του Docker Host (του υπολογιστή σας) και του δικτύου bridge (172.17.0.1). Κάτω από το Containers, παρατίθεται το ID κάθε συνδεδεμένου κοντέινερ, μαζί με πληροφορίες σχετικά με τη διεύθυνση IP του (172.17.0.2 για alpine1 και 172.17.0.3 για alpine2).
Τα container τα ξεκινήσατε και τα αφήσατε να τρέχουν στο παρασκήνιο. Χρησιμοποιήστε την εντολή παρακάτω για να συνδεθείτε στο alpine1
docker attach alpine1
Η προτροπή του τερματικού σας αλλάζει σε # για να σας δείξει ότι είστε ο root
χρήστης στο κοντέινερ. Χρησιμοποιήστε την εντολή ip addr show
για να εμφανίσετε τις διεπαφές δικτύου για το alpine1
καθώς φαίνονται μέσα από το κοντέινερ:
ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
[....]
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 scope global eth0
[....]
Όπως βλέπετε η δεύτερη διεπαφή έχει τη διεύθυνση IP 172.17.0.2, η οποία είναι η ίδια διεύθυνση που εμφανίζεται για το alpine1 στο προηγούμενο βήμα.
Τώρα προσπαθήστε να κάνετε ping στο δεύτερο container (alpine2) στην διεύθυνση IP του 172.17.0.3:
ping -c 2 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.086 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.094 ms
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.086/0.090/0.094 ms
Στη συνέχεια, δοκιμάστε να κάνετε ping στο κοντέινερ alpine2 αλλά με το με το όνομα του κοντέινερ. Αυτό όπως θα δείτε θα αποτύχει.
ping -c 2 alpine2
ping: bad address 'alpine2'
Χμ… ας τα κάνουμε με τον σωστό τρόπο μιας και η χρήση της default bridge δεν πρέπει να χρησιμοποιείται απευθείας αλλά θα πρέπει να φτιάξουμε δικιά μας διεπαφή δικτύου που θα είναι τύπου bridge.
Docker user-defined bridge networks
Σταματήστε και διαγράψτε και τα δύο container:
docker container stop alpine1 alpine2
docker container rm alpine1 alpine2
Ξεκινάμε και πάλι δύο alpine κοντέινερ, αλλά τα συνδέουμε σε ένα καθορισμένο από το χρήστη δίκτυο που ονομάζεται alpine-net
. Αυτά τα κοντέινερ δεν είναι συνδεδεμένα καθόλου στο προεπιλεγμένο δίκτυο bridge Στη συνέχεια ξεκινάμε ένα τρίτο alpine container που είναι συνδεδεμένο στο δίκτυο bridge αλλά δεν είναι συνδεδεμένο με το alpine-ne
t, και ένα τέταρτο που είναι συνδεδεμένο και στα δύο δίκτυα.
πάμε να φτιάξουμε την διεπαφή alpine-net
docker network create --driver bridge alpine-net
αν εξετάσουμε το δίκτυο alpine-net:
docker network inspect alpine-net
Θα δούμε ότι η πύλη αυτού του δικτύου είναι 172.18.0.1, σε αντίθεση με το προεπιλεγμένο δίκτυο bridge, του οποίου η πύλη είναι 172.17.0.1. Η ακριβής διεύθυνση IP ενδέχεται να διαφέρει στο σύστημά σας.
Πάμε να φτιάξουμε τα container μας και να τα συνδέσουμε στις διεπαφές που είπαμε.
docker run -dit --name alpine1 --network alpine-net alpine ash
docker run -dit --name alpine2 --network alpine-net alpine ash
docker run -dit --name alpine3 alpine ash
docker run -dit --name alpine4 --network alpine-net alpine ash
Επειδή με το docker run
μπορείτε να συνδεθείτε μόνο σε ένα δίκτυο κάθε φορά με το --network
, πρέπει να χρησιμοποιήσετε τη σύνδεση δικτύου docker στη συνέχεια για να συνδέσετε το alpine4
στο δίκτυο default bridge επίσης
docker network connect bridge alpine4
Ελέγξτε ότι και τα κοντέινερ έχουν ξεκινήσει και δείτε τα ID τους:
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
156849ccd902 alpine "ash" 41 seconds ago Up 41 seconds alpine4
fa1340b8d83e alpine "ash" 51 seconds ago Up 51 seconds alpine3
a535d969081e alpine "ash" About a minute ago Up About a minute alpine2
0a02c449a6e9 alpine "ash" About a minute ago Up About a minute alpine1
στην συνέχεια εξετάστε την bridge δικτύωση:
docker network inspect bridge
όπου θα δείτε τα alpine3 και alpine4 να συνδέονται στο δίκτυο bridge. Αν εξετάσετε την δικτύωση του alpine-net:
docker network inspect alpine-net
Τα alpine1, alpine2 και alpine4 είναι συνδεδεμένα στο δίκτυο alpine-net
Σε δίκτυα που καθορίζονται από τον χρήστη, όπως κάναμε με το alpine-net, τα κοντέινερ όχι μόνο μπορούν να επικοινωνούν μέσω διεύθυνσης IP, αλλά μπορούν επίσης να επιλύσουν το όνομα ενός κοντέινερ σε μια διεύθυνση IP (host name to IP). Αυτή η δυνατότητα ονομάζεται automatic service discovery
(αυτόματη ανακάλυψη υπηρεσίας). Ας συνδεθούμε με το alpine1 και να το δοκιμάσουμε. Το alpine1 θα πρέπει να μπορεί να επιλύει (resolve) το όνομα alpine2 και το alpine4 (και το ίδιο το alpine1) σε διευθύνσεις IP:
ocker container attach alpine1
# ping -c 2 alpine2
PING alpine2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.085 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.090 ms
--- alpine2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.085/0.087/0.090 ms
# ping -c 2 alpine4
PING alpine4 (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.076 ms
64 bytes from 172.18.0.4: seq=1 ttl=64 time=0.091 ms
--- alpine4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.076/0.083/0.091 ms
# ping -c 2 alpine1
PING alpine1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.026 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.054 ms
--- alpine1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.026/0.040/0.054 ms
Αποσύνδεθείτε από το alpine1 χρησιμοποιώντας την ακολουθία αποσύνδεσης, CTRL + p CTRL + q
(κρατήστε πατημένο το CTRL και πληκτρολογήστε το p ακολουθούμενο από το q). Θυμηθείτε ότι το alpine4 είναι συνδεδεμένο τόσο στο προεπιλεγμένο δίκτυο bridge όσο και στο alpine-net. Θα πρέπει να μπορεί να φτάσει σε όλα τα άλλα container. Ωστόσο, θα πρέπει να «μιλήσετε» στο alpine3 από τη διεύθυνση IP του. Συνδεθείτε το και εκτελέστε τις δοκιμές:
docker container attach alpine4
# ping -c 2 alpine1
PING alpine1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.074 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.082 ms
--- alpine1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.074/0.078/0.082 ms
# ping -c 2 alpine2
PING alpine2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.075 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.080 ms
--- alpine2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.075/0.077/0.080 ms
# ping -c 2 alpine3
ping: bad address 'alpine3'
# ping -c 2 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.089 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.075 ms
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.075/0.082/0.089 ms
# ping -c 2 alpine4
PING alpine4 (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.033 ms
64 bytes from 172.18.0.4: seq=1 ttl=64 time=0.064 ms
--- alpine4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.033/0.048/0.064 ms
Περισσότερα για την δικτύωση μπορείτε να μάθετε απο την επίσημη τεκμηρίωση https://docs.docker.com/network/.
Δημιουργία ενός προσωπικού σημειωματάριου με ένα WordPress Container
Με το Docker Compose απλά χρησιμοποιούμε μια έτοιμη «συνταγή», γραμμένη σε YAML η οποία κάνει όλη την δουλειά αυτοματοποιημένα.
Ας δημιουργήσουμε λοιπόν το σημειωματάριό μας χρησιμοποιώντας το Docker Compose της Bitnami με το οποίο θα δημιουργηθούν 2 Containers, ένα για την βάση δεδομένων MariaDB και ένα του WordPress:
curl -LO https://raw.githubusercontent.com/bitnami/bitnami-docker-wordpress/master/docker-compose.yml docker-compose up
Αφού γίνει η προετοιμασία του Container, θα δείτε στο τερματικό σας κάποιες πληροφορίες σχετικά με αυτό. Ήρθε η ώρα να ξεκινήσετε το browser σας και να το πάτε στην διεύθυνση στο http://localhost

Αν όλα πάνε καλά, θα δείτε τον προεπιλεγμένο ιστότοπο του WordPress
Ας επιστρέψουμε στο τερματικό όπου τρέχει το Container. Όπως βλέπετε, το τερματικό σας είναι τώρα συνδεδεμένο με το τρέχον Container. Μπορείτε να χρησιμοποιήσετε το Ctrl + C για έξοδο το οποίο θα σταματήσει επίσης και το Container του WordPress αλλά και της βάσης δεδομένων.
Τώρα, ελέγξτε τα διαθέσιμα Container σας με την ακόλουθη εντολή:
docker ps -a
Όπως μπορείτε να δείτε από το αποτέλεσμα της παραπάνω εντολής, υπάρχουν μερικές σημαντικές πληροφορίες όπως το όνομα του Container και το μοναδικό αναγνωριστικό του (Container ID). Με αυτόν τον τρόπο μπορούμε να ξεκινήσουμε ξανά τα Container μας:
sudo docker start <onoma container wordpress> <onoma container mariadb>
Στην συνέχεια μπορείτε με την παρακάτω εντολή να ελέγξετε τις διεργασίες που τρέχει ένα Container:
sudo
docker top
<onoma Container>
Αν θέλετε να σταματήσετε κάποιο Container απλά εκτελείτε:
sudo
docker stop <onoma Container>
Μπορείτε να διαβάσετε περισσότερα σχετικά με τον τρόπο αλληλεπίδρασης σας με τα Container στην επίσημη τεκμηρίωση Docker https://docs.docker.com/engine/userguide/
Που βρίσκονται τα Docker Container
Αν θέλετε να δείτε πού βρίσκονται τα δοχεία στο σύστημα αρχείων hosts τότε μπορείτε να μεταβείτε στο /var/lib/docker
sudo
-icd
/var/lib/docker/lscd
containers
Δημιουργία προσωπικού σημειωματάριου με DokuWiki Container
Αν θέλετε κάτι πιο απλό σε σημειωματάριο τότε συνιστώ την χρήση του DokuWiki. Όπως έχουμε κατεβάσει προηγουμένως το Docker Image του, το μόνο που μένει να γίνει είναι να δημιουργηθεί ένα Container από αυτό.
sudo
docker run -d -p 80:80 --name my_wiki mprasil/dokuwiki
Με την παραπάνω εντολή είπαμε στην υπηρεσία Docker :
- να συνδέσει τα port 80 (Http) του συστήματος με του Container
- το Container να ονομάζεται my_wiki
- και να χρησιμοποιηθεί το Docker Image mprasil/dokuwiki
Στη συνέχεια, πηγαίνετε στον browser σας και προσθέστε την ακόλουθη διεύθυνση για να ξεκινήσετε τη διαμόρφωση του wiki σημειωματάριου σας:
http://localhost/install.php
Μπορείτε να μάθετε περισσότερα για το DokuWiki από την επίσημη τεκμηρίωση και να προσαρμόσετε το wiki για τις ανάγκες σας: https://www.dokuwiki.org/manual
Διαγραφή ενός Docker Container
Μόλις είστε έτοιμοι να δημιουργήσετε, να ξεκινήσετε και να σταματήσετε τα Container σας, θα θέλετε να καθαρίσετε το χάος των δοκιμών που δημιουργήθηκε από τα πολλαπλά Container.
Για να διαγράψετε ένα Container, θα πρέπει πρώτα να το σταματήσετε και στη συνέχεια να τον διαγράψετε εκτελώντας την ακόλουθη εντολή:
sudo docker rm <όνομα του Container ή ID>
Μπορείτε επίσης να προσθέσετε πολλαπλά ID στην ίδια εντολή ‘docker rm’ για να διαγράψετε ταυτόχρονα πολλά Docker Container.
Επίλογος
Σε αυτό το μέρος, μάθαμε πώς να δημιουργήσουμε ένα Container και να το χρησιμοποιήσουμε με έναν πρακτικό τρόπο για να δημιουργήσουμε ένα προσωπικό σημειωματάριο με βάση είτε το WordPress είτε το DokuWiki. Εξετάσαμε κάποιες βασικές εντολές σχετικά με τον τρόπο εκκίνησης και τερματισμού των Container και πώς να διαγράψουμε τα Docker Images και τα Docker Container.
Στο επόμενο μέρος, θα ρίξουμε μια ματιά στο πώς δημιουργούνται τα Docker Images δημιουργώντας ένα δικό μας.
Όσοι ενδιαφέρεστε μπορείτε :
Εγγραφείτε στο Newsletter του Cerebrux.net για να λαμβάνετε ειδοποίηση για νέα άρθρα
Ομορφη η γραφη σου Salih, αλλα νομιζω θα χρειαστει και αλλη μελετη το ολο θεμα.
Ενδιαφερον πολυ, αλλα πρωτογνωρο….δεν ξερω αν μπορω να υποθεσω( αλλα ετσι μου μοιαζει), οτι σε καποιες περιπτωσεις θα αντικαταστησει δυναμικα το virtualization ?
Όχι δεν θα αντικαταστήσει, διότι όπως γράφω στο άρθρο, το Virtualization απαιτείται όταν θέλεις να τρέχεις πολλά λειτουργικά στον ίδιο Server. Εφόσον υπάρχουν πελάτες που ζητάνε ο καθένας διαφορετικό λειτουργικό για να εκτελεί μέσα σε αυτό docker υπηρεσίες τότε η ανάγκη για virtualization λειτουργικού θα συνεχίσει να υπάρχει
Δε μας δείχνεις όμως, πως μπορούμε να συνδεθούμε σε ένα docker container και να κάνουμε ότι αλλαγές θέλουμε εντός του.
Δεν μπορώ να συνδεθώ μέσα στο container ( να μπω μέσα του ) και να βλέπω όλα τα αρχεία και να τα παραμετροποιήσω όπως θέλω εγώ;
Ευχαριστώ.
Γράφω » Μπορείτε να διαβάσετε περισσότερα σχετικά με τον τρόπο αλληλεπίδρασης σας με τα Container στην επίσημη τεκμηρίωση Docker https://docs.docker.com/engine/userguide/»
Δεν σκοπεύω να αντικαταστήσω την επίσημη τεκμηρίωση :) Εγώ απλώς δείχνω τα βασικά και προσπαθώ να κινήσω το ενδιαφέρον. Από εκεί και πέρα οποίος χρειάζεται παραπάνω πράγματα μελετάει :)
Οκ, ναι καταλαβαίνω τι λες και συμφωνώ.
Γίνεται όμως αυτό που αναφέρω, σωστά;
Εννοείται γίνεται ! Μάλιστα και να βλέπεις τα αρχεία μπορείς στο λειτουργικό σου, όπου τρέχει το docker αλλά και να συνδεθείς μέσα στο ψευδο-λειτουργικο που τρέχει εντός του το docker. Αλλά αυτά τα αφήνω για σένα ;)
Έχει βγει το 4ο μέρος; Πολύ καλή δουλειά!
Πολύ ωραίο σύνολο άρθρων! Συγχαρητήρια! Το 4ο μέρος υπάρχει πουθενά;;
Δε έχει κυκλοφορήσει
Πολύ καλή η δουλειά σου συνέχισε. vakvag
Νασε καλά ευχαριστούμε