Docker: Η Καινοτομία στην Ανάπτυξη Λογισμικού

Το Docker, μέσω της επαναστατικής τεχνολογίας του, έχει καταφέρει να ανατρέψει τις παραδοσιακές μεθόδους ανάπτυξης και διαχείρισης λογισμικού στο χώρο του προγραμματισμού. Αποκτώντας συνεχώς δημοτικότητα και αποδοχή, το Docker έχει εδραιωθεί ως ένα κρίσιμο εργαλείο στην ανάπτυξη σύγχρονου λογισμικού, ενισχύοντας την ευελιξία και την αποδοτικότητα στις διαδικασίες ανάπτυξης εφαρμογών. Το Stack Overflow σε μια από τις μεγαλύτερες έρευνες που πραγματοποίει κάθε χρόνο ανέδειξε το Docker στην πρώτη θέση της κατηγορίας το 20231

Τι είναι το Docker

Το Docker είναι μια επαναστατική προσέγγιση στη διαχείριση εφαρμογών και την ανάπτυξη λογισμικού που αφήνει πίσω του τα βαριά και δύσχρηστα Virtual Machines (VMs) αλλά δεν σταματάει εκεί. Στη βάση του το Docker είναι μια πλατφόρμα που επιτρέπει τη δημιουργία, τον διαμοιρασμό και την εκτέλεση εφαρμογών χρησιμοποιώντας την έννοια των Containers.

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

Τα containers τρέχουν σε πολλά διαφορετικά λειτουργικά περιβάλλοντα (Windows, Linux, και Mac) και σε πολλά διαφορετικά συστήματα (Computers, workstation, servers και cloud) με τον ίδιο τρόπο. Τα συστήματα αυτά έχουν εγκατεστημένη την πλατφόρμα (Docker Engine) όπου μπορεί να “διαβάζει” και “εκτελεί” τα αρχεία κειμένου (DockerFiles) που ειναι ιδανικά για να μεταφέρονται εύκολα.

Πλεονεκτήματα της τεχνολογίας

Το Docker προσφέρει σημαντικά πλεονεκτήματα σε σύγκριση με τις εικονικές μηχανές. Ενώ οι VMs προσομοιώνουν πλήρεις υπολογιστικές μηχανές με δικό τους λειτουργικό σύστημα, το Docker χρησιμοποιεί την τεχνική Virtualization σε επίπεδο λειτουργικού συστήματος, προσφέροντας πολλαπλά πλεονεκτήματα. Μερικά από αυτά είναι:

  1. Αποτελεσματική Χρήση Πόρων: Τα Docker containers προσφέρουν ανώτερη αποδοτικότητα στη χρήση πόρων. Αυτό επιτυγχάνεται μέσω της κοινής χρήσης του λειτουργικού συστήματος και των βιβλιοθηκών με τον host υπολογιστή, σε αντίθεση με τις εικονικές μηχανές που απαιτούν ξεχωριστά λειτουργικά συστήματα, αυξάνοντας την κατανάλωση πόρων και πολυπλοκότητας.
  2. Γρηγορότερη Εκκίνηση: Σε αντίθεση με τις VMs, που απαιτούν σημαντικό χρόνο για την πλήρη φόρτωση του λειτουργικού συστήματος, τα Docker containers ξεκινούν σχεδόν ακαριαία, συχνά μέσα σε λίγα δευτερόλεπτα. Επισης ειναι γρηγορότερη η χρήση, ρύθμιση και αυτοματοποίηση της ανάπτυξης εφαρμογών χωρίς εγκαταστάσεις λειτουργικών και εφαρμογών κ.α.
  3. PortabilityΦορητότητα: Τα Docker images διατηρούν τις ίδιες λειτουργικές ιδιότητες ανεξάρτητα από το περιβάλλον υλοποίησης, εξασφαλίζοντας ομοιογένεια. Με το Docker, οι αλλαγές μπορούν να μεταφερθούν και να δημοσιευτούν εύκολα σε άλλα συστήματα μέσο version control systems.
  4. Συντήρηση και Reusability: Τα Docker containers μπορούν να δημιουργηθούν ή να καταργηθούν εύκολα, χωρίς να αφήνουν αχρησιμοποίητα αρχεία πίσω, βελτιστοποιώντας τον αποθηκευτικό χώρο ενώ μπορούν να επαναχρησιμοποιηθούν αρκετές φορές ανάλογα με τις απαιτήσεις.
  5. Απομόνωση και Ασφάλεια: Μέσω της απομόνωσης που παρέχουν τα containers, πολλά από αυτά μπορούν να λειτουργούν παράλληλα στον ίδιο host, χωρίς κίνδυνο αλληλεπιδράσεων.
  6. Testing και ανάκληση: Στο Docker ειναι εύκολο να δοκιμαστεί ο κώδικας σε διαφορετικές εκδόσεις και να γίνει εύκολα ανάκληση εκδόσεων αν υπάρξει κάποιο πρόβλημα.
  7. Κλιμάκωση και Παρακολούθηση: Η δομή του Docker επιτρέπει την ευέλικτη κλιμάκωση εφαρμογών, διατηρώντας ταυτόχρονα την απλότητα στην αρχιτεκτονική και ειναι ιδανικό σε διμιουργία εφαρμογών αρχιτεκτονικής microServices. Επιπλέον, τα containers προσφέρουν ευελιξία στη διαχείριση των πόρων, προσαρμόζοντας αυτόματα τη λειτουργία τους στις ανάγκες του συστήματος.

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

Case Study: Το Docker στην Πράξη

Ένα case study που αναδεικνύει τα πλεονεκτήματα του Docker σε σύγκριση με τις εικονικές μηχανές είναι η ανάπτυξη και εκτέλεση ενός συνόλου υπηρεσιών ταυτόχρονα.

Σε ένα σενάριο με χρήση Docker, οι υπηρεσίες όπως η εφαρμογή, η βάση δεδομένων, και τον εξυπηρετητή ιστού μπορούν να εκτελούνται ως ανεξάρτητα containers πάνω στον ίδιο host. Τα containers μοιράζονται το λειτουργικό σύστημα του host, εξασφαλίζοντας απομόνωση και ελαφριά επιβάρυνση του συστήματος. Επιπλέον, η διαχείριση των containers γίνεται ευκολότερη με τη χρήση του Docker Compose για τον καθορισμό και τον συντονισμό πολλαπλών containers.

Αντίθετα, σε ένα παρόμοιο σενάριο με χρήση εικονικών μηχανών, κάθε υπηρεσία θα απαιτούσε τη δημιουργία και την εκκίνηση μιας ξεχωριστής εικονικής μηχανής με πλήρες λειτουργικό σύστημα και τις εγκαταστάσεις των αντιστοίχων εφαρμογών(πχ http server, mySql db). Αυτό απαιτεί μεγαλύτερη κατανάλωση πόρων, χώρο αποθήκευσης και αργούς χρόνους ρύθμισης και εκκίνησης επίσης πολλές φορές χρειάζεται η βοήθεια από τους διαχειριστές και πιθανόν επιπλέον άδειες χρήσης λειτουργικών.

Εισαγωγή στο Docker

