Πώς να Εγκαταστήσετε και να Χρησιμοποιήσετε το Docker Compose σε Ubuntu


Εισαγωγή

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

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

Αυτός ο οδηγός θα σας καθοδηγήσει στην εγκατάσταση του Docker Compose σε έναν διακομιστή Ubuntu και στη λειτουργία ενός απλού container. Από εκεί, θα μάθετε να δημιουργείτε ένα περιβάλλον πολλαπλών υπηρεσιών χρησιμοποιώντας μια εφαρμογή WordPress και μια βάση δεδομένων MySQL. Επιπλέον, θα καλύψουμε πιο προχωρημένα θέματα, όπως την κλιμάκωση των υπηρεσιών, τον ορισμό προσαρμοσμένων δικτύων και τη χρήση εντολών modular include. Τέλος, αυτό το άρθρο παρέχει έναν οδηγό μετανάστευσης από το παλαιότερο docker-compose (v1) στη σύγχρονη μορφή docker compose (v2) και μια λεπτομερή ενότητα σχετικά με την αντιμετώπιση κοινών προβλημάτων, όπως συγκρούσεις θυρών και σφάλματα αδειών.

Κύρια Συμπεράσματα:

  • Το Docker Compose είναι ένα εργαλείο για τον ορισμό και τη λειτουργία εφαρμογών πολλαπλών κοντέινερ χρησιμοποιώντας ένα ενιαίο αρχείο YAML για τη ρύθμιση υπηρεσιών, δικτύων και τόμων.
  • Το Docker Compose εγκαθίσταται στο Ubuntu προσθέτοντας την επίσημη αποθήκη του Docker και χρησιμοποιώντας το apt για να εγκαταστήσετε το πακέτο docker-compose-plugin.
  • Η σύγχρονη εντολή είναι docker compose (με κενό). Αυτή αντικαθιστά το παρωχημένο εργαλείο docker-compose (με παύλα) v1.
  • Χρησιμοποιήστε docker compose up -d για να ξεκινήσετε μια εφαρμογή σε αποσυνδεδεμένη λειτουργία και docker compose down για να σταματήσετε και να αφαιρέσετε όλα τα κοντέινερ και τα δίκτυά της.
  • Η οδηγία depends_on βοηθά στον έλεγχο της σειράς εκκίνησης των υπηρεσιών, όπως το να διασφαλιστεί ότι ένα κοντέινερ βάσης δεδομένων ξεκινά πριν από ένα κοντέινερ εφαρμογής ιστού.
  • Τα πιο συχνά προβλήματα είναι το «Άδεια Εγκατάστασης Απορρίφθηκε» (λύνεται προσθέτοντας τον χρήστη σας στην ομάδα docker), συγκρούσεις θυρών (λύνεται αλλάζοντας τη θύρα του υπολογιστή στο αρχείο YAML) και σφάλματα σύνταξης YAML (λύνεται διορθώνοντας την εσοχή).
  • Μπορείτε να εκτελέσετε πολλαπλές περιπτώσεις μιας υπηρεσίας χρησιμοποιώντας την εντολή docker compose up --scale <service_name>=<number>.
  • Η οδηγία include σας επιτρέπει να διαχωρίσετε ένα μεγάλο αρχείο docker-compose.yml σε μικρότερα, πιο διαχειρίσιμα αρχεία διαμόρφωσης.

Προαπαιτούμενα

Για να ακολουθήσετε αυτό το άρθρο, θα χρειαστείτε:

  • Πρόσβαση σε έναν τοπικό υπολογιστή Ubuntu ή σε διακομιστή ανάπτυξης ως χρήστης χωρίς δικαιώματα root με δικαιώματα sudo. Αν χρησιμοποιείτε απομακρυσμένο διακομιστή, συνιστάται να υπάρχει ενεργό firewall. Για να τα ρυθμίσετε, παρακαλούμε ανατρέξτε στον Οδηγό Αρχικής Ρύθμισης Διακομιστή για Ubuntu.
  • Το Docker εγκατεστημένο στον διακομιστή σας ή στον τοπικό σας υπολογιστή, ακολουθώντας τα Βήματα 1 και 2 του Οδηγού Βήμα προς Βήμα για την Εγκατάσταση Docker σε Ubuntu.

Σημείωση: Ξεκινώντας από το Docker Compose v2, η Docker έχει στραφεί στη χρήση της εντολής compose μέσω του CLI plugin, απομακρυνόμενη από το αρχικό docker-compose, όπως τεκμηριώνεται στον Οδηγό μας Πώς να Εγκαταστήσετε το Docker Compose σε Ubuntu (Βήμα-Προς-Βήμα). Αν και η εγκατάσταση διαφέρει, γενικά η πραγματική χρήση περιλαμβάνει την αφαίρεση του παύλα από τις κλήσεις docker-compose για να γίνουν docker compose. Για πλήρη λεπτομέρεια σχετικά με τη συμβατότητα, ελέγξτε την επίσημη τεκμηρίωση της Docker σχετικά με τη συμβατότητα εντολών μεταξύ του νέου compose και του παλιού docker-compose.

Βήμα 1 — Εγκατάσταση του Docker Compose

Υπάρχουν δύο τρόποι για να εγκαταστήσετε το Docker Compose στο Ubuntu:

  • Εγκατάσταση χρησιμοποιώντας το αποθετήριο
  • Εγκατάσταση χειροκίνητα

Θα συζητήσουμε και τους δύο τρόπους σε αυτήν την ενότητα.

Εγκατάσταση του Docker Compose χρησιμοποιώντας το αποθετήριο apt

Πρώτα, ας ρυθμίσουμε το Docker apt αποθετήριο.

# Add Docker's official GPG key:

sudo apt-get update

sudo apt-get install ca-certificates curl

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc



# Add the repository to Apt sources:

echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \

  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \

  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

Τώρα, μπορείτε να εγκαταστήσετε το Docker Compose χρησιμοποιώντας την ακόλουθη εντολή:

sudo apt install docker-compose-plugin

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

docker compose version

Θα δείτε μια έξοδο παρόμοια με αυτή:

Docker Compose version v2.3.3

Εγκατάσταση του Docker Compose χειροκίνητα

Για να βεβαιωθείτε ότι θα αποκτήσετε την πιο πρόσφατη σταθερή έκδοση του Docker Compose, θα κατεβάσετε αυτό το λογισμικό από το επίσημο αποθετήριο του στο Github.

Πρώτα, επιβεβαιώστε την πιο πρόσφατη διαθέσιμη έκδοση στη σελίδα κυκλοφοριών τους. Τη στιγμή που γράφεται αυτό, η πιο πρόσφατη σταθερή έκδοση είναι v2.40.2.

Χρησιμοποιήστε την παρακάτω εντολή για λήψη:

mkdir -p ~/.docker/cli-plugins/

curl -SL https://github.com/docker/compose/releases/download/v2.40.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose

Στη συνέχεια, ορίστε τα σωστά δικαιώματα ώστε η εντολή docker compose να μπορεί να εκτελεστεί:

chmod +x ~/.docker/cli-plugins/docker-compose

Στην επόμενη ενότητα, θα δείτε πώς να ρυθμίσετε ένα αρχείο docker-compose.yml και να θέσετε σε λειτουργία ένα περιβάλλον με κοντέινερ χρησιμοποιώντας αυτό το εργαλείο.

Βήμα 2 — Δημιουργία ενός αρχείου docker-compose.yml

Για να δείξουμε πώς να ρυθμίσετε ένα αρχείο docker-compose.yml και να εργαστείτε με το Docker Compose, θα δημιουργήσετε ένα περιβάλλον διακομιστή ιστού χρησιμοποιώντας την επίσημη εικόνα Nginx από το Docker Hub, το δημόσιο μητρώο Docker. Αυτό το περιβάλλον με κοντέινερ θα σερβίρει ένα μόνο στατικό αρχείο HTML.

Ξεκινήστε δημιουργώντας έναν νέο φάκελο στον φάκελο του χρήστη σας και μετά μεταβείτε σε αυτόν:

mkdir ~/compose-demo

cd ~/compose-demo

Σε αυτόν τον κατάλογο, δημιουργήστε έναν φάκελο εφαρμογής που θα χρησιμεύει ως ριζικός φάκελος εγγράφων για το περιβάλλον Nginx σας:

mkdir app

Χρησιμοποιώντας τον αγαπημένο σας επεξεργαστή κειμένου, δημιουργήστε ένα νέο αρχείο index.html μέσα στον φάκελο app:

nano app/index.html

Τοποθετήστε το ακόλουθο περιεχόμενο σε αυτό το αρχείο:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Docker Compose Demo</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css">
</head>
<body>

    <h1>This is a Docker Compose Demo Page.</h1>
    <p>This content is being served by an Nginx container.</p>

</body>
</html>

Αποθηκεύστε και κλείστε το αρχείο όταν τελειώσετε. Αν χρησιμοποιείτε το nano, μπορείτε να το κάνετε πληκτρολογώντας CTRL+X, στη συνέχεια Y και ENTER για επιβεβαίωση.

Στη συνέχεια, δημιουργήστε το αρχείο docker-compose.yml:

nano docker-compose.yml

Εισάγετε το ακόλουθο περιεχόμενο στο αρχείο σας docker-compose.yml:

services:
  web:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./app:/usr/share/nginx/html

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

Στη συνέχεια, έχετε το μπλοκ services, όπου ρυθμίζετε τις υπηρεσίες που αποτελούν μέρος αυτού του περιβάλλοντος. Στην περίπτωσή σας, έχετε μια ενιαία υπηρεσία που ονομάζεται web. Αυτή η υπηρεσία χρησιμοποιεί την εικόνα nginx:alpine και ρυθμίζει μια ανακατεύθυνση θύρας με την οδηγία ports. Όλα τα αιτήματα στη θύρα 8000 του μηχανήματος κεντρικού υπολογιστή (το σύστημα από όπου εκτελείτε το Docker Compose) θα ανακατευθυνθούν στο κοντέινερ web στη θύρα 80, όπου θα εκτελείται το Nginx.

Η οδηγία volumes θα δημιουργήσει έναν κοινό τόμο μεταξύ του υπολογιστή φιλοξενίας και του κοντέινερ. Αυτό θα μοιραστεί τον τοπικό φάκελο app με το κοντέινερ, και ο τόμος θα βρίσκεται στο /usr/share/nginx/html μέσα στο κοντέινερ, αντικαθιστώντας έτσι τη προεπιλεγμένη ρίζα εγγράφων για το Nginx.

Αποθήκευσε και κλείσε το αρχείο.

Έχετε δημιουργήσει μια δοκιμαστική σελίδα και ένα αρχείο docker-compose.yml για να δημιουργήσετε ένα περιβάλλον διακομιστή ιστού σε κοντέινερ που θα το φιλοξενεί. Στο επόμενο βήμα, θα ενεργοποιήσετε αυτό το περιβάλλον με το Docker Compose.

Βήμα 3 — Εκτέλεση του Docker Compose

Με το αρχείο docker-compose.yml στη θέση του, μπορείτε τώρα να εκτελέσετε το Docker Compose για να ενεργοποιήσετε το περιβάλλον σας. Η ακόλουθη εντολή θα κατεβάσει τις απαραίτητες εικόνες Docker, θα δημιουργήσει ένα κοντέινερ για την υπηρεσία web και θα εκτελέσει το περιβάλλον σε κοντέινερ σε λειτουργία παρασκηνίου:

docker compose up -d

Το Docker Compose θα ψάξει πρώτα για την καθορισμένη εικόνα στο τοπικό σας σύστημα και αν δεν μπορέσει να βρει την εικόνα, θα την κατεβάσει από το Docker Hub. Θα δείτε έξοδο σαν αυτή:

Creating network "compose-demo_default" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
c829a9c40ab2: Pull complete
61d685417b2f: Pull complete
Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502
Status: Downloaded newer image for nginx:alpine
Creating compose-demo_web_1 ... done

Σημείωση: Αν αντιμετωπίσετε σφάλμα «απαγορεύεται η άδεια» όταν εκτελείτε docker compose up, αυτό συνήθως σημαίνει ότι ο χρήστης σας χωρίς δικαιώματα διαχειριστή δεν έχει άδεια πρόσβασης στο socket του Docker daemon.

Από προεπιλογή, ο δαίμονας Docker συνδέεται με ένα Unix socket (/var/run/docker.sock) το οποίο ανήκει στον χρήστη root. Για να το διορθώσετε, πρέπει να προσθέσετε τον χρήστη σας που δεν είναι root στην ομάδα docker, η οποία δημιουργείται κατά την εγκατάσταση του Docker.

Εκτελέστε την ακόλουθη εντολή για να προσθέσετε τον χρήστη σας στην ομάδα docker:

sudo usermod -aG docker ${USER}

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

newgrp docker

Αυτή η εντολή θα πρέπει να επιλύσει τυχόν σφάλματα αδειών που σχετίζονται με το socket του Docker. Για πλήρη οδηγό, παρακαλώ ανατρέξτε στο Βήμα 2 του Πώς να Εγκαταστήσετε το Docker σε Ubuntu – Οδηγός Βήμα-βήμα.

Το περιβάλλον σας λειτουργεί πλέον στο παρασκήνιο. Για να επαληθεύσετε ότι το περιέκτης είναι ενεργό, μπορείτε να εκτελέσετε:

docker compose ps

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

       Name                     Command               State          Ports        
----------------------------------------------------------------------------------
compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8000->80/tcp

Μπορείτε τώρα να αποκτήσετε πρόσβαση στην εφαρμογή επίδειξης δείχνοντας τον περιηγητή σας είτε στο localhost:8000 αν τρέχετε αυτή την επίδειξη στον τοπικό σας υπολογιστή, είτε στο το_όνομα_ή_IP_του_διακομιστή_σας:8000 αν τρέχετε αυτή την επίδειξη σε έναν απομακρυσμένο διακομιστή.

Θα δείτε μια σελίδα σαν αυτή:

Ο κοινόχρηστος τόμος που έχετε ρυθμίσει στο αρχείο docker-compose.yml διατηρεί τα αρχεία του φακέλου app συγχρονισμένα με τη ρίζα εγγράφων του container. Αν κάνετε οποιεσδήποτε αλλαγές στο αρχείο index.html, θα εντοπιστούν αυτόματα από το container και θα εμφανιστούν στο πρόγραμμα περιήγησής σας όταν ανανεώσετε τη σελίδα.

Στο επόμενο βήμα, θα δείτε πώς να διαχειρίζεστε το περιβάλλον σας με κοντέινερ χρησιμοποιώντας εντολές Docker Compose.

Βήμα 4 — Εξοικείωση με τις εντολές Docker Compose

Έχετε δει πώς να ρυθμίσετε ένα αρχείο docker-compose.yml και να φέρετε το περιβάλλον σας σε λειτουργία με το docker compose up. Τώρα θα δείτε πώς να χρησιμοποιείτε τις εντολές του Docker Compose για να διαχειρίζεστε και να αλληλοεπιδράτε με το περιβάλλον σας μέσα σε κοντέινερ.

Για να ελέγξετε τα αρχεία καταγραφής που δημιουργούνται από το container Nginx σας, μπορείτε να χρησιμοποιήσετε την εντολή logs:

docker compose logs

Θα δείτε μια έξοδο παρόμοια με αυτή:

Attaching to compose-demo_web_1
web_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web_1  | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web_1  | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
web_1  | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"

Αν θέλετε να σταματήσετε προσωρινά την εκτέλεση του περιβάλλοντος χωρίς να αλλάξετε την τρέχουσα κατάσταση των κοντέινερ σας, μπορείτε να χρησιμοποιήσετε:

docker compose pause
Pausing compose-demo_web_1 ... done

Για να συνεχιστεί η εκτέλεση μετά από μια παύση:

docker compose unpause
Unpausing compose-demo_web_1 ... done

Η εντολή stop θα τερματίσει την εκτέλεση του κοντέινερ, αλλά δεν θα καταστρέψει κανένα δεδομένο που σχετίζεται με τα κοντέινερ σας:

docker compose stop
Stopping compose-demo_web_1 ... done

Αν θέλετε να αφαιρέσετε τα containers, τα δίκτυα και τους τόμους που σχετίζονται με αυτό το περιβάλλον κοντέινερ, χρησιμοποιήστε την εντολή down:

docker compose down
Removing compose-demo_web_1 ... done
Removing network compose-demo_default

Σημειώστε ότι αυτό δεν θα αφαιρέσει την βασική εικόνα που χρησιμοποιείται από το Docker Compose για να δημιουργήσει το περιβάλλον σας (στην περίπτωσή σας, nginx:alpine). Με αυτόν τον τρόπο, όποτε επανεκκινείτε το περιβάλλον σας με docker compose up, η διαδικασία θα είναι πολύ πιο γρήγορη αφού η εικόνα υπάρχει ήδη στο σύστημά σας.

Σε περίπτωση που θέλετε να αφαιρέσετε επίσης την βασική εικόνα από το σύστημά σας, μπορείτε να χρησιμοποιήσετε:

docker image rm nginx:alpine
Untagged: nginx:alpine
Untagged: nginx@sha256:b89a6ccbda39576ad23fd079978c967cecc6b170db6e7ff8a769bf2259a71912
Deleted: sha256:7d0cdcc60a96a5124763fddf5d534d058ad7d0d8d4c3b8be2aefedf4267d0270
Deleted: sha256:05a0eaca15d731e0029a7604ef54f0dda3b736d4e987e6ac87b91ac7aac03ab1
Deleted: sha256:c6bbc4bdac396583641cb44cd35126b2c195be8fe1ac5e6c577c14752bbe9157
Deleted: sha256:35789b1e1a362b0da8392ca7d5759ef08b9a6b7141cc1521570f984dc7905eb6
Deleted: sha256:a3efaa65ec344c882fe5d543a392a54c4ceacd1efd91662d06964211b1be4c08
Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a

Σημείωση: Παρακαλούμε ανατρέξτε στον οδηγό μας Πώς να Εγκαταστήσετε το Docker σε Ubuntu – Οδηγός Βήμα προς Βήμα για μια πιο λεπτομερή αναφορά στις εντολές του Docker.

Βήμα 5 — Δημιουργία μιας Εφαρμογής Πολλαπλών Υπηρεσιών

Η πραγματική δύναμη του Docker Compose έγκειται στη διαχείριση πολλαπλών υπηρεσιών που συνεργάζονται. Το παράδειγμα με το Nginx ήταν μια μόνο υπηρεσία. Ας δημιουργήσουμε μια πιο πρακτική εφαρμογή με πολλές υπηρεσίες: μια ιστοσελίδα WordPress συνδεδεμένη με μια βάση δεδομένων MySQL.

Αυτή η ρύθμιση περιλαμβάνει δύο υπηρεσίες: wordpress (που εκτελεί την εφαρμογή) και db (που εκτελεί τη βάση δεδομένων). Θα χρησιμοποιήσουμε επίσης volumes του Docker για να διασφαλίσουμε ότι τα δεδομένα της βάσης δεδομένων παραμένουν ακόμα και αν αφαιρεθεί το container.

Ας δημιουργήσουμε έναν νέο φάκελο για αυτήν την εφαρμογή:

mkdir -p ~/compose-demo/wordpressapp

cd ~/compose-demo/wordpressapp

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

Δημιουργήστε ένα νέο αρχείο docker-compose.yml:

nano docker-compose.yml

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

services:
  db:
    image: mysql:8.0
    container_name: mysql_db
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: <^your_root_password_here<^>
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: <^your_wordpress_password_here<^>
    restart: unless-stopped

  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    ports:
      - "8001:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: <^your_wordpress_password_here<^>
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wp_content:/var/www/html/wp-content
    depends_on:
      - db
    restart: unless-stopped

volumes:
  db_data:

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

Αποθήκευσε και κλείσε το αρχείο. Θυμήσου να αντικαταστήσεις τα <^...^> στοιχεία κράτησης με ισχυρούς, ασφαλείς κωδικούς.

Ας αναλύσουμε τις νέες οδηγίες σε αυτό το αρχείο:

  • υπηρεσίες: Αυτό το μπλοκ εξακολουθεί να ορίζει τα κοντέινερ μας. Τώρα έχουμε δύο: db και wordpress.
  • image: Χρησιμοποιούμε mysql:8.0 για τη βάση δεδομένων και την εικόνα wordpress:latest για την εφαρμογή.
  • container_name: Αυτό ορίζει ένα συγκεκριμένο, εύκολα αναγνώσιμο όνομα για το κοντέινερ, το οποίο είναι πιο εύκολο να αναφερθεί από τα αυτόματα δημιουργημένα.
  • περιβάλλον: Αυτή είναι μια λίστα με μεταβλητές περιβάλλοντος που περνιούνται στο container. Η εικόνα mysql τις χρησιμοποιεί για να ορίσει τον κωδικό πρόσβασης root και να δημιουργήσει μια αρχική βάση δεδομένων και χρήστη. Η εικόνα wordpress τις χρησιμοποιεί για να γνωρίζει πώς να συνδεθεί στη βάση δεδομένων της.
  • Volumes (σε επίπεδο υπηρεσίας):

    • Για την υπηρεσία db, το db_data:/var/lib/mysql αντιστοιχίζει έναν όγκο διαχειριζόμενο από το Docker με όνομα db_data στον φάκελο δεδομένων της MySQL μέσα στο κοντέινερ. Αυτό διατηρεί τα δεδομένα σας ασφαλή.
    • Για την υπηρεσία wordpress, το ./wp_content:/var/www/html/wp-content αντιστοιχεί έναν τοπικό φάκελο (wp_content) στον φάκελο περιεχομένου του WordPress. Αυτό σας επιτρέπει να επεξεργάζεστε απευθείας θέματα και πρόσθετα από τη μηχανή σας.
  • depends_on: Αυτό λέει στο Compose να ξεκινήσει την υπηρεσία db πριν ξεκινήσει την υπηρεσία wordpress. Αυτό είναι σημαντικό, καθώς το WordPress θα αποτύχει αν δεν βρει τη βάση δεδομένων του κατά την εκκίνηση.
  • volumes (επάνω επίπεδο): Αυτό το μπλοκ ορίζει τους ονομασμένους τόμους. db_data: δημιουργεί έναν τόμο που διαχειρίζεται το Docker, ο οποίος είναι ο προτεινόμενος τρόπος για τη διαχείριση επίμονων δεδομένων.

Τώρα, εκκινήστε αυτήν την εφαρμογή πολλαπλών υπηρεσιών:

docker compose up -d

Το Compose θα τραβήξει τόσο τις εικόνες mysql όσο και wordpress και στη συνέχεια θα δημιουργήσει τα κοντέινερ, ξεκινώντας πρώτα την υπηρεσία db.

Creating network "compose-demo_default" with the default driver
Creating volume "compose-demo_db_data" with default driver
Pulling db (mysql:8.0)...
...
Pulling wordpress (wordpress:latest)...
...
Creating mysql_db        ... done
Creating wordpress_app ... done

Μπορείτε τώρα να αποκτήσετε πρόσβαση στον νέο σας ιστότοπο WordPress πηγαίνοντας στο localhost:8001 ή στο <^your_server_domain_or_IP<^>:8001 στον περιηγητή σας. Θα πρέπει να δείτε την οθόνη εγκατάστασης του WordPress. Για ένα πιο λεπτομερές παράδειγμα, δείτε το άρθρο μας σχετικά με το Πώς να Εγκαταστήσετε το WordPress με το Docker Compose.

Βήμα 6 — Χρήση του Docker Compose για ανάπτυξη AI/ML

Πέρα από τις διαδικτυακές εφαρμογές, το Docker Compose είναι ένα εξαιρετικά χρήσιμο εργαλείο για τη δημιουργία αναπαραγώγιμων περιβαλλόντων δεδομένων και μηχανικής μάθησης (AI/ML). Τα έργα AI/ML είναι γνωστά για τις πολύπλοκες εξαρτήσεις τους, όπως συγκεκριμένες εκδόσεις Python, βιβλιοθήκες όπως το TensorFlow ή το PyTorch και οδηγοί σε επίπεδο συστήματος όπως το NVIDIA CUDA Toolkit. Το Docker Compose καταγράφει ολόκληρο αυτό το περιβάλλον σε αρχεία ρυθμίσεων, επιλύοντας το πρόβλημα «λειτουργεί στον υπολογιστή μου», κάτι που είναι κρίσιμο για αναπαραγώγιμη έρευνα.

Σε αυτό το παράδειγμα, θα δημιουργήσετε ένα περιβάλλον AI/ML πολλαπλών υπηρεσιών που αποτελείται από:

  • JupyterLab: Ένα περιβάλλον για διαδραστική ανάπτυξη, κατασκευασμένο από ένα προσαρμοσμένο Dockerfile.
  • PostgreSQL: Ένα κοντέινερ βάσης δεδομένων για την αποθήκευση αποτελεσμάτων πειραμάτων και δεδομένων μεταδεδομένων.
  • Πρόσβαση GPU: Το container του JupyterLab θα ρυθμιστεί ώστε να έχει πρόσβαση στην NVIDIA GPU της κεντρικής μηχανής, κάτι που αποτελεί συνήθη προϋπόθεση για την εκπαίδευση μοντέλων.

Προαπαιτούμενο: Αυτό το παράδειγμα απαιτεί μια GPU της NVIDIA στον υπολογιστή σας και να είναι εγκατεστημένο το NVIDIA Container Toolkit. Χωρίς αυτά, το κοντέινερ δεν θα μπορεί να ξεκινήσει όταν ζητούνται πόροι GPU.

Δομή Αρχείων

Πρώτα, δημιουργήστε έναν κατάλογο για το έργο σας. Μέσα σε αυτόν, θα δημιουργήσετε ένα αρχείο docker-compose.yml, έναν κατάλογο jupyter, ένα Dockerfile για το Jupyter και ένα αρχείο requirements.txt. Η δομή θα πρέπει να μοιάζει κάπως έτσι:

ai-project/
├── docker-compose.yml
└── jupyter/
    ├── Dockerfile
    └── requirements.txt

Δημιουργία των αρχείων του στοιχείου

1. Το αρχείο requirements.txt

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

nano jupyter/requirements.txt

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

pandas
scikit-learn
tensorflow
jupyterlab
psycopg2-binary

Αποθήκευσε και κλείσε το αρχείο.

2. Το Dockerfile

Αυτό το αρχείο ορίζει την προσαρμοσμένη υπηρεσία JupyterLab σας. Χρησιμοποιεί μια επίσημη εικόνα Jupyter ως βάση και εγκαθιστά τα πακέτα από το requirements.txt.

nano jupyter/Dockerfile

Επικολλήστε το ακόλουθο περιεχόμενο:

# Start from a base image that includes Jupyter and scientific libraries
FROM jupyter/scipy-notebook:latest

# Copy our local requirements file into the container
COPY requirements.txt /tmp/requirements.txt

# Install the Python packages
RUN pip install --no-cache-dir -r /tmp/requirements.txt

Αυτό το αρχείο καθοδηγεί το Docker να χρησιμοποιήσει το jupyter/scipy-notebook ως σημείο εκκίνησης, να αντιγράψει το requirements.txt σας στον container και στη συνέχεια να χρησιμοποιήσει το pip για να εγκαταστήσει τα πακέτα.

Ορισμός του περιβάλλοντος με docker-compose.yml

Τώρα, δημιουργήστε το κύριο αρχείο docker-compose.yml. Αυτό το αρχείο θα συντονίζει τόσο την υπηρεσία db όσο και την προσαρμοσμένη υπηρεσία jupyter σας.

nano docker-compose.yml

Επικολλήστε την παρακάτω διαμόρφωση, αντικαθιστώντας τα <^...^> στοιχεία κράτησης θέσης με τα δικά σας ασφαλή στοιχεία σύνδεσης.

services:
  db:
    image: postgres:15-alpine
    container_name: ai_postgres_db
    environment:
      POSTGRES_USER: <^your_db_user^>
      POSTGRES_PASSWORD: <^your_db_pass^>
      POSTGRES_DB: experiments
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U <^your_db_user^> -d experiments"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - ai_net

  jupyter:
    build: ./jupyter
    container_name: ai_jupyter_lab
    ports:
      - "8888:8888"
    volumes:
      - ./notebooks:/home/jovyan/work
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_USER=<^your_db_user^>
      - POSTGRES_PASSWORD=<^your_db_pass^>
      - POSTGRES_DB=experiments
    restart: unless-stopped
    networks:
      - ai_net
    depends_on:
      db:
        condition: service_healthy
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

volumes:
  postgres_data:
    name: ai_project_data

networks:
  ai_net:
    driver: bridge

Αυτό το αρχείο διαμόρφωσης εισάγει αρκετές σημαντικές έννοιες:

  • build: ./jupyter: Αυτό λέει στο Docker Compose να δημιουργήσει μια προσαρμοσμένη εικόνα για την υπηρεσία jupyter. Ψάχνει για ένα Dockerfile μέσα στον καθορισμένο κατάλογο ./jupyter.
  • volumes: - ./notebooks:/home/jovyan/work: Αυτό συνδέει έναν τοπικό φάκελο με όνομα notebooks μέσα στο container. Αυτό διασφαλίζει ότι όλα τα Jupyter notebooks που δημιουργείτε αποθηκεύονται άμεσα στον υπολογιστή σας, παραμένοντας διαθέσιμα ακόμα και μετά την αφαίρεση του container.
  • healthcheck: Όπως φαίνεται στην ενότητα αντιμετώπισης προβλημάτων, αυτός ο έλεγχος επαληθεύει ότι η υπηρεσία db δεν είναι απλώς σε λειτουργία, αλλά έτοιμη να δεχθεί συνδέσεις πριν ξεκινήσουν οι άλλες υπηρεσίες.
  • depends_on: ... condition: service_healthy: Αυτό λέει στην υπηρεσία jupyter να περιμένει μέχρι να περάσει ο έλεγχος υγείας της db πριν ξεκινήσει.
  • deploy.resources.reservations.devices: Αυτό είναι το μπλοκ που ζητά πρόσβαση σε GPU.

    • driver: nvidia: Καθορίζει τον οδηγό του υπολογιστή για χρήση.
    • count: 1: Ζητάει μία GPU.
    • capabilities: [gpu]: Διασφαλίζει ότι το κοντέινερ έχει τις απαραίτητες δυνατότητες για να χρησιμοποιήσει τη GPU.

Λειτουργία του περιβάλλοντος ΤΝ/ΜΜ

Με τα αρχεία σας στη θέση τους, είστε έτοιμοι να δημιουργήσετε και να εκτελέσετε τις υπηρεσίες.

  1. Από τον φάκελο ai-project, εκτελέστε την εντολή docker compose up. Πρέπει να προσθέσετε τη σημαία --build την πρώτη φορά για να πείτε στο Compose να δημιουργήσει την προσαρμοσμένη εικόνα jupyter.

    docker compose up -d --build
  2. Το Compose θα δημιουργήσει πρώτα την εικόνα jupyter (που μπορεί να χρειαστεί λίγα λεπτά καθώς κατεβάζει το TensorFlow), στη συνέχεια θα κατεβάσει την εικόνα postgres και τέλος θα ξεκινήσει και τα δύο κοντέινερ.

    [+] Building 5.8s (9/9) FINISHED
     => [internal] load build definition from Dockerfile
    ...
    [+] Running 3/3
     ✔ Network ai-project_ai_net        Created
     ✔ Container ai_postgres_db         Started
     ✔ Container ai_jupyter_lab         Started
  3. Μπορείτε πλέον να έχετε πρόσβαση στο περιβάλλον JupyterLab πηγαίνοντας στο http://localhost:8888 (ή <^η_διεύθυνση_IP_του_διακομιστή_σας^>:8888) στον περιηγητή σας. Θα σας ζητηθεί να εισάγετε ένα token, το οποίο μπορείτε να βρείτε στα αρχεία καταγραφής του container:

    docker compose logs jupyter

    Αναζητήστε μια γραμμή παρόμοια με http://127.0.0.1:8888/lab?token=a1b2c3d4e5f6...

  4. Μέσα σε ένα περιβάλλον Jupyter notebook, τώρα μπορείτε να συνδεθείτε στη βάση δεδομένων σας χρησιμοποιώντας το hostname db και τα στοιχεία σύνδεσης που παρέχετε. Το περιβάλλον σας έχει επίσης πρόσβαση στην GPU του υπολογιστή για την εκπαίδευση μοντέλων.

Κλιμάκωση υπηρεσιών και χρήση προσαρμοσμένων δικτύων

Το Docker Compose περιλαμβάνει δυνατότητες για την κλιμάκωση των υπηρεσιών και τη διαχείριση των δικτύων στα οποία επικοινωνούν.

Κλιμάκωση Υπηρεσίας με Αντίγραφα

Φανταστείτε ότι ο διακομιστής web Nginx από το Βήμα 2 δέχεται πάρα πολύ κίνηση. Μπορείτε να κλιμακώσετε την υπηρεσία web ώστε να εκτελεί πολλαπλές περιπτώσεις κοντέινερ. Το Docker Compose μπορεί να το διαχειριστεί αυτό αυτόματα.

Υπάρχουν δύο βασικοί τρόποι για την κλιμάκωση μιας υπηρεσίας.

1. Χρήση του πλήκτρου replicas (Προτιμάται στην έκδοση v2)

Μπορείτε να καθορίσετε τον επιθυμητό αριθμό περιπτώσεων απευθείας στο αρχείο σας docker-compose.yml χρησιμοποιώντας τα κλειδιά deploy και replicas. Αυτή η λειτουργία αρχικά αποτελούσε μέρος του Docker Swarm, αλλά πλέον είναι διαθέσιμη και για κανονικές αναπτύξεις Compose.

Τροποποιήστε το docker-compose.yml του Nginx σας από το Βήμα 2:

services:
  web:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./app:/usr/share/nginx/html
    deploy:
      replicas: 3

Όταν εκτελείτε docker compose up -d, το Compose θα δημιουργήσει τρία containers web. Ωστόσο, θα αντιμετωπίσετε ένα πρόβλημα: και τα τρία θα προσπαθήσουν να δεσμεύσουν την θύρα 8000 του host. Αυτό θα προκαλέσει σφάλμα «η θύρα έχει ήδη δεσμευτεί» για τα δεύτερο και τρίτο container. Για να το επιλύσετε σε ένα περιβάλλον παραγωγής, θα αφαιρέσετε τον χάρτη ports από την υπηρεσία web. Με αυτόν τον τρόπο, τα containers web είναι προσβάσιμα μόνο εντός του δικτύου Docker. Μια ξεχωριστή υπηρεσία load balancer θα ήταν η μόνη με δημόσια θύρα. Στη συνέχεια, θα διανέμει την κίνηση στις τρεις αντίγραφα web.

Ένα παράδειγμα διαμόρφωσης θα φαίνεται έτσι (αυτό είναι ένα προηγμένο παράδειγμα):

services:
  web:
    image: nginx:alpine
    # No 'ports' mapping here.
    # The service is only accessible inside the 'web-net' network.
    volumes:
      - ./app:/usr/share/nginx/html
    deploy:
      replicas: 3
    networks:
      - web-net

  load_balancer:
    image: nginx:latest
    ports:
      - "80:80" # The load_balancer is the only service with a public port.
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf # A config file that load balances to 'web'.
    networks:
      - web-net
    depends_on:
      - web

networks:
  web-net:

Σε αυτήν τη ρύθμιση, ο load_balancer ακούει στη θύρα 80 και δρομολογεί αιτήματα στους web_1, web_2 και web_3 εσωτερικά.

Αυτό το κλειδί replicas είναι πιο χρήσιμο όταν χρησιμοποιείται με έναν αντίστροφο μεσολαβητή (reverse proxy) (όπως το Traefik ή μια άλλη περίπτωση Nginx) που μπορεί να κατανείμει τα αιτήματα μεταξύ των αντιγράφων εντός του δικτύου Docker, χωρίς να χρειάζεται κάθε αντίγραφο να εκθέτει μια θύρα στον κεντρικό υπολογιστή.

2. Χρησιμοποιώντας τη σημαία --scale

Μια συνηθισμένη μέθοδος για την κλιμάκωση είναι η παράμετρος --scale, μια συνέχεια από το Compose v1. Αυτή η παράμετρος εφαρμόζεται κατά το χρόνο εκτέλεσης και αντικαθιστά οποιοδήποτε κλειδί replicas.

Ωστόσο, πρέπει να είστε προσεκτικοί με τους ορισμούς θυρών. Εάν η υπηρεσία σας ορίζει έναν σταθερό χάρτη θύρας υποδοχής (π.χ., "8000:80"), η εκτέλεση του docker compose up --scale θα προκαλέσει σφάλμα για το δεύτερο και τρίτο κοντέινερ καθώς όλα προσπαθούν να δεσμεύσουν την ίδια θύρα υποδοχής.

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

  • Επιλογή 1: Χάρτης σε Τυχαίες Θύρες Διακομιστή (Καλή για Ανάπτυξη)

    Μπορείτε να τροποποιήσετε το docker-compose.yml σας για να καθορίσετε μόνο την θύρα του container. Αυτό λέει στο Docker να αντιστοιχίσει την θύρα 80 σε κάθε container σε μια τυχαία, διαθέσιμη θύρα στον υπολογιστή σας.

    services:
      web:
        image: nginx:alpine
        ports:
          - "80" # No fixed host port
        volumes:
          - ./app:/usr/share/nginx/html

    Τώρα, όταν εκτελείτε την εντολή scale:

    docker compose up -d --scale web=3

    Τρέξτε docker compose ps για να δείτε το αποτέλεσμα. Κάθε κοντέινερ θα εκτελείται σε διαφορετική, τυχαία καθορισμένη θύρα του host:

          Name                     Command               State          Ports        
    ----------------------------------------------------------------------------------
    compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:49154->80/tcp
    compose-demo-web_2   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:49155->80/tcp
    compose-demo-web_3   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:49156->80/tcp
  • docker-compose.yml - Σωστό για --scale

  • Επιλογή 2: Χρησιμοποιήστε έναν Αντιστροφεα Proxy (Κατάλληλο για Παραγωγή)

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

    Για να σταματήσετε και να αφαιρέσετε και τα τρία κοντέινερ, η εντολή παραμένει ίδια:

    docker compose down

Προσαρμοσμένη Διαμόρφωση Δικτύου

Εξ ορισμού, το Docker Compose δημιουργεί ένα μοναδικό δίκτυο bridge για την εφαρμογή σας. Κάθε υπηρεσία στο αρχείο συνδέεται με αυτό, γεγονός που επιτρέπει στο container wordpress να βρει το container db απλώς χρησιμοποιώντας το όνομα της υπηρεσίας του (db).

Ωστόσο, μπορείτε να ορίσετε τα δικά σας προσαρμοσμένα δίκτυα για καλύτερο διαχωρισμό και έλεγχο.

Ας τροποποιήσουμε το παράδειγμα του WordPress για να χρησιμοποιεί ένα προσαρμοσμένο δίκτυο bridge.

services:
  db:
    image: mysql:8.0
    ...
    networks:
      - app_net

  wordpress:
    image: wordpress:latest
    ...
    ports:
      - "8001:80"
    depends_on:
      - db
    networks:
      - app_net

volumes:
  db_data:

networks:
  app_net:
    driver: bridge

Αυτό είναι που προσθέσαμε:

  • δίκτυα (επάνω επίπεδο): Αυτό ορίζει ένα νέο δίκτυο με το όνομα app_net και καθορίζει ότι θα πρέπει να χρησιμοποιεί τον τυπικό οδηγό bridge.
  • δίκτυα (επίπεδο υπηρεσίας): Υπό τόσο το db όσο και το wordpress, αυτό το κλειδί τα συνδέει με το δίκτυό μας app_net.

Αν είχατε μια τρίτη υπηρεσία (όπως ένα εργαλείο αναλύσεων) την οποία δεν συνδέσατε με το app_net, θα ήταν εντελώς απομονωμένη και ανίκανη να επικοινωνήσει με τα κοντέινερ db ή wordpress.

Για πολυ-κεντρική συγκρότηση με το Docker Swarm, θα αλλάζατε τον driver από bridge σε overlay. Ο bridge driver χρησιμοποιείται για επικοινωνία μεταξύ κοντέινερ σε έναν μοναδικό κεντρικό υπολογιστή, που είναι το πρότυπο για τις περισσότερες περιπτώσεις χρήσης του Docker Compose.

Χρήση Αρχείων Διαμόρφωσης Μόνιμης Δομής

Καθώς οι εφαρμογές σας μεγαλώνουν, το αρχείο σας docker-compose.yml μπορεί να γίνει μεγάλο και δύσκολο στη διαχείριση. Το Docker Compose υποστηρίζει την οδηγία include, που σας επιτρέπει να χωρίσετε τη ρύθμισή σας σε πολλά αρχεία.

Φανταστείτε ότι θέλετε να ξεχωρίσετε τους ορισμούς του WordPress και της βάσης δεδομένων σας, και ίσως να έχετε ένα κοινό docker-compose.override.yml για ρυθμίσεις ειδικές για ανάπτυξη (όπως το να δεσμεύετε μια θύρα στη βάση δεδομένων).

Η δομή του φακέλου σας μπορεί να φαίνεται έτσι:

compose-demo/
├── docker-compose.yml
├── docker-compose.db.yml
├── docker-compose.web.yml

Αυτό το αρχείο θα ορίσει μόνο την υπηρεσία db.

services:
  db:
    image: mysql:8.0
    container_name: mysql_db
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: <^your_root_password_here<^>
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: <^your_wordpress_password_here<^>
    restart: unless-stopped

volumes:
  db_data:

Αυτό το αρχείο θα ορίσει μόνο την υπηρεσία wordpress.

services:
  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    ports:
      - "8001:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: <^your_wordpress_password_here<^>
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wp_content:/var/www/html/wp-content
    depends_on:
      - db
    restart: unless-stopped

Τώρα, το κύριο αρχείο σας docker-compose.yml γίνεται πολύ απλό. Απλώς χρησιμοποιεί το include για να ενσωματώσει τα άλλα αρχεία.

include:
  - docker-compose.db.yml
  - docker-compose.web.yml

Όταν εκτελείτε docker compose up -d, το Compose θα διαβάσει και τα τρία αρχεία, θα συγχωνεύσει τις ρυθμίσεις και θα ξεκινήσει τις υπηρεσίες db και wordpress ακριβώς σαν να είχαν οριστεί σε ένα μόνο αρχείο. Αυτή η προσέγγιση καθιστά τη διαμόρφωσή σας πολύ πιο αρθρωτή και επαναχρησιμοποιήσιμη.

Σημείωση: Η εντολή include: απαιτεί Docker Compose v2.20 ή νεότερη έκδοση. Αν το σύστημά σας χρησιμοποιεί παλαιότερη έκδοση, μπορείτε να συνδυάσετε αρχεία χρησιμοποιώντας docker compose -f docker-compose.db.yml -f docker-compose.web.yml up.

Μεταφορά από το docker-compose (v1) στο docker compose (v2)

Η εντολή docker compose που εγκαταστήσατε στο Βήμα 1 είναι «Compose v2». Είναι ένα πρόσθετο βασισμένο στη γλώσσα Go ενσωματωμένο απευθείας στο Docker CLI.

Η αρχική έκδοση, «Compose v1», ήταν ένα ξεχωριστό εργαλείο Python που εκκινούνταν με docker-compose (με παύλα). Από τον Ιούλιο του 2023, το Compose v1 δεν υποστηρίζεται πλέον και έχει σταματήσει να χρησιμοποιείται.

Κύριες Αλλαγές και Αντιστρεπτή Συμβατότητα

  • Η Εντολή: Η πιο προφανής αλλαγή είναι η εντολή. Το παύλα (docker-compose) είναι τώρα κενό (docker compose).
  • Εγκατάσταση: η έκδοση v1 εγκαταστάθηκε με pip. Η έκδοση v2 περιλαμβάνεται στο Docker Desktop ή εγκαθίσταται ως προσθήκη CLI, όπως κάνατε στο Βήμα 1.
  • Αρχεία YAML: Τα αρχεία σας docker-compose.yml είναι σχεδόν 100% συμβατά με παλαιότερες εκδόσεις. Το Compose v2 υποστηρίζει πλήρως τις εκδόσεις αρχείων 3.x. Δεν χρειάζεται να αλλάξετε τα αρχεία YAML για τη μετανάστευση, μόνο τις εντολές σας.
  • --project-name σημαία: Η σημαία -p εξακολουθεί να λειτουργεί, αλλά η πλήρης σημαία τώρα είναι --project-name αντί για --project_name.

Οδηγός Μετάβασης Εντολών

Οι περισσότερες εντολές είναι ίδιες, απλώς χωρίς τον παύλο. Ακολουθεί ένας πίνακας που συγκρίνει τις κοινές εντολές της έκδοσης v1 με τις αντίστοιχες της v2.

Εντολή docker-compose (v1)docker compose (v2) ΕντολήΣημειώσεις
docker-compose up -d
docker compose up -d
Καμία αλλαγή στη σύνταξη.
docker-compose down
docker compose down
Καμία αλλαγή στη σύνταξη.
docker-compose ps
docker compose ps
Καμία αλλαγή στη σύνταξη.
docker-compose logs
docker compose logs
Καμία αλλαγή στη σύνταξη.
docker-compose stop
docker compose stop
Καμία αλλαγή στη σύνταξη.
docker-compose build
docker compose build
Καμία αλλαγή στη σύνταξη.
docker-compose exec web bash
docker compose exec web bash
Καμία αλλαγή στη σύνταξη.
docker-compose run web bash
docker compose run web bash
run δημιουργεί ένα νέο container. exec εκτελεί εντολές σε ένα υπάρχον.
docker-compose up --scale web=3
docker compose up --scale web=3
Η σημαία --scale εξακολουθεί να υποστηρίζεται στην έκδοση v2.

Όπως μπορείτε να δείτε, για τις περισσότερες καθημερινές χρήσεις, η μόνη αλλαγή είναι docker-compose -> docker compose. Εάν χρησιμοποιείτε σενάρια, μπορείτε να τα ενημερώσετε απλώς αφαιρώντας το παύλα.

Αν εξακολουθείτε να έχετε εγκατεστημένη την παλιά έκδοση docker-compose v1, μπορείτε να την αφαιρέσετε για να αποφύγετε τη σύγχυση:

sudo pip3 uninstall docker-compose

Ή, αν εγκαταστάθηκε με το apt:

sudo apt remove docker-compose

Επίλυση Συνηθισμένων Θεμάτων του Docker Compose

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

Ας δούμε μερικά από τα πιο κοινά λάθη και τις λύσεις τους.

Άδεια Απαγορεύεται (Docker Socket)

Αυτό είναι ένα από τα πιο συχνά λάθη για νέους χρήστες του Docker. Εκτελείτε docker compose up και βλέπετε ένα μήνυμα σφάλματος σχετικά με την υποδοχή του Docker daemon.

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
  • Πρόβλημα: Ο μη-root χρήστης σας δεν έχει άδεια να επικοινωνεί με τον Docker daemon, ο οποίος εκτελείται ως root.

  • Λύση: Πρέπει να προσθέσετε τον χρήστη σας στην ομάδα docker, η οποία δημιουργήθηκε κατά την εγκατάσταση του Docker.

    1. Προσθέστε τον χρήστη σας στην ομάδα docker:

      sudo usermod -aG docker ${USER}
    2. Για να ενεργοποιηθεί η νέα συμμετοχή στην ομάδα, πρέπει να αποσυνδεθείτε και να συνδεθείτε ξανά.

    3. Εναλλακτικά, μπορείτε να ενεργοποιήσετε τις αλλαγές ομάδας για την τρέχουσα συνεδρία τερματικού σας πληκτρολογώντας:

      newgrp docker

    Αυτό θα πρέπει να επιλύσει τυχόν σφάλματα δικαιωμάτων που σχετίζονται με το socket του Docker.

Σύνταξη YAML και Σφάλματα Εσοχής

Το Docker Compose αποτυγχάνει να εκτελεστεί και αναφέρει ότι το αρχείο σας docker-compose.yml είναι άκυρο.

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.web.ports contains an invalid type, it should be a list

Ή :

mapping values are not allowed in this context at line 5
  • Πρόβλημα: Το αρχείο docker-compose.yml βασίζεται σε αυστηρή σύνταξη YAML. Το πιο συνηθισμένο λάθος είναι η λανθασμένη εσοχή. Το YAML χρησιμοποιεί κενά, όχι tabs, για να καθορίσει τη δομή.
  • Λύση: Ελέγξτε προσεκτικά την εσοχή στο αρχείο docker-compose.yml σας.

    • Το πρότυπο είναι δύο κενά για κάθε επίπεδο εσοχής.
    • Βεβαιωθείτε ότι όλα τα κλειδιά στο ίδιο επίπεδο (όπως version, services, volumes) ξεκινούν στην ίδια στήλη.
    • Βεβαιωθείτε ότι όλα τα υποκλειδιά (όπως image, ports, volumes κάτω από μια υπηρεσία) έχουν εσοχή δύο κενών περισσότερη από την κύρια υπηρεσία τους (π.χ., web).
    • Χρησιμοποιήστε έναν επεξεργαστή κώδικα με YAML linter για να υπογραμμίζετε αυτόματα τα σφάλματα σύνταξης.

Σύγκρουση λιμανιών

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

Error starting userland proxy: listen tcp 0.0.0.0:8000: bind: address already in use
  • Πρόβλημα: Άλλη διαδικασία στη μηχανή σας ήδη ακούει στη θύρα που προσπαθείτε να αντιστοιχίσετε (σε αυτήν την περίπτωση, θύρα 8000). Συχνά πρόκειται για άλλο κοντέινερ Docker ή έναν τοπικό διακομιστή ανάπτυξης.

  • Λύση: Έχετε δύο επιλογές:

    1. Σταματήστε την άλλη διαδικασία. Μπορείτε να βρείτε τη διαδικασία που χρησιμοποιεί τη θύρα με αυτή την εντολή:

      sudo lsof -i :8000

      Αν είναι άλλο δοχείο Docker, σταματήστε το με docker stop <container_id>.

    2. Αλλάξτε τη θύρα του host στο αρχείο σας docker-compose.yml. Αυτό είναι συχνά η πιο απλή λύση. Αλλάξτε την αντιστοίχιση ports από "8000:80" σε μια διαφορετική θύρα, όπως "8001:80".

      ...
      ports:
        - "8001:80" # Changed from 8000
      ...
    3. docker-compose.yml

Η υπηρεσία αποτυγχάνει με Απόρριψη Σύνδεσης (depends_on)

Σε μια εφαρμογή πολλαπλών υπηρεσιών (όπως το παράδειγμα με το WordPress και το MySQL), το container wordpress ξεκινάει αλλά τα αρχεία καταγραφής του δείχνουν Connection refused ή MySQL server has gone away όταν προσπαθεί να συνδεθεί με την υπηρεσία db.

  • Πρόβλημα: Έχετε χρησιμοποιήσει το depends_on, αλλά αυτή η οδηγία απλώς περιμένει να ξεκινήσει το container db. Δεν περιμένει καθόλου να είναι η εφαρμογή MySQL μέσα στο container πλήρως αρχικοποιημένη και έτοιμη να δεχτεί συνδέσεις.

  • Λύση: Η εφαρμογή (σε αυτή την περίπτωση, το WordPress) πρέπει να ρυθμιστεί ώστε να επαναλαμβάνει την προσπάθεια σύνδεσής της. Οι περισσότερες σύγχρονες εικόνες έχουν αυτή τη λειτουργία επανάληψης ενσωματωμένη. Για εικόνες που δεν έχουν, πρέπει να υλοποιήσετε έναν έλεγχο υγείας.

    Μπορείτε να προσθέσετε ένα healthcheck στην υπηρεσία db σας. Η ρύθμιση depends_on της υπηρεσίας wordpress μπορεί στη συνέχεια να διαμορφωθεί ώστε να περιμένει η βάση δεδομένων να είναι «υγιής» και όχι απλώς «ξεκινήσει».

