Επιστροφή στο blog

Ανάπτυξη των Laravel, Nginx και MySQL με το Docker Compose

Ανάπτυξη των Laravel, Nginx και MySQL με το Docker Compose

Εισαγωγή

Η Συνεχής Ενσωμάτωση (CI) και η Συνεχής Διάθεση (CD) είναι μερικά από τα πιο δημοφιλή θέματα στην ανάπτυξη λογισμικού αυτή τη στιγμή. Για να επιτευχθεί η πτυχή του CI/CD της αρχιτεκτονικής λογισμικού, οι προγραμματιστές κάνουν χρήση containers. Containers είναι ελαφριά, εικονικοποιημένα, φορητά, καθοριζόμενα από λογισμικό περιβάλλοντα. Μέσα στα containers, το λογισμικό μπορεί να εκτελείται απομονωμένο από άλλο λογισμικό που εκτελείται στο φυσικό μηχάνημα φιλοξενίας. Η εστίαση αυτού του οδηγού είναι στη χρήση της πλατφόρμας container Docker για την ανάπτυξη και εκτέλεση διαδικτυακών εφαρμογών. Το Docker βοηθά στην απλοποίηση της διαδικασίας εγκατάστασης μιας στοίβας διακομιστή ιστού. Σε αυτόν τον οδηγό, θα χρησιμοποιήσουμε τη στοίβα LEMP για να εξυπηρετήσουμε μια εφαρμογή Laravel εφαρμογή.

Η στοίβα LEMP συνδυάζει το Linux ως λειτουργικό σύστημα, Nginx ως διακομιστή ιστού, MySQL ως βάση δεδομένων, και τη γλώσσα PHP για συγγραφή σεναρίων και δυναμική επεξεργασία. Μπορείτε να ακολουθήσετε τον οδηγό μας για το πώς να εγκαταστήσετε και να ρυθμίσετε μια στοίβα LEMP στο Ubuntu. Το Laravel είναι ένα από τα κορυφαία πλαίσια PHP για την ανάπτυξη διαδικτυακών εφαρμογών.

Το Docker παρέχει ένα εργαλείο που ονομάζεται Docker Compose για τον καθορισμό της διαδικασίας εγκατάστασης ενός docker container. Το Docker Compose επιτρέπει στους προγραμματιστές να ορίζουν την υποδομή της εφαρμογής τους, τις υπηρεσίες, τους τόμους, τα δίκτυα και τυχόν εξαρτήσεις σε ένα αρχείο που ονομάζεται αρχείο docker-compose. Μπορεί να διαχειριστεί πολλαπλά Docker containers μέσω των εντολών του, όπως docker container create, docker container run, κ.λπ.

Σε αυτόν τον οδηγό, θα μάθετε πώς να αναπτύξετε μια διαδικτυακή εφαρμογή Laravel με Nginx και MySQL μέσα σε ένα Docker container. Οι ρυθμίσεις για ολόκληρη τη στοίβα θα καθοριστούν μέσα σε ένα αρχείο docker-compose, καθώς και σε άλλα αρχεία ρυθμίσεων για PHP, MySQL και Nginx. Ας ξεκινήσουμε!

Πρώτα απ' όλα

Βήμα 1: Λήψη του Laravel και Εγκατάσταση των Εξαρτήσεων

Το πρώτο βήμα είναι να λάβετε τον κώδικα του Laravel από ένα αποθετήριο (repo). Σε πραγματικά σενάρια μπορεί να έχετε τον κώδικα Laravel σας σε ένα αποθετήριο κάπου, π.χ. στο GitHub, στο Bit Bucket, στο Gitlab, κ.λπ. Ωστόσο, για χάρη αυτού του οδηγού, θα κλωνοποιήσουμε την τελευταία έκδοση από το επίσημο αποθετήριο του Laravel στο GitHub. Το αποθετήριο συνοδεύεται από ένα αρχείο composer, έναν διαχειριστή εξαρτήσεων σε επίπεδο εφαρμογής για την PHP. Εφόσον θέλουμε όλα να εκτελούνται μέσα στο Docker container, θα εγκαταστήσουμε τις εξαρτήσεις χρησιμοποιώντας την εικόνα Docker composer εικόνας. Αυτό θα μας βοηθήσει επίσης να αποφύγουμε την καθολική εγκατάσταση του composer στο πραγματικό μηχάνημα φιλοξενίας. Στη συνέχεια, ανοίξτε το τερματικό σας.

Μεταβείτε στον αρχικό σας κατάλογο:

Εισαγάγετε την ακόλουθη εντολή για να κλωνοποιήσετε το αποθετήριο σε έναν κατάλογο που ονομάζεται laravel-web. Είστε ελεύθεροι να τον ονομάσετε όπως θέλετε. Κατά τη συγγραφή αυτού του οδηγού, όταν εκτελούμε αυτήν την εντολή, λαμβάνει την έκδοση 8 του Laravel. Όταν εκτελέσετε την εντολή, πιθανότατα θα βρείτε μια νέα έκδοση:

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

Εισαγάγετε την ακόλουθη εντολή για να προσαρτήσετε τους καταλόγους που απαιτούνται από την εφαρμογή laravel σας χρησιμοποιώντας την composer image:

Οι σημαίες -v και –rm στην εντολή docker run δημιουργούν ένα εφήμερο container που θα συνδεθεί με προσάρτηση (bind-mount) στον τρέχοντα κατάλογο πριν αφαιρεθεί. Η εντολή αντιγράφει τα περιεχόμενα του ~/laravel-web στο container και διασφαλίζει ότι ο φάκελος vendor που δημιουργήθηκε από το composer αντιγράφεται πίσω στον τρέχοντα κατάλογο.

Τώρα, πρέπει να αλλάξετε την ιδιοκτησία του καταλόγου laravel-web στον μη-root χρήστη. Αυτό θα επιτρέψει την εργασία με τον κώδικα της εφαρμογής σας ως μη-root χρήστης και την εκτέλεση διεργασιών μέσα στο container στα επόμενα βήματα. Εισαγάγετε την ακόλουθη εντολή για να αλλάξετε την ιδιοκτησία:

Ο κώδικας της εφαρμογής σας είναι πλέον στη θέση του. Ο κατάλογος ανήκει σε έναν μη-root χρήστη, οπότε μπορείτε να προχωρήσετε στον ορισμό των υπηρεσιών της εφαρμογής στο αρχείο docker-composer.

Βήμα 2: Δημιουργία του αρχείου Docker Compose

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

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

Τα αρχεία Docker Compose είναι YAML αρχεία που αποθηκεύονται με την επέκταση .yml. Λάβετε υπόψη ότι η σωστή εσοχή είναι απαραίτητη για ένα έγκυρο αρχείο Docker Compose. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε και να ανοίξετε το αρχείο με το nano για επεξεργασία:

Στη συνέχεια, θα ορίσετε τρεις υπηρεσίες σε αυτό το αρχείο: app, webserver και db. Η ενότητα db ορίζει τα διαπιστευτήρια της βάσης δεδομένων για την εφαρμογή σας, οπότε φροντίστε να επιλέξετε έναν ισχυρό κωδικό πρόσβασης mysql_root_password και να τον αντικαταστήσετε σε αυτήν την ενότητα. Αντιγράψτε και επικολλήστε τον ακόλουθο κώδικα:

Παρακάτω ακολουθούν επεξηγήσεις των ορισμών των υπηρεσιών από τον παραπάνω κώδικα:

  • app: Ορίζει την εφαρμογή Laravel και εκτελεί μια προσαρμοσμένη εικόνα Docker, cloudsigma.com/php, την οποία θα ορίσουμε στο Βήμα 4. Ορίζει επίσης το working_dir στο container σε /var/www/html.
  • webserver: Κάνει λήψη της nginx:alpine εικόνας από το Docker και εκθέτει τις θύρες 80 και 443.
  • db: Κάνει λήψη της εικόνας mysql:5.7.32 από το Docker και ορίζει μερικές μεταβλητές περιβάλλοντος. Αυτές περιλαμβάνουν μια βάση δεδομένων με το όνομα laravel_web για την εφαρμογή και τον κωδικό πρόσβασης root για τη βάση δεδομένων. Μπορείτε να μετονομάσετε τη βάση δεδομένων με ένα όνομα της επιλογής σας. Θυμηθείτε να αντικαταστήσετε την ιδιότητα MYSQL_ROOT_PASSWORD με έναν ισχυρό κωδικό πρόσβασης. Αυτή η υπηρεσία αντιστοιχίζει επίσης τη θύρα 3306 στον κεντρικό υπολογιστή στη θύρα 3306 στο container.

Η ιδιότητα container_name σε κάθε υπηρεσία ορίζει ένα όνομα για το κοντέινερ που αντιστοιχεί στην υπηρεσία. Εάν δεν ορίσετε την ιδιότητα, το Docker επιλέγει ένα τυχαίο όνομα για κάθε κοντέινερ.

Η ιδιότητα networks ορίζει ένα δίκτυο bridge με το όνομα app-network το οποίο διευκολύνει την επικοινωνία μεταξύ των κοντέινερ. Ένα δίκτυο bridge ελέγχεται από μια γέφυρα λογισμικού που επιτρέπει την επικοινωνία μόνο μεταξύ κοντέινερ στο ίδιο δίκτυο bridge. Ο ελεγκτής λογισμικού της γέφυρας εγκαθιστά προγράμματα οδήγησης που εμποδίζουν την απευθείας επικοινωνία μεταξύ κοντέινερ σε διαφορετικά δίκτυα bridge. Αυτό εξασφαλίζει υψηλό επίπεδο ασφάλειας, καθώς μόνο οι σχετικές υπηρεσίες μπορούν να επικοινωνούν απευθείας. Μπορείτε να επιλέξετε να ορίσετε πολλαπλές υπηρεσίες και δίκτυα που συνδέονται με σχετικές λειτουργίες.

Βήμα 3: Πώς να διατηρήσετε τα δεδομένα

Η διαδικτυακή σας εφαρμογή θα διαχειρίζεται και θα εξυπηρετεί δεδομένα στους χρήστες σας. Σε αυτό το βήμα, θα σας καθοδηγήσουμε στον ορισμό volumes και bind mounts για τους ορισμούς των υπηρεσιών σας, ώστε να διατηρηθούν τα δεδομένα της εφαρμογής. Το Docker προσφέρει εξαιρετικές δυνατότητες, όπως bind mounts και volumes για τη διατήρηση δεδομένων και την αποθήκευση αρχείων ρυθμίσεων της εφαρμογής. Θα τα χρησιμοποιήσουμε για τη ρύθμιση της Laravel εφαρμογής μας με το Docker.

Τα volumes προτιμώνται για διάφορους λόγους, συμπεριλαμβανομένης της παροχής αντιγράφων ασφαλείας και της διατήρησης δεδομένων πέρα από τον κύκλο ζωής ενός κοντέινερ. Τα Bind Mounts συνήθως αναφέρονται σε έναν πραγματικό κατάλογο στο μηχάνημα υποδοχής. Όταν δημιουργείτε ένα volume, δημιουργείται ένας νέος κατάλογος μέσα στον κατάλογο αποθήκευσης του Docker, ο οποίος διαχειρίζεται από το Docker. Όταν δημιουργείτε ένα bind mount, ένα αρχείο ή ένας κατάλογος μέσα στο μηχάνημα υποδοχής προσαρτάται σε ένα κοντέινερ (με αναφορά στην απόλυτη διαδρομή του). Αυτό είναι κρίσιμο για τη διαδικτυακή μας εφαρμογή, επειδή όταν κάνετε αλλαγές στον κώδικα στο μηχάνημα υποδοχής, αυτές θα γίνονται αμέσως διαθέσιμες στο κοντέινερ.

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

Έχοντας πει αυτό, ας δούμε πώς μπορούμε να χρησιμοποιήσουμε αυτές τις δύο δυνατότητες στη ρύθμισή μας. Αρχικά, θα ορίσουμε ένα volume για τη διατήρηση της βάσης δεδομένων MySQL. Στο αρχείο Docker Compose που είχαμε δημιουργήσει, κάτω από την υπηρεσία db, προσθέστε μια ιδιότητα volumes όπως επισημαίνεται παρακάτω:

Όπως ορίστηκε, το volume dbdata θα διατηρήσει τα περιεχόμενα του /var/lib/mysql. Διευκολύνει τη λήψη αντιγράφων ασφαλείας και επιτρέπει την επανεκκίνηση των υπηρεσιών χωρίς απώλεια δεδομένων. Στη συνέχεια, θα πρέπει να προσθέσετε τον ορισμό των volumes στο τέλος του αρχείου Docker Compose για να είναι διαθέσιμος σε όλες τις υπηρεσίες. Εισαγάγετε το ακόλουθο απόσπασμα κώδικα στο κάτω μέρος του αρχείου:

Για να συνδεθείτε σε μια βάση δεδομένων MySQL, πρέπει να παρέχετε διαπιστευτήρια. Για να το κάνετε αυτό, ορίστε ένα bind mount προσθέτοντας το ακόλουθο επισημασμένο απόσπασμα κώδικα στην υπηρεσία db κάτω από την ιδιότητα volumes:

Ο κώδικας συνδέει το ~/laravel-web/mysql/my.cnf με το /etc/mysql/my.cnf στο κοντέινερ. Το συνδεδεμένο αρχείο είναι τα αρχεία ρυθμίσεων της MySQL που θα δημιουργήσουμε στο Βήμα 7.

Το κοντέινερ πρέπει να χρησιμοποιεί τον διακομιστή Nginx για να εξυπηρετεί τον κώδικα της εφαρμογής σας. Επομένως, θα ορίσουμε δύο bind mounts (ένα για το αρχείο ρυθμίσεων του Nginx και ένα για τον κώδικα της εφαρμογής), κάτω από την υπηρεσία webserver για αυτόν τον σκοπό. Προσθέστε το ακόλουθο απόσπασμα κώδικα για τον ορισμό των volumes κάτω από την υπηρεσία webserver:

Αυτή η γραμμή – ./:/var/www/html συνδέει τον κώδικα της εφαρμογής στον κατάλογο ~/laravel-web με τον κατάλογο /var/www/html μέσα στο container. Για τη δεύτερη σύνδεση (bind mount), ένα αρχείο ρυθμίσεων για το Nginx θα δημιουργηθεί στο ~/laravel-web/nginx/conf.d/. Θα προσαρτηθεί στο /etc/nginx/conf.d/ μέσα στο container. Επομένως, μπορείτε να ενημερώσετε το αρχείο ρυθμίσεων στο κεντρικό μηχάνημα όπως απαιτείται. Θα δημιουργήσουμε το αρχείο conf του Nginx στο Βήμα 6.

Για να εμφανίζονται αυτόματα οι αλλαγές στον κώδικα μέσα στο container, συνδέουμε (bind mount) τον κώδικα της εφαρμογής στο container. Αυτό επιταχύνει τη διαδικασία ανάπτυξης. Επομένως, προσθέστε το ακόλουθο επισημασμένο απόσπασμα κώδικα στην υπηρεσία app:

Η δεύτερη γραμμή συνδέει ένα αρχείο ρυθμίσεων php, το οποίο θα δημιουργήσουμε στο Βήμα 5 μέσα στο αρχείο ~/laravel-web/php/laravel.ini στο /usr/local/etc/php/conf.d/laravel.ini μέσα στο container.

Το πλήρες αρχείο Docker Compose θα πρέπει τώρα να μοιάζει με αυτό:

Αν όλα φαίνονται εντάξει, πατήστε Ctrl + O για να αποθηκεύσετε το αρχείο. Στη συνέχεια, πατήστε Ctrl + X για να βγείτε από τον επεξεργαστή. Σε αυτό το σημείο, θα πρέπει να είστε σε θέση να δημιουργήσετε μια προσαρμοσμένη εικόνα Docker για την εφαρμογή σας με το αρχείο Docker Compose.

Βήμα 4: Δημιουργία του Dockerfile

Το Dockerfile περιλαμβάνει οδηγίες τις οποίες μπορεί να χρησιμοποιήσει το Docker για να δημιουργήσει προσαρμοσμένες εικόνες Docker. Μπορεί επίσης να εγκαταστήσει το απαιτούμενο λογισμικό και να διαμορφώσει τις απαραίτητες ρυθμίσεις για την εφαρμογή σας. Αυτές καθορίζουν το περιβάλλον μέσα σε ένα container που θα φιλοξενήσει τον κώδικα της εφαρμογής σας. Μπορείτε να προωθήσετε τις εικόνες που δημιουργείτε στο docker hub για κοινή χρήση ή να τις τοποθετήσετε σε άλλα ιδιωτικά μητρώα.

Θα δημιουργήσουμε ένα Dockerfile που θα καθορίζει τις οδηγίες για τη δημιουργία του ειδώλου της εφαρμογής Laravel. Χρησιμοποιήστε το nano για να δημιουργήσετε το Dockerfile στον κατάλογο ~/laravel-web:

Στον επεξεργαστή που άνοιξε, προσθέστε τον ακόλουθο κώδικα:

Το Dockerfile δημιουργεί πρώτα ένα είδωλο βασισμένο στο php:7.4-fpm είδωλο Docker. Αυτό είναι ένα είδωλο βασισμένο στο Debian με εγκατεστημένη την υλοποίηση PHP FastCGI (PHP-FPM). Για να εκτελεστεί σωστά το Laravel, απαιτεί τη διαθεσιμότητα άλλων επεκτάσεων php όπως mcrypt, pdo_mysql, mbstring και imagick, τις οποίες εγκαθιστά το σενάριο. Στη συνέχεια εγκαθιστά τον composer διαχειριστή πακέτων php. Το κοντέινερ θα τον χρησιμοποιήσει για να εγκαταστήσει τις εξαρτήσεις php του Laravel.

Μπορείτε να χρησιμοποιήσετε την οδηγία RUN για να ορίσετε εντολές όπως εγκατάσταση, ενημέρωση και διαμόρφωση ρυθμίσεων μέσα στο κοντέινερ. Επίσης, εκχωρεί δικαιώματα χρήστη. Η οδηγία WORKDIR καθορίζει τον κατάλογο εργασίας, στην προκειμένη περίπτωση τον /var/www/html. Το σενάριο εκτελεί την εντολή CHOWN για να εκχωρήσει τα δικαιώματα του καταλόγου /var/www/html στον χρήστη www-data.

Πριν από την τελική δημιουργία του ειδώλου, πρέπει να εκτεθεί μια θύρα για να επιτραπεί η πρόσβαση στην εφαρμογή που εκτελείται μέσα στο κοντέινερ. Η εντολή EXPOSE εκθέτει μια θύρα, την 9000, για τον διακομιστή php-fpm. Η τελική εντολή προς εκτέλεση είναι η οδηγία CMD. Εκτελεί το php-fpm για να ξεκινήσει ο διακομιστής.

Μπορείτε τώρα να πατήσετε Ctrl + O για να αποθηκεύσετε το αρχείο. Στη συνέχεια, πατήστε Ctrl + X για να βγείτε από τον επεξεργαστή.

Step 5: Configure PHP

Σε αυτό το βήμα, θα διαμορφώσουμε την υπηρεσία php για να επεξεργάζεται εισερχόμενα αιτήματα από το Nginx. Θα δημιουργήσετε ένα αρχείο laravel.ini μέσα στον κατάλογο php. Αυτό το αρχείο θα περιέχει τις ρυθμίσεις παραμέτρων της PHP. Αυτό είναι το αρχείο που είχατε συνδέσει με bind-mount στο /usr/local/etc/php/conf.d/laravel.ini μέσα στο κοντέινερ στο Βήμα 3. Οι ρυθμίσεις σε αυτό το αρχείο παρακάμπτουν το προεπιλεγμένο αρχείο php.ini που συνήθως διαβάζει η PHP κατά την εκκίνησή της. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε τον κατάλογο php:

Δημιουργήστε και ανοίξτε το αρχείο laravel.ini μέσα στον κατάλογο php εισάγοντας την ακόλουθη εντολή:

Το προεπιλεγμένο php.ini αρχείο έχει όριο μεταφόρτωσης ορισμένο στα 2M. Ως παράδειγμα, θα σας δείξουμε πώς να προσαρμόσετε και να ορίσετε τις ρυθμίσεις της php αλλάζοντας την τιμή του επιτρεπόμενου ορίου μεταφόρτωσης, σε περίπτωση που θέλετε να μεταφορτώσετε μεγαλύτερα αρχεία. Εισαγάγετε τις ακόλουθες γραμμές κώδικα μέσα στο αρχείο:

Αυτό ορίζει το όριο μεταφόρτωσης και μπορείτε να μεταφορτώνετε αρχεία με συνολικό μέγεθος που δεν υπερβαίνει τα 80MB. Μπορείτε να προσθέσετε άλλες ρυθμίσεις php μέσα στο αρχείο laravel.ini για να παρακάμψετε τις προεπιλεγμένες ρυθμίσεις php. Τώρα, αποθηκεύστε και κλείστε το αρχείο.

Βήμα 6: Διαμόρφωση του Nginx

Σε αυτό το βήμα, θα διαμορφώσουμε το Nginx ώστε να χρησιμοποιεί την υπηρεσία php που ορίσαμε νωρίτερα. Θα χρησιμοποιήσει το PHP-FPM ως FastCGI server για την εξυπηρέτηση δυναμικού περιεχομένου. Ο FastCGI server είναι ένα λογισμικό που επιτρέπει σε διαδραστικά προγράμματα να επικοινωνούν με έναν διακομιστή ιστού.

Όπως είχαμε ορίσει στο αρχείο docker-compose στο Βήμα 3, θα δημιουργήσουμε το αρχείο ρυθμίσεων του Nginx app.conf μέσα στον κατάλογο ~/laravel-web/nginx/conf.d/. Πρώτα, εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε τον κατάλογο:

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

Προσθέστε τον ακόλουθο κώδικα ρυθμίσεων Nginx στο αρχείο:

Το Nginx διαβάζει αρχεία ρυθμίσεων που ονομάζονται server blocks για να γνωρίζει ποιος κατάλογος πρέπει να εξυπηρετείται σε έναν επισκέκτη του ιστότοπου με βάση τη διεύθυνση URL. Για να μάθετε περισσότερα, διαβάστε σχετικά με τη ρύθμιση των server blocks στον οδηγό μας για την εγκατάσταση του Nginx στο Ubuntu 18.04. Οι οδηγίες που ορίζονται εξυπηρετούν τους ακόλουθους σκοπούς:

  • listen – Ορίζει τη θύρα στην οποία ο διακομιστής θα ακούει για εισερχόμενα αιτήματα, η οποία είναι συνήθως η θύρα 80.
  • error_log & access_log – Ορίζει τα αρχεία για την εγγραφή των αρχείων καταγραφής της εφαρμογής.
  • root – Ορίζει τη διαδρομή webroot, τον κατάλογο που θα εξυπηρετεί οποιοδήποτε αίτημα υποβάλλεται στον διακομιστή από το διαδίκτυο.

Στο μπλοκ location για την php, η οδηγία fastcgi_pass καθορίζει ότι η υπηρεσία app ακούει σε μια υποδοχή TCP στη θύρα 9000 (η οποία ορίστηκε στο Dockerfile). Αυτό κατευθύνει τον διακομιστή PHP-FPM να ακούει μέσω του δικτύου και όχι σε μια υποδοχή Unix. Αν και μια υποδοχή Unix μπορεί να έχει ένα μικρό πλεονέκτημα ταχύτητας έναντι μιας υποδοχής TCP, στερείται πρωτοκόλλου δικτύου, παρακάμπτοντας έτσι τη στοίβα δικτύου.

Ένα Unix socket θα ήταν πιο κατάλληλο για σενάρια όπου οι κεντρικοί υπολογιστές βρίσκονται στο ίδιο μηχάνημα. Ωστόσο, εάν έχετε υπηρεσίες που εκτελούνται σε διαφορετικούς κεντρικούς υπολογιστές, ένα TCP socket έχει το πλεονέκτημα της σύνδεσης υπηρεσιών που είναι κατανεμημένες. Στη δική μας περίπτωση, το κοντέινερ της εφαρμογής εκτελείται σε διαφορετικό κεντρικό υπολογιστή από το κοντέινερ του διακομιστή ιστού μας. Επομένως, ένα TCP socket είναι το πλέον κατάλληλο για τη διαμόρφωσή μας.

Μπορείτε τώρα να πατήσετε Ctrl + O για να αποθηκεύσετε το αρχείο, και στη συνέχεια να πατήσετε Ctrl + X για να βγείτε από τον επεξεργαστή. Οι αλλαγές που έγιναν στον κατάλογο nginx/conf.d/ θα αντικατοπτριστούν αυτόματα στο κοντέινερ του διακομιστή ιστού χάρη στο bind mount που προσθέσατε στο αρχείο Docker Compose στο Βήμα 3.

Βήμα 7: Διαμόρφωση της MySQL

Αφού διαμορφώσαμε το Nginx ώστε να λειτουργεί με την PHP, μπορούμε τώρα να διαμορφώσουμε τη MySQL για την αποθήκευση και την παροχή δυναμικών δεδομένων στην PHP. Είχαμε ήδη ορίσει στο αρχείο Docker Compose την εγκατάσταση των απαραίτητων επεκτάσεων για την επικοινωνία PHP και MySQL. Θα δημιουργήσουμε το αρχείο διαμόρφωσης της MySQL my.cnf μέσα στον φάκελο mysql, το οποίο θα συνδεθεί μέσω bind-mount στο /etc/mysql/my.cnf όπως είχαμε ορίσει στην ενότητα της υπηρεσίας db του Docker Compose στο Βήμα 3.

Οι ρυθμίσεις διαμόρφωσης και οι αλλαγές της MySQL μπορούν να γίνουν στο αρχείο my.cnf όποτε θέλετε. Θα πρέπει να αντικατοπτρίζονται αμέσως μέσα στο κοντέινερ. Αρχικά, δημιουργήστε τον κατάλογο εισάγοντας την ακόλουθη εντολή:

Στη συνέχεια, δημιουργήστε και ανοίξτε το nano εισάγοντας την ακόλουθη εντολή:

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

Ορίζοντας την ιδιότητα general_log ως 1, επιτρέπετε τα γενικά αρχεία καταγραφής. Η ιδιότητα general_log_file καθορίζει τη θέση του αρχείου καταγραφής. Πατήστε Ctrl + O για να αποθηκεύσετε το αρχείο, και στη συνέχεια πατήστε Ctrl + X για να βγείτε από τον επεξεργαστή.

Βήμα 8: Ορισμός μεταβλητών περιβάλλοντος Laravel

Μέχρι αυτό το σημείο, όλες οι υπηρεσίες και οι ρυθμίσεις διαμόρφωσης έχουν ολοκληρωθεί. Έτσι, θα μπορούσαμε να αναπτύξουμε τα κοντέινερ μας. Ωστόσο, υπάρχει ένα σημαντικό βήμα που πρέπει να ολοκληρωθεί προτού η διαδικτυακή μας εφαρμογή είναι πραγματικά χρησιμοποιήσιμη – οι μεταβλητές περιβάλλοντος. Το πλαίσιο Laravel αναμένει ένα αρχείο με όνομα .env το οποίο χρησιμοποιεί για να ορίσει το περιβάλλον του. Από προεπιλογή, το Laravel συνοδεύεται από το .env.example το οποίο μπορείτε να αντιγράψετε στο .env και στη συνέχεια να τροποποιήσετε τις μεταβλητές με τα πραγματικά σας στοιχεία. Εισαγάγετε την ακόλουθη εντολή για να αντιγράψετε το αρχείο:

Μόλις αντιγραφεί, ανοίξτε το αρχείο χρησιμοποιώντας το nano για να το τροποποιήσετε:

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

screenshot of what the file

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

  • DB_HOST είναι το db κοντέινερ βάσης δεδομένων.
  • DB_DATABASE είναι το laravel_web.
  • DB_USERNAME είναι το όνομα χρήστη για τη βάση δεδομένων. Επιλέξτε ένα όνομα της επιλογής σας, αλλά για χάρη αυτού του οδηγού, ας χρησιμοποιήσουμε το laraveldocker.
  • DB_PASSWORD είναι ένας ισχυρός κωδικός πρόσβασης που θα χρησιμοποιήσει ο παραπάνω χρήστης σας για να συνδεθεί στη βάση δεδομένων, επομένως επιλέξτε έναν ισχυρό κωδικό πρόσβασης. Στο Βήμα 10, θα δημιουργήσουμε αυτόν τον χρήστη με τον κωδικό πρόσβασης που θα επιλέξετε εδώ.

Με τις τιμές ενημερωμένες, το DB_CONNECTION θα πρέπει τώρα να μοιάζει κάπως έτσι:

DB_CONNECTION

Αποθηκεύστε και κλείστε το αρχείο.

Βήμα 9: Εκτέλεση των Docker Containers

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

Όταν εκτελείτε την εντολή docker-compose up για πρώτη φορά, λαμβάνει όλες τις απαραίτητες εικόνες Docker. Εάν ρυθμίζετε την υποδομή στον τοπικό σας υπολογιστή, ενδέχεται να χρειαστεί λίγος χρόνος για να ολοκληρωθεί. Μόλις ληφθούν οι εικόνες, το Compose δημιουργεί τα κοντέινερ. Η σημαία -d καθοδηγεί το Docker να εκτελέσει τα κοντέινερ στο παρασκήνιο. Εάν η διαδικασία ολοκληρωθεί με επιτυχία, θα πρέπει να μπορείτε να δείτε κάτι σαν αυτό στο τερματικό σας:

terminal

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

Θα πρέπει να εμφανίσει κάτι σαν το παρακάτω στιγμιότυπο οθόνης, με λεπτομέρειες σχετικά με τα κοντέινερ app, webserver και db:

screenshot details

  • CONTAINER ID – Ένα μοναδικό αναγνωριστικό για κάθε κοντέινερ.
  • NAMES – Το όνομα της υπηρεσίας που σχετίζεται με κάθε κοντέινερ, όπως ορίζεται στο αρχείο Docker Compose. (Μπορείτε να χρησιμοποιήσετε είτε το αναγνωριστικό είτε το όνομα του κοντέινερ για να αποκτήσετε πρόσβαση σε αυτό).
  • IMAGE – Το όνομα της εικόνας για κάθε κοντέινερ.
  • STATUS – Εμφανίζει πληροφορίες σχετικά με την κατάσταση του κοντέινερ (μπορεί να είναι σταματημένο, σε εκτέλεση ή σε επανεκκίνηση).
  • PORTS – Δείχνει τις θύρες που εκθέτει ένα κοντέινερ.

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

Το Docker παρέχει μια εντολή για πρόσβαση στη γραμμή εντολών ενός κοντέινερ. Η σύνταξή της είναι η εξής: docker-compose exec container_name bash. Για να αποκτήσετε πρόσβαση στη γραμμή εντολών του κοντέινερ app, εισαγάγετε την ακόλουθη εντολή:

Μόλις βρεθείτε στη γραμμή εντολών του κοντέινερ, μπορείτε να εκτελέσετε ορισμένες εντολές ρύθμισης παραμέτρων Laravel Artisan. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε το κλειδί laravel και να το αποθηκεύσετε στο αρχείο .env:

Με το κλειδί περιβάλλοντος ορισμένο, μπορείτε να εκτελέσετε την ακόλουθη εντολή για να αποθηκεύσετε στη μνήμη cache τις ρυθμίσεις παραμέτρων:

Οι ρυθμίσεις παραμέτρων αποθηκεύονται στο αρχείο /var/www/html/bootstrap/cache/config.php μέσα στο κοντέινερ. Μπορείτε να πατήσετε Ctrl + D για να βγείτε από το τερματικό του κοντέινερ.

Για να επιβεβαιώσετε ότι η εφαρμογή Laravel έχει αναπτυχθεί και εκτελείται, επισκεφτείτε τη δημόσια IP του διακομιστή σας στο πρόγραμμα περιήγησής σας (http://your_server_public_ip). Θα πρέπει να δείτε τη σελίδα καλωσορίσματος για μια νέα εγκατάσταση Laravel:

laravel screenshot

Step 10: Configure a MySQL user

Σε αυτό το βήμα, θα δημιουργήσουμε έναν χρήστη βάσης δεδομένων για τη βάση δεδομένων MySQL laravel_web που καθορίσαμε στο αρχείο docker-compose. Όταν εκτελέσατε την εντολή δημιουργίας κοντέινερ στο Step 9, η MySQL εγκαταστάθηκε, αλλά δημιούργησε μόνο έναν προεπιλεγμένο διαχειριστικό λογαριασμό root, ο οποίος τυχαίνει να έχει απεριόριστα προνόμια στη βάση δεδομένων. Για να αποφύγουμε τη χρήση του χρήστη root, θα δημιουργήσουμε έναν αποκλειστικό χρήστη, τον laraveldocker, για χρήση στην εφαρμογή. Αυτός είναι ο χρήστης που καθορίσατε στις μεταβλητές περιβάλλοντος στο Step 8. Αποκτήστε πρόσβαση στη γραμμή εντολών μέσα στο τερματικό εισάγοντας την ακόλουθη εντολή:

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

Στο πλαίσιο προτροπής για τον κωδικό πρόσβασης, εισαγάγετε τον κωδικό πρόσβασης που ορίσατε στην υπηρεσία db στο αρχείο docker-compose στο Step 2.

Αφού συνδεθείτε στην προτροπή της MySQL, ελέγξτε αν μπορείτε να δείτε τη βάση δεδομένων που καθορίσατε στο αρχείο docker-compose εισάγοντας την ακόλουθη εντολή SQL:

Θα πρέπει να δείτε τη βάση δεδομένων laravel_web, ή οποιοδήποτε όνομα έχετε καθορίσει για τη δική σας εγκατάσταση:

Laravel

Στη συνέχεια, δημιουργούμε έναν χρήστη και έναν κωδικό πρόσβασης για τη βάση δεδομένων laravel_web. Αυτά πρέπει να είναι τα ίδια στοιχεία που καθορίσατε στο αρχείο .env στο Step 8. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε χρήστη και κωδικό πρόσβασης και να εκχωρήσετε όλα τα προνόμια σε αυτόν τον χρήστη:

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

Αυτό ολοκληρώνει τη ρύθμιση παραμέτρων του χρήστη MySQL. Εξέλθετε από τη γραμμή εντολών της MySQL πληκτρολογώντας exit και πατώντας enter. Τέλος, εξέλθετε από το db container πατώντας Ctrl + D.

Βήμα 11: Δοκιμή της επικοινωνίας μεταξύ του κώδικα της εφαρμογής Laravel και της βάσης δεδομένων MySQL

Μέχρι αυτό το βήμα, όλα έχουν λειτουργήσει καλά. Ωστόσο, θέλουμε να επιβεβαιώσουμε ότι ο κώδικας Laravel στο app container μπορεί να επικοινωνήσει με τη βάση δεδομένων MySQL στο db container. Αρχικά, αποκτήστε πρόσβαση στο τερματικό του app container εισάγοντας την ακόλουθη εντολή:

Στη συνέχεια, πρέπει να εκτελέσετε την laravel migration εντολή που δημιουργεί τους πίνακες:

Θα πρέπει να δείτε τη διαδικασία migration στο τερματικό σας καθώς το Laravel δημιουργεί τους προεπιλεγμένους πίνακες:

migration process

Στη συνέχεια, θα δοκιμάσουμε αν μπορούμε να έχουμε πρόσβαση στη βάση δεδομένων από το Laravel. Το Laravel συνοδεύεται από το Tinker από προεπιλογή, το οποίο σας επιτρέπει να αλληλεπιδράτε με ολόκληρη την εφαρμογή από τη γραμμή εντολών, συμπεριλαμβανομένης της πρόσβασης στη βάση δεδομένων, της εκτέλεσης εργασιών, eloquent ORM, και πολλά άλλα. Μπορούμε να χρησιμοποιήσουμε το Tinker για να δούμε τα δεδομένα στον πίνακα migrations. Εισαγάγετε την ακόλουθη εντολή για να αποκτήσετε πρόσβαση στο Tinker:

Μόλις βρεθείτε στη γραμμή εντολών του Tinker, μπορείτε να δείτε τη λίστα με τους πίνακες που δημιουργήθηκαν από την εντολή migrate εισάγοντας τα εξής:

Το παρακάτω στιγμιότυπο οθόνης δείχνει το αποτέλεσμα, το οποίο είναι οι πίνακες που βρίσκονται αυτή τη στιγμή στη βάση δεδομένων laravel_web:

laravel_web database

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

Η εντολή παράγει το ακόλουθο αποτέλεσμα:

comman output

Από το παραπάνω αποτέλεσμα, η εφαρμογή Laravel είναι σωστά ρυθμισμένη και μπορεί να επικοινωνήσει με τη βάση δεδομένων. Μπορείτε να πειραματιστείτε με περισσότερες εντολές, όπως η δημιουργία μοντέλων, η εκτέλεση εργασιών και άλλα. Μπορείτε να εξέλθετε από τη γραμμή εντολών του Tinker πατώντας Ctrl + D.

Συμπέρασμα

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

Αν θέλετε να εξοικειωθείτε περισσότερο με τα containers, ρίξτε μια ματιά στον οδηγό μας που σας δείχνει πώς να καθαρίσετε τους πόρους του Docker – images, containers και volumes και στην λεπτομερή επισκόπησή μας για το εργαλείο Kubernetes.

Μπορείτε επίσης να επισκεφθείτε το ιστολόγιό μας για περισσότερα σχετικά με το Docker και το Continuous Integration και Continuous Deployment.

Καλή συνέχεια!

author

Pranay Kapgate

Συγγραφέας · CloudSigma

Ο Preslav Dobrev είναι Δημιουργικός Σχεδιαστής στην CloudSigma, με εστίαση στη συνεπή επιχειρηματική ταυτότητα μέσω παραδοσιακών και καινοτόμων καναλιών μάρκετινγκ. Διαθέτει την ικανότητα να συνδυάζει το καλλιτεχνικό όραμα με το στρατηγικό μάρκετινγκ για τη δημιουργία εντυπωσιακών αφηγήσεων επωνυμίας.

Σχόλια

Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.