Για να ξεκινήσετε με το Docker, επισκεφθείτε την επίσημη ιστοσελίδα του Docker (https://www.docker.com) και κατεβάστε το αντίστοιχο λογισμικό εγκατάστασης για το σύστημά σας.

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

Δείτε το αναλυτικό tutorial σχετικά με την εγκατάσταση και την ρύθμηση του Docker βήμα – βήμα.

Περιμένετε να κατέβει το αρχείο και ξεκινήστε την εγκατάσταση.

Αφού ολοκληρωθεί η εγκατάσταση θα χρειαστεί να κάνετε επανεκκίνηση του υπολογιστή σας.

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

Πώς Λειτουργεί το Docker

Τα βασικά συστατικά του Docker είναι:

  • Image: Το βασικό στοιχείο για τη δημιουργία ενός container που περιέχει τα αρχεία πριν τρέξουν.
  • Registry: Το αποθετήριο που βρίσκονται τα images για να γίνουν download πριν τρέξουν.
  • Dockerfile: Το βασικό αρχείο (script) με τις εντολές που καθορίζει πώς θα δημιουργηθεί ένα image.
  • Container: Εικονικός “χώρος” μέσα στον οποίο τρέχει το service που δημιουργήθηκε από το Image.
  • Volume: Εικονικός “δίσκος” μέσα στον οποίο αποθηκεύονται τα αρχεία του container.
  • Network: Το δίκτυο που συνδέει τα containers μεταξύ τους
  • Docker compose file: Αρχείο script που παρέχει πληροφορίες για ένα σύνολο images, volumes, Networks με αντίστοιχες οδηγίες και παραμέτρους που θα δημιουργηθεί ένα πλήρες σύστημα εφαρμογών.

Έτσι το Dockerfile όταν το κάνουμε Build χρησιμοποιεί τα Images και δημιουργεί το Container βάση των εντολών που έχει μέσα το Dockerfile.

Ένα παράδειγμα είναι ότι δημιουργώντας ένα Dockerfile όπως το παρακάτω

Dockerfile
FROM php:8.2-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./your-script.php" ]

και “τρέχοντας” το έχουμε έναν ολοκληρωμένο PHP server στον υπολογιστή μας (χωρίς άλλες περιττές εγκαταστάσεις αρχείων).

Αντίστοιχα “τρέχοντας” ένα Docker Compose αρχείο μπορούμε να “ανεβάσουμε” ταυτόχρονα πολλά services (κάθε service ειναι ένα Container) με τα αντίστοιχα Dockerfiles. Σκεφτείτε τα αρχεία αυτά σαν οδηγίες που αναλαμβάνει το Docker να τις διαβάσει και να τις τρέξει.

Ένα παράδειγμα docker-compose.yml που θα βρείτε online στο GitHub είναι το παρακάτω

YAML
version: "3.9"

services:
    server:
        build:
            context: ./server/
            dockerfile: Apache.Dockerfile
        container_name: server
        restart: always
        depends_on:
            - db
        ports:
            - 80:80
        networks:
            - frontend
            - backend
        volumes:
            - type: bind
              source: ./www
              target: /var/www/html
              consistency: consistent # delegated or cached
            - ./server/php.ini:/usr/local/etc/php/conf.d/999-customphp.ini #In one line
    db:
        image: mysql:8.0
        container_name: db
        restart: always
        ports:
            - 3306:3306
        networks:
            - backend
        volumes:
            - ./dump:/docker-entrypoint-initdb.d #Firsth time load default settings to MySql 
            - projectVolume:/var/lib/mysql #Mount volume for db files
        environment:
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        restart: always
        depends_on:
            - db
        ports:
            - 8000:80
        networks:
            - frontend
            - backend
        environment:
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
networks:
    frontend:
        name: FNetwork
    backend:
        name: BNetwork
volumes:
    projectVolume:

όπου “τρέχοντας” το θα “ανεβάσει” 3 διαφορετικές υπηρεσίες, Web Server php, βάση δεδομένων mySql και phpMyAdmin για τη διαχείριση της ΒΔ. Έτσι άμεσα θα τρέχει στον υπολογιστή σας μια ολοκληρωμένη online εφαρμογή συνδεδεμένη με τη ΒΔ μαζί με τα βοηθητικά εργαλεία και ένα σετ παραμετροποιήσεων.

Όταν τρέξαμε το παραπάνω παράδειγμα ο Docker daemon (η υπηρεσία που τρέχει στον υπολογιστή μας) μόλις διάβασε το docker-compose.yml αρχείο κατέβασε όσα images περιγράφονται (αν δεν έχουν κατέβει σε προηγούμενη εκτέλεση) από το αποθετήριο (Registry)2 των images. Μόλις έγιναν οι απαραίτητες λήψεις των images μαζί με τις υπόλοιπες παραμέτρους πού ορίζονταν στο Docker Compose Αρχείο ο Docker Daemon “σήκωσε” τα container με τις υπηρεσίες που ορίζονταν και ενεργοποίησε της συνδέσεις δικτύου (networks) και αρχείων (volumes).

Όλα αυτά θα τα δούμε αναλυτικά σε επόμενα Tutorials, προς το παρόν κρατάμε την ευκολία που μπορούμε να τρέξουμε υπηρεσίες και εφαρμογές ξανά και ξανά χωρίς να επιβαρύνουμε τον υπολογιστή μας.

Docker Hub: Αποθετήριο Images

Όταν προηγηθείτε στο επίσημο repository της Docker το Docker Hub https://hub.docker.com θα βρείτε διαπιστώσετε την πληθώρα των εφαρμογών από όλους τους δημιουργούς εφαρμογών. Εκεί θα βρείτε εφαρμογές βάσεων δεδομένων, εξυπηρετητές, ειδικευμένες εφαρμογές, λειτουργικά συστήματα και ολοκληρωμένα περιβάλλοντα προγραμματισμού.

Πολλά Images διαχειρίζονται και αναβαθμίζονται από τίς ίδιες τις εταιρίες ή τους οργανισμούς που κάνουν την ανάπτυξη τους ενώ διαθέτουν οδηγίες για τις διάφορες εκδόσεις και ρυθμίσεις παραμέτρων όπου χρειάζεται. Επιλέξτε Docker Official Image ή Verified Publisher για βρείτε δημοφιλή images.

Συμβατότητα και αναβάθμιση

Ένα από τα μεγαλύτερα πλεονεκτήματα του Docker ειναι η συμβατότητα μεταξύ διαφορετικών συστημάτων. Φανταστείτε το παραπάνω Docker Compose File να αφορά μια εφαρμογή μιας ομάδας προγραμματιστών. Κάθε φορά που τρέχει σε έναν υπολογιστή θα ανεβαίνουν πάντα οι συγκεκριμένες εκδόσεις των εφαρμογών που περιγράφονται στο αρχείο πχ στην php η έκδοση 8.2 και στην mySql η έκδοση 8.0 εξασφαλίζοντας ίδιο περιβάλουν εργασίας για όλους τους προγραμματιστές ανεξαρτήτως λειτουργικού και άλλων ρυθμίσεων. Σε διαφορετικές συνθήκες αυτό ήταν ο εφιάλτης των διαχειριστών που έπρεπε να εξασφαλίσουν την ίδια ακριβός έκδοση για κάθε εφαρμογή, για κάθε λειτουργικό και για κάθε υπολογιστή της ομάδας.

Επίσης μια αναβάθμιση μπορεί να γίνει απλά αλλάζοντας το Docker file ή το Docker Compose πχ αν ειναι διαθέσιμη η έκδοση της mySql σε 8.1 το image: mysql:8.0 θα γίνει image: mysql:8.1 και αυτό ήταν όλοι οι προγραμματιστές θα έχουν την νέα έκδοση χωρίς οι administrators να κάνουν το παραμικρό.

Το καλύτερο, τα Dockerfiles είναι απλά αρχεία κειμένου και μπορούν να διαχειρίζονται από version control system όπως το git και να διαμοιράζετε στους χρήστες και τις ομάδες όπως ο ίδιος ο κώδικας πχ GitHub κάνοντας την όλη τη διαδικασία εξαιρετικά απλή. Μια από τις μεγαλύτερες επιτυχίες πια του Docker είναι ότι πολλή δύσκολα θα βρούμε αποθετήριο κώδικα που να μην έχει μέσα τα αντίστοιχα Docker αρχεία για να τρέξουμε τον κώδικα.

Ξεκινώντας το Ταξίδι στον Κόσμο του Docker

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

  1. https://survey.stackoverflow.co/2023/#other-tools Το 2023 Docker είναι το πιο χρησιμοποιημένο εργαλείο μεταξύ όλων των ερωτηθέντων (51,55%), ανεβαίνοντας από τη δεύτερη θέση το 2022.
    ↩︎
  2. Το Docker Hub (https://hub.docker.com) είναι το επίσημο αποθετήριο του Docker, που λειτουργεί ως κεντρική βιβλιοθήκη για την ανάκτηση και την κοινοποίηση των Docker Images. Υπάρχει η δυνατότητα να έχουμε δικό μας τοπικό αποθετήριο σε δικό μας private δίκτυο. ↩︎

Similar Posts

Leave a Reply