Παράδειγμα Έλεγχου Υγείας για MySQL:

services:
  db:
    image: mysql:8.0
    ...
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p<^your_root_password_here<^>"]
      interval: 10s
      timeout: 5s
      retries: 5

  wordpress:
    image: wordpress:latest
    ...
    depends_on:
      db:
        condition: service_healthy # This now waits for the healthcheck
    ...

Σφάλματα με Τόμους και Στυπτήρες Συνδέσεων

Μπορεί να αντιμετωπίσετε σφάλματα αδείας στα αρχεία καταγραφής του container σας ή να διαπιστώσετε ότι ο κατάλογος δεδομένων του container σας είναι άδειος.

Δικαιώματα Αρχείου/Καταλόγου

  • Πρόβλημα: Το κοντέινερ εκτελείται ως συγκεκριμένος χρήστης (π.χ., www-data με Αναγνωριστικό Χρήστη 33), αλλά ο κατάλογος του υπολογιστή που προσαρτήσατε ανήκει σε εσάς (π.χ., ubuntu με Αναγνωριστικό Χρήστη 1000). Ο χρήστης του κοντέινερ δεν έχει δικαίωμα να γράψει στον κατάλογο του υπολογιστή.

  • Λύση: Αλλάξτε την ιδιοκτησία του καταλόγου του κεντρικού υπολογιστή ώστε να ταιριάζει με το αναγνωριστικό χρήστη μέσα στο container. Μπορείτε να βρείτε το αναγνωριστικό χρήστη του container εκτελώντας docker compose exec <service_name> id. Για παράδειγμα, αν το ID είναι 33 (συνηθισμένο για www-data):

    sudo chown -R 33:33 ./wp_content

Προβλήματα Σχετικής Διαδρομής

  • Πρόβλημα: Το αρχείο docker-compose.yml σας χρησιμοποιεί μια σχετική διαδρομή όπως ./app, αλλά το αρχείο index.html σας δεν σερβίρεται.

  • Λύση: Το Docker Compose ερμηνεύει τις σχετικές διαδρομές από τον κατάλογο όπου εκτελείτε την εντολή docker compose up. Πάντα να εκτελείτε τις εντολές Compose από τον ίδιο κατάλογο που περιέχει το αρχείο σας docker-compose.yml.

Δικτύωση και Ανίχνευση Υπηρεσιών

Τα αρχεία καταγραφής του κοντέινερ της εφαρμογής σας δείχνουν Host not found ή Could not resolve host: db.

  • Πρόβλημα: Το wordpress container σας δεν μπορεί να βρει το db container στο δίκτυο.
  • Λύση: Από προεπιλογή, το Docker Compose δημιουργεί ένα δίκτυο και συνδέει σε αυτό όλες τις υπηρεσίες. Οι υπηρεσίες μπορούν να εντοπίσουν η μία την άλλη χρησιμοποιώντας τα ονόματα των υπηρεσιών τους.

    1. Ελέγξτε τα Ονόματα Υπηρεσιών: Βεβαιωθείτε ότι το όνομα κεντρικού υπολογιστή στη ρύθμιση της εφαρμογής σας (π.χ., η μεταβλητή περιβάλλοντος WORDPRESS_DB_HOST) είναι ακριβώς το ίδιο με το όνομα της υπηρεσίας στο docker-compose.yml σας (π.χ., db).

    2. Επιθεώρηση του Δικτύου: Χρησιμοποιήστε docker compose ps για να βρείτε το όνομα του έργου σας (π.χ., compose-demo). Στη συνέχεια, επιθεωρήστε το προεπιλεγμένο δίκτυο:

      docker network inspect compose-demo_default

      Η έξοδος JSON θα εμφανίσει όλα τα κοντέινερ που είναι συνδεδεμένα σε αυτό το δίκτυο. Εάν κάποια από τις υπηρεσίες σας λείπει, ελέγξτε το docker-compose.yml για οποιαδήποτε προσαρμοσμένη ρύθμιση networks που μπορεί να την απομονώνει.

Ασυμφωνία εντολής (v1 vs. v2)

Πληκτρολογείτε docker-compose up (με παύλα) και βλέπετε σφάλμα «η εντολή δεν βρέθηκε».

docker-compose: command not found
  • Πρόβλημα: Προσπαθείτε να χρησιμοποιήσετε την εντολή για το Compose v1, το οποίο είναι ένα παρωχημένο εργαλείο Python. Αυτός ο οδηγός εγκαθιστά το Compose v2, το οποίο είναι ένα πρόσθετο ενσωματωμένο απευθείας στο Docker CLI.
  • Λύση: Χρησιμοποιήστε την σωστή εντολή αντικαθιστώντας τον παύλα (-) με ένα κενό.
docker-compose (έκδοση 1)docker compose (έκδοση 2)
docker-compose updocker compose up
docker-compose downdocker compose down
docker-compose psdocker compose ps
docker-compose logsdocker compose logs

Χρησιμοποιείτε πάντα docker compose (με κενό) όταν ακολουθείτε αυτόν τον οδηγό.

Συχνές Ερωτήσεις

1. Για ποιο σκοπό χρησιμοποιείται το Docker Compose;

Το Docker Compose είναι ένα εργαλείο για τον ορισμό και την εκτέλεση εφαρμογών Docker με πολλαπλά κοντέινερ.

Χρησιμοποιεί ένα μοναδικό αρχείο YAML (από προεπιλογή, docker-compose.yml) για να διαμορφώσει όλα τα στοιχεία της εφαρμογής σας, τα οποία ονομάζονται υπηρεσίες. Αυτό το αρχείο ορίζει επίσης τα δίκτυα που επιτρέπουν στις υπηρεσίες να επικοινωνούν μεταξύ τους και τους όγκους που χρησιμοποιούνται για μόνιμα δεδομένα.

Με αυτό το μόνο αρχείο, μπορείτε να διαχειριστείτε ολόκληρο το στοίβο της εφαρμογής σας με απλές εντολές:

  • docker compose up ξεκινά και εκτελεί ολόκληρη την εφαρμογή σας, συμπεριλαμβανομένων όλων των καθορισμένων κοντέινερ, δικτύων και τόμων.
  • docker compose down σταματά και αφαιρεί όλα τα containers, τα δίκτυα και τους τόμους που δημιουργήθηκαν από την εφαρμογή σας.

Είναι πιο χρήσιμο για τη διαχείριση εφαρμογών που απαιτούν πολλαπλά συστατικά, όπως ένας ιστότοπος που χρειάζεται έναν διακομιστή ιστού (όπως το Nginx), ένα backend εφαρμογής (όπως το WordPress) και μια βάση δεδομένων (όπως το MySQL).

2. Πώς μπορώ να εγκαταστήσω το Docker Compose σε Ubuntu;

Η συνιστώμενη μέθοδος είναι να εγκατασταθεί το Docker Compose ως plugin για το Docker CLI. Αυτό γίνεται με την εγκατάσταση του πακέτου docker-compose-plugin από το επίσημο αποθετήριο apt της Docker.

  1. Πρώτα, βεβαιωθείτε ότι έχετε ακολουθήσει την επίσημη τεκμηρίωση του Docker για να ρυθμίσετε το apt αποθετήριο του Docker στο σύστημα Ubuntu σας.

  2. Ενημερώστε τη λίστα πακέτων σας:

    sudo apt update
  3. Εγκαταστήστε το πρόσθετο Docker Compose:

    sudo apt install docker-compose-plugin
  4. Επαληθεύστε την εγκατάσταση ελέγχοντας την έκδοση. Η εντολή χρησιμοποιεί κενό, όχι παύλα.

    docker compose version

3. Πώς ενημερώνω το Docker Compose στην πιο πρόσφατη έκδοση;

Επειδή το Docker Compose (v2) είναι εγκατεστημένο ως πακέτο συστήματος χρησιμοποιώντας το apt, μπορείτε να το ενημερώσετε χρησιμοποιώντας τη συνήθη διαδικασία ενημέρωσης λογισμικού του Ubuntu.

  1. Ανανέωσε τον τοπικό δείκτη πακέτων σου:

    sudo apt update
  2. Κάντε αναβάθμιση σε όλο το σύστημα, η οποία θα περιλαμβάνει το πρόσθετο Compose:

    sudo apt upgrade

    Εναλλακτικά, αν θέλετε μόνο να ενημερώσετε το ίδιο το πρόσθετο, μπορείτε να εκτελέσετε:

    sudo apt install --only-upgrade docker-compose-plugin

4. Μπορεί να χρησιμοποιηθεί το Docker Compose σε περιβάλλοντα παραγωγής;

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

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

Για πιο πολύπλοκα σενάρια που απαιτούν συντονισμό κοντέινερ σε πολλαπλούς διακομιστές (ένα cluster), άλλα εργαλεία είναι πιο συνηθισμένα. Αυτά περιλαμβάνουν το Docker Swarm (που χρησιμοποιεί παρόμοια σύνταξη αρχείων Compose) και το Kubernetes (που είναι το βιομηχανικό πρότυπο για οργάνωση κοντέινερ σε μεγάλη κλίμακα).

5. Ποια είναι η διαφορά μεταξύ Docker και Docker Compose;

Αυτός ο πίνακας περιγράφει τις βασικές διαφορές μεταξύ του Docker CLI και του Docker Compose CLI.

Χαρακτηριστικόdocker (Μηχανή Docker)docker compose (Πρόσθετο Compose)
ΕύροςΔιαχειρίζεται ατομικά αντικείμενα Docker.Διαχειρίζεται μια πλήρη εφαρμογή πολλών κοντέινερ ως μία ενιαία μονάδα.
Κύρια ΧρήσηΔημιουργία εικόνων (docker build), εκτέλεση μεμονωμένων κοντέινερ (docker run), διαχείριση κοντέινερ (docker ps), εικόνων, τόμων και δικτύων.Ορχηστρώντας πολλές υπηρεσίες που ορίζονται σε ένα αρχείο docker-compose.yml.
ΕντολέςΕντολές χαμηλού επιπέδου που επικεντρώνονται σε ένα αντικείμενο. Παράδειγμα: docker run -d -p 80:80 -v ./:/app nginxΕντολές υψηλού επιπέδου για ολόκληρη την εφαρμογή. Παράδειγμα: docker compose up
ΑναλογίαΈνα δομικό στοιχείο (ένα μεμονωμένο δοχείο).Ο σχεδιασμός και ο διαχειριστής κατασκευής για ολόκληρο το κτίριο (την εφαρμογή).

Με λίγα λόγια, χρησιμοποιείτε το docker για να αλληλεπιδράσετε με ένα μόνο container. Χρησιμοποιείτε το docker compose για να διαχειριστείτε ολόκληρο το stack της εφαρμογής σας (π.χ. web, app, db) ταυτόχρονα.

6. Πώς τρέχω πολλαπλά container με το Docker Compose;

Εκτελείτε πολλαπλά κοντέινερ ορίζοντάς τα ως υπηρεσίες στο αρχείο σας docker-compose.yml.

  1. Δημιουργήστε ένα αρχείο με όνομα docker-compose.yml.

  2. Μέσα σε αυτό το αρχείο, χρησιμοποιήστε το κλειδί services: για να ορίσετε κάθε κοντέινερ που θέλετε να τρέξετε.

    Ακολουθεί ένα πρακτικό παράδειγμα που ορίζει και εκτελεί δύο containers: μια ιστοσελίδα WordPress και μια βάση δεδομένων MySQL.

    services:
      db:
        # This is the first service (container)
        image: mysql:8.0
        environment:
          MYSQL_ROOT_PASSWORD: <^your_password_here<^>
          MYSQL_DATABASE: wordpress
        volumes:
          - db_data:/var/lib/mysql
    
      wordpress:
        # This is the second service (container)
        image: wordpress:latest
        ports:
          - "8001:80"
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_PASSWORD: <^your_password_here<^>
        depends_on:
          - db
    
    volumes:
      db_data:
  3. docker-compose.yml

  4. Αποθήκευσε το αρχείο και άνοιξε ένα τερματικό στον ίδιο φάκελο.

  5. Εκτελέστε μία εντολή για να ξεκινήσετε και τα δύο κοντέινερ:

    docker compose up -d

Το Docker Compose θα διαβάσει το αρχείο, θα δημιουργήσει ένα κοινό δίκτυο για τις υπηρεσίες, θα κατεβάσει τις εικόνες mysql και wordpress και θα ξεκινήσει ένα κοντέινερ για κάθε υπηρεσία.

7. Γιατί να χρησιμοποιήσετε το Docker Compose για ανάπτυξη;

Το Docker Compose είναι ένα τυπικό εργαλείο για περιβάλλοντα ανάπτυξης επειδή λύνει αρκετά κοινά προβλήματα.

  • Συνεπή Περιβάλλοντα: Διασφαλίζει ότι κάθε προγραμματιστής σε μια ομάδα τρέχει τις ίδιες ακριβώς υπηρεσίες (βάση δεδομένων, cache, διακομιστή web) με τις ίδιες ακριβώς εκδόσεις και ρυθμίσεις. Αυτό ορίζεται στο αρχείο docker-compose.yml, το οποίο καταχωρείται στον έλεγχο έκδοσης. Αυτό εξαλείφει το πρόβλημα του “λειτουργεί στο μηχάνημά μου”.

  • Απλότητα: Αντικαθιστά τα περίπλοκα σενάρια εγκατάστασης και τις μακροσκελείς εντολές docker run. Ένας προγραμματιστής χρειάζεται μόνο να εκτελέσει docker compose up για να ξεκινήσει ολόκληρο το σύνολο εφαρμογών και docker compose down για να το σταματήσει.

  • Απομόνωση Υπηρεσιών: Οι προγραμματιστές μπορούν να εργάζονται σε πολλαπλά έργα στον ίδιο υπολογιστή χωρίς συγκρούσεις εξαρτήσεων. Το Έργο Α μπορεί να χρησιμοποιεί PostgreSQL 9.6 και το Έργο Β μπορεί να χρησιμοποιεί PostgreSQL 14, καθώς κάθε βάση δεδομένων τρέχει σε έναν απομονωμένο κοντέινερ που διαχειρίζεται το δικό του αρχείο Compose.

  • Εύκολος Έλεγχος Ενσωμάτωσης: Δεδομένου ότι το Compose ξεκινά όλες τις εξαρτήσεις μιας εφαρμογής μαζί, δημιουργεί ένα ιδανικό τοπικό περιβάλλον για την εκτέλεση ελέγχων ενσωμάτωσης που επαληθεύουν πώς οι υπηρεσίες αλληλεπιδρούν μεταξύ τους.

Συμπέρασμα

Σε αυτόν τον οδηγό, εγκαταστήσατε το Docker Compose και διαμορφώσατε μια πλήρη εφαρμογή πολλαπλών κοντέινερ. Ξεκινήσατε με ένα βασικό αρχείο docker-compose.yml για έναν διακομιστή ιστού Nginx και προχωρήσατε σε ένα πιο σύνθετο, ρεαλιστικό περιβάλλον που περιλαμβάνει μια εφαρμογή WordPress και μια βάση δεδομένων MySQL. Έχετε μάθει να διαχειρίζεστε ολόκληρο τον κύκλο ζωής της εφαρμογής, από την κατασκευή και εκτέλεση των υπηρεσιών μέχρι τη διακοπή και την αφαίρεσή τους.

Τώρα είστε εξοικειωμένοι με βασικές έννοιες για την αποτελεσματική διαχείριση εφαρμογών, όπως η κλιμάκωση υπηρεσιών, οι προσαρμοσμένοι ορισμοί δικτύου και η διάσπαση της διαμόρφωσής σας σε αρχεία modular χρησιμοποιώντας την εντολή include. Ακολουθώντας τον οδηγό μετεγκατάστασης και τα βήματα αντιμετώπισης προβλημάτων, μπορείτε επίσης να επιλύσετε κοινά ζητήματα όπως συγκρούσεις θυρών, σφάλματα «Άρνηση άδειας» και λάθη σύνταξης YAML. Οι δεξιότητες που καλύπτονται εδώ θα σας επιτρέψουν να δημιουργείτε συνεπή, αναπαραγώγιμα περιβάλλοντα ανάπτυξης και να αναπτύσσετε εφαρμογές σε μεμονωμένους υπολογιστές με αυτοπεποίθηση.

Για μια πλήρη αναφορά όλων των διαθέσιμων εντολών docker compose, συμβουλευτείτε την επίσημη τεκμηρίωση.

Για περισσότερα σεμινάρια σχετικά με το Docker, δείτε τα παρακάτω άρθρα:

  • Πώς να Εγκαταστήσετε το Docker σε Ubuntu – Οδηγός Βήμα προς Βήμα
  • Πώς να εγκαταστήσετε το WordPress με το Docker Compose

Ευχαριστούμε που μάθατε μαζί με την κοινότητα του Linux-Console.net.