Στο σημερινό τέταρτο μέρος της σειράς μας για το Docker, θα ρίξουμε μια ματιά στο Docker Compose, στο τι είναι και στο πως δημιουργείται.

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

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

– cerebrux.net/tag/docker-intro

Με το Docker Compose μπορούμε να αποθηκεύσουμε σε ένα αρχείο όλες τις υπηρεσίες μας και να τις τρέξουμε μαζικά με μία μόνο εντολή!

Η λογική του Docker Compose μοιάζει πολύ με τα script εντολών του Linux. Όπως δηλαδή το script σου επιτρέπει να δώσεις με τη μία όλες τις εντολές που περιέχονται σε αυτό, έτσι και με το Docker Compose μπορείς να «σηκώσεις» με μία μόνο κίνηση όλα σου τα container.

Advertisements

Αυτό είναι ιδιαίτερα χρήσιμο όταν η εφαρμογή μας αποτελείται από πολλά τμήματα (π.χ. 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, μοιάζουν πάρα πολύ μεταξύ τους αλλά δεν είναι ολόιδιες.

Advertisements

Online δημιουργία Docker Compose

Κάποια στιγμή θα εξοικειωθούμε στη μετατροπή τους, αλλά μέχρι τότε υπάρχει η online υπηρεσία «Composerize» η οποία μπορεί να μας μετατρέψει αυτόματα οποιαδήποτε εντολή σε αρχείο docker-compose !

μπορεί να μας μετατρέψει αυτόματα οποιαδήποτε εντολή σε αρχείο 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 για 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

Advertisements

Για να τα σταματήσουμε όλα αυτά με μια εντολή και να διαγράψουμε τα 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 θα βρείτε στην παραπομπή.

Παραπομπές: