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

Σε αυτό το μέρος, θα αρχίσουμε να χρησιμοποιούμε Docker στιγμιότυπα (images) και θα δημιουργούμε από αυτά Container με ένα web-based, προσωπικό σημειωματάριο που θα τρέχει σε DokuWiki ή το WordPress. Μπορείτε να επιλέξετε ό, τι σας εξυπηρετεί.

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

cerebrux.net/tag/docker-intro

Πώς τρέχουμε ένα Docker Container

Πρώτα απ’ όλα πρέπει να σιγουρευτούμε ότι το Docker engine λειτουργεί σωστά, κατεβάζοντας ένα στιγμιότυπο «Hello world» και δημιουργώντας ένα Docker Container από αυτό.

Θυμηθείτε, όταν μιλάμε για ένα στιγμιότυπο (Docker Image), είναι η πακεταρισμένη κατάσταση, ενώ όταν μιλάμε για το Container είναι η εκτελέσιμη κατάσταση του στιγμιότυπου Docker. Σε μια αντίστοιχη αναλογία που μιλήσαμε σε προηγούμενο μέρος, ένα Docker Image είναι σαν το αρχείο ISO μιας διανομής Linux, ενώ το Docker Container είναι η Live συνεδρία του αρχείου ISO σαν να το χρησιμοποιούσατε από μια μονάδα USB.

Advertisements

Για να κατεβάσετε και να δημιουργήσετε ένα Container απο ένα  «Hello world» Docekr Image απλώς τρέξετε στο τερματικό:

docker run hello-world

Αυτή η εντολή

  • ψάχνει αν υπάρχει ήδη κατεβασμένο το image hello-world στο σύστημα μας
  • αν δεν το βρει κατεβάζει το Docker Image του Hello World
  • δημιουργεί ένα container από αυτό και το τρέχει.
  • Όταν το Container τρέξει, εκτυπώνει ένα ενημερωτικό μήνυμα και στη συνέχεια, εξέρχεται (σημαίνει ότι κλείνει).
doker-pos-xrisimopoioyme-docker-hello-world

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

docker images
doker-pos-xrisimopoioyme-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
doker-pos-xrisimopoioyme-docker-search

Όπως μπορείτε να διαπιστώσετε και μόνοι σας, υπάρχουν πολλά 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).

doker-pos-xrisimopoioyme-docker-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
Advertisements

Η αρχιτεκτονική του Docker Image

Αν παρατηρήσατε προσεκτικά, κατά την διαδικασία λήψης ενός Docker Image, μπορείτε να δείτε στην πραγματικότητα ότι το docker image είναι πολλαπλών επιπέδων Image η οποία στηρίζεται πάνω σε ένα βασικό Docker Image.

Μπορείτε να δείτε κάθε στρώμα που κατεβαίνει και στη συνέχεια με έναν «μαγικό» τρόπο ενοποιείται. Το παρακάτω διάγραμμα δείχνει Docker Image που έχει ως βάση το Ubuntu που περιλαμβάνει 4 στρώματα-στοιβάδες Image.

doker-pos-xrisimopoioyme-docker-architecture

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

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

doker-pos-xrisimopoioyme-docker-architecture-layers

Τα 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.

doker-pos-xrisimopoioyme-docker-datavolume

Με αυτόν τον τρόπο, όταν διαγράφεται ένα κοντέινερ, τα δεδομένα που αποθηκεύονται στα 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

Και δύο εντολές

  1. θα δημιουργήσουν ένα container (run)
  2. που θα τρέχει στο background (-d)
  3. με όνομα (--name) devtest
  4. το οποίο θα προσαρτήσει (--mount ή -v) τον εσωτερικό φάκελό του (target=/app ή :/app) στον φάκελο του συστήματός μας (source=myvol2 ή myvol2)
  5. και θα προέρχεται από το 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-net, και ένα τέταρτο που είναι συνδεδεμένο και στα δύο δίκτυα.

πάμε να φτιάξουμε την διεπαφή 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/.

Advertisements

Δημιουργία ενός προσωπικού σημειωματάριου με ένα 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

doker-pos-xrisimopoioyme-docker-compose

Αν όλα πάνε καλά, θα δείτε τον προεπιλεγμένο ιστότοπο του 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
Advertisements

Δημιουργία προσωπικού σημειωματάριου με 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 για να λαμβάνετε ειδοποίηση για νέα άρθρα