Στο σημερινό τέταρτο μέρος της σειράς μας για το Docker, θα ρίξουμε μια ματιά στο Docker Compose, στο τι είναι και στο πως δημιουργείται.
Βλέποντας τον τρόπο με τον οποίο το Docker σου επιτρέπει να «σηκώσεις» εύκολα και γρήγορα οποιαδήποτε υπηρεσία στον υπολογιστή σου, θα σκέφτεσαι ότι δεν υπάρχει περίπτωση όλο αυτό να γίνει ευκολότερο. Κι όμως!
Όλη η σειρά οδηγών «Πως χρησιμοποιούμε το Docker βρίσκεται στον σύνδεσμο»:
Με το Docker Compose μπορούμε να αποθηκεύσουμε σε ένα αρχείο όλες τις υπηρεσίες μας και να τις τρέξουμε μαζικά με μία μόνο εντολή!
Η λογική του Docker Compose μοιάζει πολύ με τα script εντολών του Linux. Όπως δηλαδή το script σου επιτρέπει να δώσεις με τη μία όλες τις εντολές που περιέχονται σε αυτό, έτσι και με το Docker Compose μπορείς να «σηκώσεις» με μία μόνο κίνηση όλα σου τα container.
Αυτό είναι ιδιαίτερα χρήσιμο όταν η εφαρμογή μας αποτελείται από πολλά τμήματα (π.χ. PHP, MySQL, Redis κλπ) τα οποία θα πρέπει να μιλάνε μεταξύ τους και να μπορούν να ανταλλάσσουν πληροφορίες. Όλες αυτές οι υπηρεσίες δεν μπορείτε να τις σηκώνετε μια μια και έπειτα να τις συνδέετε με το χέρι. Οπότε με ένα docker compose γίνονται όλα εύκολα και αυτόματα όπως κάναμε με το προσωπικό σημειωματάριο σε WordPress/Dokuwiki.
Ένα ακόμη πλεονέκτημα του Docker Compose είναι ότι το αρχείο στο οποίο θα αποθηκεύσουμε τις εντολές μας δε θα είναι φτιαγμένο για χρήση μόνο στον συγκεκριμένο υπολογιστή. Μπορούμε δηλαδή να το μεταφέρουμε σε οποιονδήποτε server για να εγκαταστήσουμε και εκεί ακριβώς τις ίδιες υπηρεσίες. Πάμε πρώτα να δούμε πώς θα το εγκαταστήσουμε.
Εγκατάσταση Docker Compose
Για να ξεκινήσουμε λοιπόν θα πρέπει πρώτα να έχουμε εγκαταστήσει το Docker και αν δεν το έχουμε κάνει θα πρέπει να έχουμε εγκαταστήσει το Docker Compose, κάτι που γίνεται με την εντολή:
sudo apt install -y docker-compose
Μετατροπή εντολών Docker σε Docker Compose
Στη συνέχεια θα χρειαστεί να μετατρέψουμε τις «docker run» εντολές μας, σε μία μορφή η οποία είναι αναγνώσιμη από το Docker Compose.
Ας ρο δούμε με ένα απλό παράδειγμα χρησιμοποιώντας το Gitea. Το Gitea είναι μια δωρεάν και ανοιχτού κώδικα υπηρεσία στην οποία μπορούμε να ανεβάζουμε τον κώδικά μας ή τα project μας χρησιμοποιώντας το Git. Με λίγα λόγια είναι ένα προσωπικό Git/hub-lab.
Έτσι παράδειγμα αν η εντολή εκκίνησης της υπηρεσίας Gitea χρειάζεται εκκίνηση και εκτέλεση μιας βάσης δεδομένων και της υπηρεσίας της Gitea όπως π.χ.:
docker run -d \ -v db/:/var/lib/mysql \ --name db \ -e MYSQL_ROOT_PASSWORD=changeme MYSQL_DATABASE=gitea MYSQL_USER=gitea MYSQL_PASSWORD=changeme \ --restart always \ mariadb:10 docker run -d \ -p 3000:3000 \ -p 22:22 \ -v data:/data \ --name web \ --restart always \ gitea/gitea:1.8.3
Τότε στο Docker Compose θα πρέπει να τη γράψουμε ως εξής:
version: '2'
services:
web:
image: gitea/gitea:1.8.3
volumes:
- ./data:/data
ports:
- "3000:3000"
- "22:22"
depends_on:
- db
restart: always
db:
image: mariadb:10
restart: always
environment:
- MYSQL_ROOT_PASSWORD=changeme
- MYSQL_DATABASE=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=changeme
volumes:
- ./db/:/var/lib/mysql
Όπως βλέπετε το αρχείο είναι γραμμένο σε YAML και είναι ευανάγνωστο. Μας αναφέρει:
version
– είναι η έκδοση της σύνταξης στην οποία ήταν γραμμένηservices
– Αναφέρουμε απλά ότι ξεκινάμε μια σειρά υπηρεσιών που είναι αλληλένδετεςweb
καιdb
– τα δύο ονόματα των container που φτιάχνουμεdepends_on
– αναφέρει ότι θα περιμένει πρώτα να ολοκληρωθεί η δημιουργία τουdb
και έπειτα θα ξεκινήσει τοweb
.
Οι δύο εντολές για την βάση δεδομένων και την web υπηρεσία του Gitea, μοιάζουν πάρα πολύ μεταξύ τους αλλά δεν είναι ολόιδιες.
Online δημιουργία Docker Compose
Κάποια στιγμή θα εξοικειωθούμε στη μετατροπή τους, αλλά μέχρι τότε υπάρχει η online υπηρεσία «Composerize» η οποία μπορεί να μας μετατρέψει αυτόματα οποιαδήποτε εντολή σε αρχείο docker-compose !

Το Composerize μπορεί να εγκατασταθεί και τοπικά στον υπολογιστή μας με την εντολή αρκεί να έχουμε εγκαταστήσει τον διαχειριστή πακέτων nodejs, npm:
npm install composerize -g
Στη συνέχεια δίνουμε κανονικά την εντολή «docker run» βάζοντας όμως πρώτα τη λέξη «composerize» και το τερματικό μας θα απαντήσει με την εντολή σε μορφή «Docker Compose». Για παράδειγμα σε περίπτωση που θέλουμε να φτιάξουμε ένα docker compose για nginx:
composerize docker run -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro --restart always --log-opt max-size=1g nginx

Δημιουργία αρχείου «docker-compose.yml»
Τώρα θα πρέπει να δημιουργήσουμε το αρχείο «docker-compose.yml» στο οποίο θα προσθέσουμε τις εντολές για όλες μας τις υπηρεσίες. Όπως είπαμε είτε το κάνουμε με το χέρι εμείς, είτε χρησιμοποιόντας την online υπηρεσία composerize.
Αποθηκεύουμε λοιπόν αυτά μου μας εμφανίζει π.χ. το coposerize σε ένα αρχείο docker-compose.yml
και κλείνουμε το αρχείο μας και το τρέχουμε με την εντολή:
docker-compose up
Μετά από αυτό θα δούμε ότι οι υπηρεσίες μας έχουν ξεκινήσει όλες μαζικά και είναι έτοιμες για χρήση!
Χρήσιμες εντολές του Docker Compose
Κλείνοντας θα δούμε και μερικές απλές αλλά χρήσιμες εντολές του Docker Compose.
Είδαμε για παράδειγμα το docker-compose up
με το οποίο δημιουργούνται τα container, τα volume, τα image και τα network που περιλαμβάνονται στο αρχείο docker-compose.yml
.
Για να τα σταματήσουμε όλα αυτά με μια εντολή και να διαγράψουμε τα container δίνουμε την εντολή:
docker-compose down
Αν θέλουμε να σταματήσουμε τα container και μαζί τους να διαγράψουμε και τα volume που δημιουργήσαμε για αυτά, δίνουμε την ίδια εντολή ως εξής:
docker-compose down -v
Μπορούμε επίσης απλά να σταματήσουμε και χωρίς να διαγράψουμε τις υπηρεσίες που τρέχουν μέσω του «docker-compose.yml». Αυτό γίνεται με την εντολή:
docker-compose stop
Για να τις ξεκινήσουμε και πάλι δίνουμε την εντολή:
docker-compose start
Υπάρχει η δυνατότητα να τα βάλουμε όλα σε παύση με την εντολή:
docker-compose pause
Ενώ για να τα «ξεπαγώσουμε» θα δώσουμε την εντολή:
docker-compose unpause
Τέλος μπορούμε να κάνουμε επανεκκίνηση σε όλες τις υπηρεσίες που περιλαμβάνονται στο «docker-compose.yml» με την εντολή:
docker-compose restart
Εν κατακλείδι
Το Docker Compose είναι ένα πολύ χρήσιμο εργαλείο με το οποίο μπορούμε να έχουμε τακτοποιημένες τις εντολές όλων των υπηρεσιών που χρησιμοποιούμε σε έναν «production server».
Μας δίνει τη δυνατότητα να μεταφέρουμε το αρχείο και να το τρέξουμε σε έναν άλλο υπολογιστή, αν θέλουμε να κάνουμε μία γρήγορη μετάβαση σε νέο server, αλλά αυτό δε σημαίνει φυσικά ότι μαζί του θα πάρουμε και όλα τα δεδομένα που έχουμε ήδη στο server μας. Αυτές θα πρέπει να τις μεταφέρουμε στα σημεία που θα κάνουμε πάλι mount τα volumes που χρειάζεται το docker compose.
Περισσότερες εντολές και πληροφορίες για την σύνταξη της Docker Compose θα βρείτε στην παραπομπή.
Παραπομπές:
Σου άρεσε το άρθρο; Πες την άποψή σου... έστω και Ανώνυμα: