Django είναι ένα υψηλού επιπέδου ανοικτού κώδικα Python web framework που μπορεί να σας βοηθήσει να δημιουργήσετε την εφαρμογή σας Python γρήγορα. Ενθαρρύνει τη γρήγορη ανάπτυξη και τον καθαρό, ρεαλιστικό σχεδιασμό ακολουθώντας το αρχιτεκτονικό πρότυπο model–template–views. Έτοιμο προς χρήση, το framework συνοδεύεται από τα απαραίτητα σύγχρονα στοιχεία εφαρμογής, όπως έλεγχο ταυτότητας χρηστών, framework προσωρινής αποθήκευσης, object-relational mapper, URL Dispatcher, σύστημα προτύπων, και προσαρμόσιμο περιβάλλον διαχείρισης.
Gunicorn ‘Green Unicorn’ είναι ένας Python WSGI HTTP Server για συστήματα UNIX. Ο διακομιστής Gunicorn είναι συμβατός με διάφορα web frameworks, προσφέρει εξαιρετική απόδοση και είναι ελαφρύς σε πόρους διακομιστή. Docker είναι μια πλατφόρμα container ανοικτού κώδικα που υπάρχει εδώ και καιρό, καθιστώντας την ανάπτυξη εφαρμογών γρήγορη, αποτελεσματική και προβλέψιμη.
Σε αυτόν τον οδηγό, θα αποκτήσετε δεξιότητες στην ανάπτυξη και εγκατάσταση κλιμακώσιμων εφαρμογών ιστού Django σε containers. Θα χρησιμοποιήσουμε μια εφαρμογή Django Polls που δημιουργήθηκε ακολουθώντας τους εισαγωγικούς οδηγούς εκκίνησης του Django. Κατά τη συγγραφή του οδηγού, βασιστήκαμε στο Django 3.2 που υποστηρίζεται από το Python 3.6 ή νεότερη έκδοση. Θα εγκαταστήσουμε την εφαρμογή ως container με το Docker και θα την εξυπηρετήσουμε με τον διακομιστή Gunicorn. Φυσικά, πριν από την εγκατάσταση της εφαρμογής Django σε container, θα πρέπει να κάνετε κάποιες τροποποιήσεις στον κώδικα του έργου για να χειριστείτε πράγματα όπως η καταγραφή σε τυπικές ροές εξόδου και η εργασία με τις μεταβλητές περιβάλλοντος. Τα στατικά αρχεία, όπως εικόνες CSS και JavaScript, μπορούν να μεταφερθούν σε υπηρεσίες αποθήκευσης αντικειμένων για να επιτραπεί η εύκολη διαχείριση των αρχείων από μία τοποθεσία σε ένα περιβάλλον πολλαπλών containers.
Θα σας δείξουμε πώς να εφαρμόσετε αυτές τις τροποποιήσεις με βάση την καλά περιγεγραμμένη μεθοδολογία twelve-factor για τη δημιουργία κλιμακώσιμων εφαρμογών ιστού. Μόλις ολοκληρώσετε τις τροποποιήσεις, θα δημιουργήσετε μια εικόνα Docker της εφαρμογής και θα εγκαταστήσετε την containerized εφαρμογή με το Docker. Σας συνιστούμε να ακολουθήσετε τα βήματα που περιγράφονται στον οδηγό για να κατανοήσετε πλήρως το περιεχόμενό του.
Προαπαιτούμενα
Καθώς πρόκειται για έναν πρακτικό οδηγό, σας ενθαρρύνουμε να έχετε την παρακάτω εγκατάσταση για να μπορέσετε να τον παρακολουθήσετε:
-
Έναν διακομιστή Ubuntu 20.04. Μπορείτε να ακολουθήσετε τα βήματα 1 έως 4 αυτού του οδηγού βήμα προς βήμα για να σας βοηθήσει να ρυθμίσετε τον διακομιστή Ubuntu στο CloudSigma.
-
Βεβαιωθείτε ότι έχετε προσθέσει έναν χρήστη με προνόμια sudo και στους δύο κόμβους που θα χρησιμοποιήσουμε για την εκτέλεση των εντολών, όπως περιγράφεται στον παραπάνω οδηγό.
-
Εγκαταστήστε το Docker στον διακομιστή. Μπορείτε να ακολουθήσετε τα βήματα 1, 2 και 3 του δικού μας οδηγού για την εγκατάσταση και τη λειτουργία του Docker. Θυμηθείτε να προσθέσετε τον χρήστη sudo που δημιουργήθηκε παραπάνω στην ομάδα Docker.
-
Έναν συμβατό χώρο αποθήκευσης αντικειμένων. Το Django υποστηρίζει διάφορες υπηρεσίες αποθήκευσης, όπως αναφέρονται στα django-storages docs. Μπορείτε να επιλέξετε αυτό που προτιμάτε και να ακολουθήσετε τα έγγραφα τεκμηρίωσης για να το ρυθμίσετε. Για αυτόν τον οδηγό, θα χρησιμοποιήσουμε το MinIO το οποίο είναι μια υπηρεσία αποθήκευσης cloud συμβατή με S3.
-
Μια παρουσία βάσης δεδομένων SQL. Το Django υποστηρίζει διάφορες βάσεις δεδομένων SQL τις οποίες είστε ελεύθεροι να επιλέξετε. Για αυτόν τον οδηγό, θα χρησιμοποιήσουμε την PostgreSQL. Η βάση δεδομένων PostgreSQL δεν θα εγκατασταθεί μέσα σε container. Θα ρυθμίσουμε έναν ξεχωριστό διακομιστή Ubuntu για να φιλοξενήσει την παρουσία της PostgreSQL, ώστε να διασφαλίσουμε ότι θα επιτύχουμε τη ρύθμιση πολλαπλών containers καθώς και τη διατήρηση των δεδομένων. Μπορείτε να δημιουργήσετε μια άλλη παρουσία Ubuntu 20.04 και να ακολουθήσετε αυτόν τον οδηγό για να Ρυθμίσετε μια παρουσία βάσης δεδομένων PostgreSQL στο Ubuntu. Θυμηθείτε να προσθέσετε έναν ρόλο στη βάση δεδομένων PostgreSQL για τον χρήστη sudo, όπως εξηγείται στα Βήματα 2 και 3. Αυτός ο ρόλος θα σας επιτρέψει να συνδεθείτε στη Βάση Δεδομένων από τους άλλους διακομιστές που φιλοξενούν τα containers σας.
Σύμφωνα με αυτά τα προαπαιτούμενα, θα πρέπει να έχετε δύο παρουσίες διακομιστή Ubuntu. Η μία παρουσία θα εκτελεί το Docker container σας και η άλλη παρουσία θα εκτελεί την παρουσία της PostgreSQL. Ας ξεκινήσουμε!
Βήμα 1: Διαμόρφωση της παρουσίας της βάσης δεδομένων PostgreSQL
Σε αυτήν την ενότητα, θα τροποποιήσουμε τις ρυθμίσεις του Postgres στον Ubuntu server που εκτελεί το στιγμιότυπο Postgres. Αυτό θα επιτρέψει συνδέσεις από μια εξωτερική διεύθυνση IP. Μόλις συνδεθεί, μπορούμε να δημιουργήσουμε μια βάση δεδομένων και έναν ρόλο χρήστη, ειδικά για την εφαρμογή Django Polls που αναπτύσσουμε.
Αρχικά, εάν είχατε ρυθμίσει το περιβάλλον σας σύμφωνα με τις Προϋποθέσεις, θα πρέπει να έχετε έναν ρόλο στη PostgreSQL βάση δεδομένων σας για τον sudo χρήστη σας. Στη συνέχεια, πρέπει να ορίσουμε έναν κωδικό πρόσβασης για αυτόν τον ρόλο. Ενώ βρίσκεστε στον διακομιστή που εκτελεί την PostgreSQL, συνδεθείτε στο τερματικό του Postgres με την ακόλουθη εντολή:
|
1 |
sudo -u postgres psql |
Μόλις βρεθείτε στο τερματικό του Postgres, εκτελέστε την εντολή \password για να αλλάξετε τον κωδικό πρόσβασης ενός χρήστη. Η σύνταξη για την εντολή \password είναι \password <username>. Για τη δική μας περίπτωση, η εντολή:
|
1 |
\password cloudsigma |
Εισαγάγετε τον κωδικό πρόσβασης και επιβεβαιώστε τον. Αποθηκεύστε αυτόν τον κωδικό πρόσβασης σε ένα ασφαλές μέρος, καθώς θα τον χρησιμοποιήσετε για να συνδεθείτε από τον άλλο Ubuntu server αργότερα. Μετά από αυτό, πληκτρολογήστε exit και πατήστε Enter για να βγείτε από το τερματικό του Postgres.
Εάν είχατε ενεργοποιήσει το τείχος προστασίας (ufw) στο στιγμιότυπο του PostgreSQL server, θα πρέπει να επιτρέψετε την κυκλοφορία στην προεπιλεγμένη θύρα του Postgres 5432. Μπορείτε να περιορίσετε την κυκλοφορία ώστε να προέρχεται μόνο από μια συγκεκριμένη διεύθυνση IP του άλλου Ubuntu server σας που θα εκτελεί το Docker container. Εκτελέστε την ακόλουθη εντολή για να προσθέσετε τον κανόνα ufw, αντικαθιστώντας τη διεύθυνση IP σας εκεί που επισημαίνεται:
|
1 |
sudo ufw allow from ubuntu_server_ip_address to any port 5432 |
Αυτό θα διασφαλίσει ότι μόνο ο δικός σας διακομιστής μπορεί να συνδεθεί στο στιγμιότυπο PostgreSQL. Αν και αυτό επιτρέπει την κυκλοφορία μέσω του τείχους προστασίας, πρέπει επίσης να τροποποιήσετε τα αρχεία ρυθμίσεων της PostgreSQL για να επιτρέψετε τη σύνδεση από την απομακρυσμένη διεύθυνση IP. Από προεπιλογή, η ρύθμιση επιτρέπει τη σύνδεση μόνο από το localhost. Τα αρχεία ρυθμίσεων για την PostgreSQL βρίσκονται στον κατάλογο /etc/postgresql/12/main κατάλογο. 12, σε αυτήν την περίπτωση, είναι η έκδοση της PostgreSQL που εγκαταστήσαμε για αυτό το σεμινάριο. Ενδέχεται να έχετε εγκαταστήσει μια διαφορετική έκδοση. Επομένως, μπορείτε να μεταβείτε στον κατάλογο /etc/postgresql/ και να εμφανίσετε τα περιεχόμενα για να βρείτε τον αριθμό έκδοσης της PostgreSQL που εγκαταστήσατε.
Χρησιμοποιήστε το nano για να τροποποιήσετε το αρχείο ρυθμίσεων:
|
1 |
sudo nano /etc/postgresql/12/main/postgresql.conf |
Βρείτε την παρακάτω γραμμή, αφαιρέστε το σχόλιο (uncomment) και ορίστε την ώστε να επιτρέπει συνδέσεις από όλες τις IP:
|
1 |
listen_addresses = '*' |
Αποθηκεύστε και κλείστε το αρχείο. Στη συνέχεια, πρέπει να επεξεργαστείτε και το αρχείο pg_hba.conf επίσης, βρίσκεται στον ίδιο κατάλογο με το postgresql.conf. Το pg_hba.conf σας επιτρέπει να ορίσετε από ποιους υπολογιστές μπορείτε να συνδεθείτε στο στιγμιότυπο PostgreSQL καθώς και τη μέθοδο ελέγχου ταυτότητας. Ανοίξτε το αρχείο με το nano:
|
1 |
sudo nano /etc/postgresql/12/main/pg_hba.conf |
Παρακαλούμε διαβάστε τα σχόλια σε αυτό το αρχείο για να κατανοήσετε τις λέξεις-κλειδιά. Η ενότητα που ψάχνουμε είναι αυτή:

Θα εστιάσουμε στη δεύτερη γραμμή, θέλετε να μοιάζει με την παρακάτω γραμμή αφού αφαιρέσετε το σχόλιο:
|
1 |
host all all your_ubuntu_server_ip/24 md5 |
Παρακαλούμε αντικαταστήστε το επισημασμένο μέρος με τη διεύθυνση IP του δικού σας Ubuntu server για να του επιτρέψετε να συνδεθεί στο στιγμιότυπο PostgreSQL. Αποθηκεύστε το αρχείο μόλις είστε έτοιμοι. Επανεκκινήστε τη βάση δεδομένων PostgreSQL για να εφαρμοστούν οι αλλαγές:
|
1 |
sudo service postgresql restart |
Ο άλλος Ubuntu server μας με την καθορισμένη διεύθυνση IP θα πρέπει να μπορεί να συνδεθεί στο στιγμιότυπο Postgres.
Βήμα 2: Σύνδεση στο Στιγμιότυπο του PostgreSQL Server και Δημιουργία Βάσης Δεδομένων και Χρήστη
Σε αυτό το βήμα, θα προσπαθήσουμε να διασφαλίσουμε ότι το στιγμιότυπο Ubuntu που εξυπηρετεί το Docker container μας μπορεί να συνδεθεί στον άλλο διακομιστή που εκτελεί το στιγμιότυπο PostgreSQL. Συνδεθείτε στο στιγμιότυπο Ubuntu που διαθέτει Docker και εγκαταστήστε το πακέτο postgresql-client μέσα στο μηχάνημα υποδοχής Ubuntu (όχι ακόμα μέσα στο container).
Ως συνήθως, πρώτα ενημερώστε το πακέτο apt και στη συνέχεια εγκαταστήστε το πακέτο με τις ακόλουθες εντολές:
|
1 |
sudo apt update |
|
1 |
sudo apt install postgresql-client |
Το πακέτο που εγκαταστάθηκε παραπάνω θα σας βοηθήσει να δημιουργήσετε μια βάση δεδομένων και έναν χρήστη για την εφαρμογή σας. Στη συνέχεια, πρέπει να συνδεθούμε στο στιγμιότυπο PostgreSQL εκδίδοντας παραμέτρους σύνδεσης στον πελάτη Postgresql.
Οι παράμετροι σύνδεσης ακολουθούν αυτή τη σύνταξη:
|
1 |
psql -U username -h host -p port -d database --set=sslmode=require |
Σε αυτήν την εντολή, το username είναι ο χρήστης/ρόλος που προσθέσατε στη βάση δεδομένων PostgreSQL σας. host είναι η διεύθυνση IP του στιγμιοτύπου Ubuntu που εκτελεί τη βάση δεδομένων PostgreSQL σας. port είναι η προεπιλεγμένη θύρα στην οποία η Postgres ακούει για εισερχόμενες συνδέσεις, δηλ. 5432. Στη θέση του database, θα χρησιμοποιήσουμε την προεπιλεγμένη βάση δεδομένων που ονομάζεται postgres που συνοδεύει την εγκατάσταση της PostgreSQL. Αντικαταστήστε τις τιμές σας στα επισημασμένα μέρη κατάλληλα και πατήστε Enter. Όταν σας ζητηθεί, εισαγάγετε τον κωδικό πρόσβασης που είχατε ορίσει. Αυτό σας συνδέει στη γραμμή εντολών της Postgres όπου μπορείτε να διαχειριστείτε τη βάση δεδομένων.
Συνδεθήκατε με επιτυχία στο στιγμιότυπο PostgreSQL. Μπορείτε τώρα να δημιουργήσετε μια βάση δεδομένων για την εφαρμογή δημοσκοπήσεων Django. Ας την ονομάσουμε django_polls:
|
1 |
CREATE DATABASE django_polls; |
Βεβαιωθείτε ότι η δήλωσή σας τελειώνει με ερωτηματικό (semicolon) για να αποφύγετε σφάλματα. Στη συνέχεια, μεταβείτε στη βάση δεδομένων django_polls με την εντολή:
|
1 |
\c django_polls; |
Στη συνέχεια, δημιουργήστε έναν χρήστη βάσης δεδομένων ειδικά για αυτό το έργο. Ας ονομάσουμε τον χρήστη django_user:
|
1 |
CREATE USER django_user WITH PASSWORD 'password'; |
Επιλέξτε έναν ασφαλή κωδικό πρόσβασης για τον χρήστη σας. Μόλις τελειώσετε, πρέπει να τροποποιήσουμε τις παραμέτρους σύνδεσης για τον χρήστη που μόλις δημιουργήσαμε. Αυτό βοηθά στην επιτάχυνση των λειτουργιών της βάσης δεδομένων, διασφαλίζοντας ότι οι σωστές τιμές δεν αναζητούνται και δεν ορίζονται κάθε φορά που δημιουργείται μια σύνδεση.
Ορίστε την προεπιλεγμένη κωδικοποίηση που αναμένει το Django ως UTF-8:
|
1 |
ALTER ROLE django_user SET client_encoding TO 'utf8'; |
Στη συνέχεια, ορίστε το προεπιλεγμένο σχήμα απομόνωσης συναλλαγών σε “ read committed”, το οποίο εμποδίζει τις αναγνώσεις από μη ολοκληρωμένες συναλλαγές:
|
1 |
ALTER ROLE django_user SET default_transaction_isolation TO 'read committed'; |
Ορίστε τη ζώνη ώρας σας. Για να διατηρήσουμε το σεμινάριο καθολικό, θα χρησιμοποιήσουμε το UTC:
|
1 |
ALTER ROLE django_user SET timezone TO 'UTC'; |
Τέλος, παραχωρήστε δικαιώματα διαχειριστή της βάσης δεδομένων στον νέο χρήστη:
|
1 |
GRANT ALL PRIVILEGES ON DATABASE django_polls TO django_user; |
Έξοδος από τη γραμμή εντολών της PostgreSQL όταν είστε έτοιμοι:
|
1 |
\q |
Αυτά είναι όλα για αυτό το βήμα. Μόλις ρυθμίσετε σωστά την εφαρμογή Django, θα πρέπει να μπορεί να διαχειρίζεται τη βάση δεδομένων σας.
Βήμα 3: Λήψη της εφαρμογής από ένα αποθετήριο Git και καθορισμός εξαρτήσεων
Σε αυτό το βήμα, θα κλωνοποιήσουμε το αποθετήριο της εφαρμογής Django-polls . Αυτό το αποθετήριο περιέχει τον κώδικα για το Django σεμινάριο συγγραφής της πρώτης σας εφαρμογής Django.
Συνδεθείτε στον διακομιστή Ubuntu που εκτελεί το Docker, δημιουργήστε έναν κατάλογο που ονομάζεται django_project και πλοηγηθείτε σε αυτόν:
|
1 2 |
mkdir django_project cd django_project |
Στη συνέχεια, κλωνοποιήστε το αποθετήριο στον κατάλογο με την ακόλουθη εντολή:
|
1 |
git clone https://github.com/jaymoh/django-polls.git |
Πλοηγηθείτε στον κατάλογο και εμφανίστε τα περιεχόμενα:
|
1 |
cd django-polls |
Εμφανίστε τα περιεχόμενα του καταλόγου:
|
1 |
ls |

Παρατηρήστε τα ακόλουθα στοιχεία:
-
manage.py: αυτό το αρχείο είναι η είσοδος στο βοηθητικό πρόγραμμα γραμμής εντολών που παρέχει το Django για τη διαχείριση της εφαρμογής σας.
-
mysite: ένας κατάλογος με το εύρος του έργου Django και τις ρυθμίσεις κώδικα.
-
polls: ένας κατάλογος που περιέχει τον polls κώδικα της εφαρμογής.
-
templates: περιέχει προσαρμοσμένα αρχεία προτύπων για τις σελίδες διαχειριστή.
Για να μάθετε περισσότερα σχετικά με το πώς δημιουργήσαμε πραγματικά το έργο, ρίξτε μια ματιά στο Writing your first Django app από τα επίσημα έγγραφα. Μέσα στο django-polls κατάλογο, θέλουμε να έχουμε τις εξαρτήσεις Python μας ορισμένες σε ένα αρχείο κειμένου. Θα το ονομάσουμε requirements.txt. Ανοίξτε το αρχείο με τον επεξεργαστή της προτίμησής σας:
|
1 |
nano requirements.txt |
Επικολλήστε τις ακόλουθες γραμμές μέσα στο αρχείο για να δηλώσετε τις εξαρτήσεις:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Django==3.2.9 gunicorn==20.1.0 docutils==0.18.1 sqlparse==0.4.2 jmespath==0.10.0 psycopg2==2.9.2 python-dateutil==2.8.2 pytz==2021.3 six==1.16.0 urllib3==1.26.7 django-storages==1.12.2 minio==7.1.6 django-minio-backend==3.3.2 django-dotenv==1.4.2 boto3==1.21.38 |
Σε αυτό το αρχείο, έχουμε ορίσει τις εξαρτήσεις Python με τις ακριβείς εκδόσεις τους που πρέπει να εγκατασταθούν κατά τη δημιουργία της εφαρμογής. Ορισμένες από αυτές περιλαμβάνουν το Django, django-storages για την αλληλεπίδραση με bucket αποθήκευσης αντικειμένων, τον προσαρμογέα psycopg2 για την PostgreSQL, τον διακομιστή WSGI gunicorn και άλλες πρόσθετες εξαρτήσεις. Αποθηκεύστε και κλείστε το αρχείο όταν τελειώσετε.
Βήμα 4: Διαμόρφωση μεταβλητών περιβάλλοντος για μια εφαρμογή Django
Η μεθοδολογία twelve-factor app συνιστά να εξάγετε τις σκληρά κωδικοποιημένες ρυθμίσεις από τη βάση κώδικα της εφαρμογής σας. Με αυτόν τον τρόπο, έχετε την ελευθερία να αλλάξετε τη συμπεριφορά της εφαρμογής κατά τον χρόνο εκτέλεσης τροποποιώντας τις μεταβλητές περιβάλλοντος χωρίς να αγγίξετε τη βάση κώδικα. Το Docker λειτουργεί με αυτήν τη ρύθμιση, επομένως θα τροποποιήσουμε το αρχείο ρυθμίσεων για να λειτουργεί με μεταβλητές περιβάλλοντος. Kubernetes λειτουργεί επίσης με αυτήν τη ρύθμιση παραμέτρων. Θα μοιραστούμε έναν άλλο οδηγό για την ανάπτυξη με το Kubernetes στο CloudSigma blog.
Το αρχείο settings.py είναι το κύριο αρχείο ρυθμίσεων για ένα έργο Django. Είναι ένα άρθρωμα Python που χρησιμοποιεί εγγενείς δομές δεδομένων για τη διαμόρφωση της εφαρμογής. Για την εφαρμογή μας, το αρχείο βρίσκεται στη θέση django-polls/mysite/settings.py. Οι περισσότερες από τις τιμές του είναι σκληρά κωδικοποιημένες. Αυτό θα απαιτούσε να τροποποιήσετε το αρχείο ρυθμίσεων στη βάση κώδικα εάν αλλάξετε τη συμπεριφορά της εφαρμογής. Θέλουμε να το αλλάξουμε αυτό. Ευτυχώς, η Python προσφέρει τη συνάρτηση getenv στο άρθρωμα os. Μπορούμε να το χρησιμοποιήσουμε για να ρυθμίσουμε το Django να διαβάζει παραμέτρους διαμόρφωσης από τοπικές μεταβλητές περιβάλλοντος αντ' αυτού.
Ας συνεχίσουμε τροποποιώντας το αρχείο django-polls/mysite/settings.py για να αντικαταστήσουμε τις σκληρά κωδικοποιημένες τιμές των μεταβλητών. Ίσως θέλουμε να τις ενημερώσουμε κατά τον χρόνο εκτέλεσης με μια κλήση στη os.getenv. Αυτή η συνάρτηση διαβάζει την τιμή που έχει οριστεί στο παρεχόμενο όνομα μεταβλητής περιβάλλοντος. Προαιρετικά, μπορείτε να παρέχετε μια δεύτερη παράμετρο που είναι μια προεπιλεγμένη τιμή η οποία θα χρησιμοποιηθεί εάν η μεταβλητή περιβάλλοντος δεν έχει οριστεί.
Εδώ είναι ένα παράδειγμα:
|
1 |
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') |
Στην παραπάνω γραμμή, λέμε στο Django να ανακτήσει το μυστικό κλειδί από τη μεταβλητή περιβάλλοντος. Δεν παρέχουμε μια εναλλακτική τιμή καθώς θα παρέχουμε το κλειδί εξωτερικά. Εάν δεν υπάρχει, η εφαρμογή δεν θα πρέπει να ξεκινήσει. Ενώ παρέχουμε το μυστικό κλειδί εξωτερικά, θέλουμε επίσης να διασφαλίσουμε ότι όλα τα κοντεϊνοποιημένα αντίγραφα της εφαρμογής μας χρησιμοποιούν το ίδιο κλειδί στους διάφορους διακομιστές. Αυτό αποφεύγει πιθανά προβλήματα που προκύπτουν όταν τα διάφορα αντίγραφα της εφαρμογής χρησιμοποιούν διαφορετικά κλειδιά.
Εδώ είναι ένα άλλο παράδειγμα με μια προεπιλεγμένη επιλογή:
|
1 |
DEBUG = os.getenv('DEBUG', False) |
Σε αυτήν τη γραμμή, ορίζουμε μια μεταβλητή περιβάλλοντος DEBUG που πρέπει να διαβαστεί. Ωστόσο, εάν δεν έχει οριστεί, έχουμε παράσχει μια δεύτερη παράμετρο που θα μεταβιβαστεί στη μεταβλητή ρυθμίσεων DEBUG . Η μεταβλητή DEBUG ορίζεται σε False για να διασφαλιστεί ότι ευαίσθητες πληροφορίες δεν θα μεταβιβαστούν στο frontend σε περίπτωση που υπάρχει πρόβλημα με την εφαρμογή. Ωστόσο, εάν βρισκόμαστε σε λειτουργία ανάπτυξης, θέλουμε να οριστεί σε True για να μας επιτρέψει να δούμε τις πληροφορίες σφάλματος ώστε να μας είναι πιο εύκολο να διορθώσουμε τα σφάλματα.
Τώρα που γνωρίζετε τη σημασία των μεταβλητών περιβάλλοντος, ανοίξτε το αρχείο django_project/django-polls/settings.py στον επεξεργαστή σας. Αρχικά, εισαγάετε το άρθρωμα os προσθέτοντας αυτήν τη γραμμή στο επάνω μέρος του αρχείου settings.py file:
|
1 |
import os |
Στη συνέχεια, βρείτε αυτές τις μεταβλητές και ενημερώστε τις ως εξής:
|
1 2 3 |
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') DEBUG = os.getenv('DEBUG', False) ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') |
Στη ALLOWED_HOSTS ρύθμιση, καθορίζουμε ότι θα πρέπει να λάβει την τιμή από τη DJANGO_ALLOWED_HOSTS μεταβλητή περιβάλλοντος, και να τη διαχωρίσει σε μια λίστα Python χρησιμοποιώντας το κόμμα ( ,) ως διαχωριστικό. Εάν η μεταβλητή λείπει, ALLOWED_HOSTS ορίζεται σε 127.0.0.1.
Στη συνέχεια, μετακινηθείτε στο αρχείο και βρείτε την DATABASES ενότητα, διαμορφώστε την ώστε να διαβάζει επίσης από μεταβλητές περιβάλλοντος:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.{}'.format( os.getenv('DB_ENGINE', 'sqlite3') ), 'NAME': os.getenv('DB_DATABASE', 'django_polls'), 'USER': os.getenv('DB_USERNAME', 'your_db_username'), 'PASSWORD': os.getenv('DB_PASSWORD', 'your_secure_default_password'), 'HOST': os.getenv('DB_HOST', '127.0.0.1'), 'PORT': os.getenv('DB_PORT', 5432), 'OPTIONS': json.loads( os.getenv('DB_OPTIONS', '{}') ), } } |
Παρατηρήστε ότι έχουμε προσθέσει το json.loads module. Θα πρέπει επίσης να προσθέσετε μια εισαγωγή του module στο επάνω μέρος του settings.py αρχείου:
|
1 |
import json |
Η json.loads συνάρτηση αποσειριοποιεί ένα αντικείμενο JSON που μεταβιβάζεται στο DATABASES['default']['OPTIONS'] από τη DB_OPTIONS μεταβλητή περιβάλλοντος. Ο καθορισμός αυτής της επιλογής μάς επιτρέπει να μεταβιβάσουμε μια αυθαίρετη δομή δεδομένων για να ορίσουμε τη διαμόρφωση της βάσης δεδομένων. Μια μηχανή βάσης δεδομένων περιλαμβάνει ένα σύνολο έγκυρων επιλογών που εφαρμόζονται σε αυτήν. Η επιλογή JSON μάς δίνει την ευελιξία να κωδικοποιήσουμε ένα αντικείμενο JSON με τις κατάλληλες παραμέτρους για τη μηχανή βάσης δεδομένων που χρησιμοποιούμε εκείνη τη στιγμή.
Το DATABASES['default']['NAME'] καθορίζει το όνομα της βάσης δεδομένων στο σύστημα διαχείρισης σχεσιακών βάσεων δεδομένων που έχουμε δημιουργήσει. Στην περίπτωση χρήσης μιας βάσης δεδομένων SQLite, θα πρέπει να καθορίσετε τη διαδρομή προς το αρχείο της βάσης δεδομένων.
Σημειώστε ότι η Python προσφέρει διάφορες μεθόδους για να διαβάσετε εξωτερικές μεταβλητές περιβάλλοντος. Έχουμε χρησιμοποιήσει μόνο μία από αυτές. Είστε ελεύθεροι να ερευνήσετε και να χρησιμοποιήσετε άλλες μεθόδους. Σε αυτό το βήμα, μάθατε πώς να εργάζεστε με εξωτερικές μεταβλητές περιβάλλοντος. Αυτό σας δίνει την ευελιξία να αλλάζετε τις μεταβλητές και να τροποποιείτε τη συμπεριφορά της εφαρμογής που εκτελείται σε κοντέινερ. Στο επόμενο βήμα, θα μάθετε πώς να εργάζεστε με υπηρεσίες αποθήκευσης αντικειμένων.
Βήμα 5: Εργασία με εξωτερικές υπηρεσίες αποθήκευσης αντικειμένων
Ένα σημαντικό πλεονέκτημα της δημιουργίας κοντέινερ (containerization) για την εφαρμογή σας είναι ότι την καθιστά φορητή για εύκολη ανάπτυξη πολλαπλών αντιγράφων της εφαρμογής όταν αυξάνεται η κίνηση. Συνεπώς, δίνει περιθώρια για κλιμάκωση (scaling). Ωστόσο, αυτό δημιουργεί το ζήτημα της διατήρησης εκδόσεων στατικών αρχείων και στοιχείων σε διάφορα κοντέινερ. Χάρη στις βελτιώσεις στην τεχνολογία cloud, μπορείτε να μεταφέρετε αυτά τα κοινόχρηστα στατικά στοιχεία σε εξωτερικό χώρο αποθήκευσης. Στη συνέχεια, μπορείτε να κάνετε τα αρχεία προσβάσιμα μέσω δικτύου σε όλα τα κοντέινερ που εκτελούνται. Αντί να προσπαθείτε να συγχρονίσετε τα αρχεία στα διάφορα κοντέινερ που εκτελούνται, έχετε ένα κεντρικό σημείο για τη διαχείρισή τους.
Η έννοια που προσπαθούμε να εξηγήσουμε παραπάνω είναι η χρήση υπηρεσιών αποθήκευσης αντικειμένων cloud, ή Simple Storage Services (S3). Το Django διαθέτει ένα πακέτο που ονομάζεται django-storages που σας επιτρέπει να εργάζεστε με απομακρυσμένα backends αποθήκευσης. Django-storages λειτουργούν με τις περισσότερες υπηρεσίες αποθήκευσης αντικειμένων συμβατών με S3, όπως FTP, SFTP, AWS S3 της Amazon, Google Cloud Storage, Dropbox και Azure Storage, μεταξύ άλλων. Σε αυτόν τον οδηγό, θα χρησιμοποιήσουμε το MinIO. Μη διστάσετε να χρησιμοποιήσετε οποιαδήποτε άλλη υπηρεσία αποθήκευσης αντικειμένων συμβατή με S3. MinIO προσφέρει υψηλής απόδοσης αποθήκευση αντικειμένων συμβατή με S3. Με το MinIO, μπορείτε να δημιουργήσετε υποδομή δεδομένων συμβατή με S3 σε οποιοδήποτε cloud.
Θα σας δείξουμε πώς να ρυθμίσετε μια υπηρεσία αποθήκευσης MinIO στην πλατφόρμα CloudSigma. Παρακαλούμε ακολουθήστε τα εξής βήματα:
-
Ξεκινήστε δημιουργώντας έναν λογαριασμό στο CloudSigma. Εάν αντιμετωπίσετε προβλήματα κατά τη δημιουργία του χώρου αποθήκευσης MinIO, επικοινωνήστε με την δωρεάν ζωντανή υποστήριξη συνομιλίας 24/7 της CloudSigma, και θα σας βοηθήσουν.
-
Προσθέστε τα στοιχεία χρέωσής σας.
-
Στη συνέχεια, ζητήστε το δημόσια προσβάσιμο bucket σας από εδώ: https://blog.cloudsigma.com/xxxx. Θα χρειαστεί να επικοινωνήσετε με την υποστήριξη Live Chat για να λάβετε τα διαπιστευτήρια πρόσβασης του λογαριασμού σας.
-
Μόλις δημιουργηθεί το περιβάλλον αποθήκευσης αντικειμένων MinIO, θα σας παρασχεθούν διαπιστευτήρια πρόσβασης και άλλες οδηγίες για την πρόσβαση σε αυτό. Τα διαπιστευτήρια θα πρέπει να περιλαμβάνουν το δικό σας MINI_ACCESS_KEY, MINIO_SECRET_KEY, και MINIO_URL. Θα χρησιμοποιήσετε αυτά τα κλειδιά στις παρακάτω οδηγίες.
Ας κάνουμε μερικές ακόμη αλλαγές στο αρχείο mysite/settings.py που τροποποιήσαμε στο προηγούμενο βήμα. Στο αρχείο, προσθέστε την εφαρμογή storages στη λίστα INSTALLED_APPS:

Η εφαρμογή storages εγκαθίσταται μέσω του django-storages όπως ορίζεται στο requirements.txt. Μεταβείτε στο κάτω μέρος του αρχείου και αντικαταστήστε τη μεταβλητή STATIC_URL με το ακόλουθο απόσπασμα κώδικα:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Στατικά αρχεία (CSS, JavaScript, Εικόνες) # https://docs.djangoproject.com/en/3.2/howto/static-files/ DEFAULT_FILE_STORAGE = os.getenv('STATIC_DEFAULT_FILE_STORAGE', 'storages.backends.s3boto3.S3Boto3Storage') AWS_S3_ENDPOINT_URL = os.getenv('MINIO_URL') AWS_ACCESS_KEY_ID = os.getenv('MINIO_ACCESS_KEY') AWS_SECRET_ACCESS_KEY = os.getenv('MINIO_SECRET_KEY') AWS_STORAGE_BUCKET_NAME = os.getenv('STATIC_MINIO_BUCKET_NAME') AWS_S3_OBJECT_PARAMETERS = { 'CacheControl': 'max-age=86400', } AWS_LOCATION = 'static' AWS_DEFAULT_ACL = 'public-read' STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' STATIC_URL = '{}/{}/'.format(AWS_S3_ENDPOINT_URL, AWS_LOCATION) STATIC_ROOT = "static/" |
Παρατηρήστε ότι ορισμένες από τις μεταβλητές διαμόρφωσης είναι hard-coded:
-
STATICFILES_STORAGE: ορίζει το backend αποθήκευσης που θα χρησιμοποιήσει το Django για τη διαχείριση στατικών αρχείων. Στον οδηγό μας, χρησιμοποιούμε αποθήκευση MinIO, αλλά μπορείτε να χρησιμοποιήσετε οποιοδήποτε συμβατό με S3 backend, όπως εξηγείται στα έγγραφα του Django Storages.
-
AWS_S3_OBJECT_PARAMETERS: ορίζει τις κεφαλίδες cache-control.
-
AWS_LOCATION: το χρησιμοποιούμε αυτό για να ορίσουμε έναν κατάλογο μέσα στο bucket αποθήκευσης όπου θα αποθηκεύονται όλα τα στατικά αρχεία. Είστε ελεύθεροι να επιλέξετε ένα διαφορετικό όνομα.
-
AWS_DEFAULT_ACL: ορίζει τη λίστα ελέγχου πρόσβασης (ACL) για στατικά αρχεία. Ορίζοντας την τιμή σε ‘ public-Read’ θα καταστήσει τα αρχεία προσβάσιμα σε όλους τους δημόσιους χρήστες.
-
STATIC_URL: Το Django χρησιμοποιεί τη βασική διεύθυνση URL που έχει οριστεί σε αυτήν τη μεταβλητή για τη δημιουργία διευθύνσεων URL για στατικά αρχεία. Η βασική διεύθυνση URL σε αυτήν την περίπτωση προκύπτει από τον συνδυασμό της διεύθυνσης URL του τελικού σημείου και του υποκαταλόγου στατικών αρχείων.
-
STATIC_ROOT: ορίζει πού θα συλλέγονται τοπικά τα στατικά αρχεία πριν αντιγραφούν στο απομακρυσμένο σύστημα αποθήκευσης αντικειμένων.
Έχουμε επίσης ορισμένες εξωτερικά ορισμένες μεταβλητές περιβάλλοντος για να διατηρήσουμε την ευελιξία και τη φορητότητα:
-
AWS_STORAGE_BUCKET_NAME: ορίζει το όνομα του storage bucket στο οποίο το Django θα ανεβάσει τα assets.
-
AWS_S3_ENDPOINT_URL: ορίζει το endpoint URL που χρησιμοποιείται για την πρόσβαση στην υπηρεσία αποθήκευσης αντικειμένων. Αυτό θα είναι το URL που αντιστοιχίζεται στον διακομιστή που φιλοξενεί την υπηρεσία MinIO σας.
Αποθηκεύστε και κλείστε το αρχείο όταν ολοκληρώσετε την επεξεργασία.
Μόλις εφαρμόσετε αυτές τις ρυθμίσεις και εγκαταστήσετε τις δηλωμένες εξαρτήσεις Python, μπορείτε να εκτελέσετε την εντολή Django manage.py collectstatic ανά πάσα στιγμή για να συγκεντρώσετε τα στατικά αρχεία του έργου σας και να τα ανεβάσετε στο απομακρυσμένο backend αποθήκευσης αντικειμένων:
|
1 |
python manage.py collectstatic |
Ωστόσο, δεν έχουμε ρυθμίσει ακόμα το env αρχείο με τις ρυθμίσεις, οπότε πιθανότατα θα αποτύχει.
Όταν εκτελείτε την εντολή, χρειάζεται λίγος χρόνος για να αντιγραφούν τα assets σας στο MinIO Cloud Storage, ανάλογα με το μέγεθός τους και την ταχύτητα του διαδικτύου σας.
Αυτά είναι όλα για αυτό το βήμα. Ας δούμε πώς μπορούμε να χειριστούμε την προώθηση των logs του Django στο Docker Engine, ώστε να μπορείτε να τα δείτε χρησιμοποιώντας την εντολή docker logs στο επόμενο βήμα.
Βήμα 6: Ρύθμιση της καταγραφής (Logging) σε μια εφαρμογή Django
Κατά τη λειτουργία Debug, όταν η επιλογή DEBUG έχει οριστεί σε True, το Django καταγράφει πληροφορίες στην τυπική έξοδο (standard output) και στο τυπικό σφάλμα (standard error). Οι πληροφορίες καταγραφής εμφανίζονται συνήθως στο τερματικό από το οποίο εκκινήσατε τον διακομιστή ανάπτυξης HTTP.
Σε περιβάλλον παραγωγής, πιθανότατα χρησιμοποιείτε διαφορετικό διακομιστή HTTP και η επιλογή DEBUG έχει οριστεί σε False. Το Django θα χρησιμοποιήσει μια διαφορετική μέθοδο καταγραφής σε αυτήν την περίπτωση. Το Django στέλνει logs προτεραιότητας ERROR ή CRITICAL σε έναν λογαριασμό email διαχειριστή που ορίζετε εσείς. Αυτό λειτουργεί εξαιρετικά για πολλές περιπτώσεις.
Σε περιβάλλοντα με containers και Kubernetes, συνιστάται ιδιαίτερα η καταγραφή στην τυπική έξοδο και στο τυπικό σφάλμα. Τα μηνύματα καταγραφής συλλέγονται σε έναν ενιαίο κατάλογο στο σύστημα αρχείων του Node και είναι εύκολα προσβάσιμα χρησιμοποιώντας τις εντολές kubectl και docker . Με ένα κεντρικό σημείο καταγραφής στο σύστημα αρχείων του Node, η ομάδα λειτουργιών μπορεί εύκολα να εκτελέσει διεργασίες σε κάθε node για την παρακολούθηση και την προώθηση των logs. Επομένως, πρέπει να ρυθμίσουμε την εφαρμογή μας ώστε να γράφει logs σε αυτήν την τυπική δομή.
Θα χαρείτε να μάθετε ότι το Django αξιοποιεί το εξαιρετικά προσαρμόσιμο module logging από την τυπική βιβλιοθήκη της Python. Αυτό σας επιτρέπει να ορίσετε ένα λεξικό που περνά μέσα από το logging.config.dictConfig για να ορίσετε τις επιθυμητές εξόδους και τη μορφοποίηση. Εδώ είναι ένα ωραίο άρθρο σχετικά με το Django Logging, The Right Way που μπορεί να σας βοηθήσει να κατακτήσετε τις τεχνικές καταγραφής στο Django.
Ανοίξτε το αρχείο django-polls/mysite/settings.py στον επεξεργαστή σας. Προσθέστε μια εισαγωγή για τη βιβλιοθήκη της Python logging.config στο επάνω μέρος του αρχείου:
|
1 |
import logging.config |
Μέχρι στιγμής, με όλες τις εισαγωγές που έχουμε προσθέσει, η ενότητα των εισαγωγών σας στο settings.py θα πρέπει να μοιάζει κάπως έτσι:

Η βιβλιοθήκη logging.config δέχεται ένα λεξικό με τις νέες ρυθμίσεις καταγραφής μέσω της συνάρτησης dictConfig για να παρακάμψει την προεπιλεγμένη συμπεριφορά καταγραφής του Django.
Μεταβείτε στο κάτω μέρος του αρχείου και προσθέστε το ακόλουθο απόσπασμα κώδικα για τη ρύθμιση της καταγραφής:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# Ρύθμιση Καταγραφής # Απενεργοποίηση προηγούμενης ρύθμισης LOGGING_CONFIG = None # Λήψη loglevel από το περιβάλλον LOGLEVEL = os.getenv('DJANGO_LOGLEVEL', 'info').upper() logging.config.dictConfig({ 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'console': { 'format': '%(asctime)s %(levelname)s [%(name)s:%(lineno)s] %(module)s %(process)d %(thread)d %(message)s', }, }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'console', }, }, 'loggers': { '': { 'level': LOGLEVEL, 'handlers': ['console',], }, }, }) |
LOGGING_CONFIG έχει οριστεί σε None για να απενεργοποιήσετε/καθαρίσετε τις προεπιλεγμένες ρυθμίσεις καταγραφής που ορίζει το Django. LOGLEVEL ορίζεται από τη μεταβλητή περιβάλλοντος DJANGO_LOGLEVEL . Ωστόσο, εάν δεν υπάρχει, τότε θέλουμε να οριστεί σε ‘ info’.
Το logging.config module που εισαγάγαμε στην κορυφή παρέχει μια συνάρτηση dictConfig που χρησιμοποιείται για τον ορισμό ενός νέου λεξικού ρυθμίσεων. Το λεξικό ορίζει τη μορφοποίηση κειμένου χρησιμοποιώντας το κλειδί formatters. Η έξοδος ορίζεται με το κλειδί handlers, και τέλος, το κλειδί loggers ορίζει ποιο μήνυμα πρέπει να καταλήγει σε ποιον handler.
Μόλις ορίσετε αυτές τις ρυθμίσεις, Docker θα εκθέσει τα logs μέσω της εντολής docker logs. Παρομοίως, σε έναν άλλο οδηγό που θα κάνουμε για το Kubernetes, μπορείτε να δείτε τα logs με την εντολή kubectl logs. Ας ξεκινήσουμε τώρα τη διαδικασία containerization στο επόμενο βήμα.
Βήμα 7: Ορισμός του Dockerfile της εφαρμογής
Σε αυτό το βήμα, ορίζουμε τις ρυθμίσεις για την εκκίνηση του container image που θα εκτελεί την εφαρμογή Django, η οποία εξυπηρετείται από τον WSGI διακομιστή Gunicorn. Θα ορίσουμε το περιβάλλον εκτέλεσης για τη δημιουργία ενός container image, θα εγκαταστήσουμε την εφαρμογή και τις εξαρτήσεις της και θα πραγματοποιήσουμε ορισμένες τελικές ρυθμίσεις.
-
Το γονικό είδωλο (parent image) για μια εφαρμογή Django
Η απόφαση για το είδωλο βάσης (foundation image) στο οποίο θα βασίσετε το container σας είναι η πρώτη απόφαση που θα πάρετε όταν ασχολείστε με containerized αναπτύξεις. Φυσικά, έχετε την επιλογή να δημιουργήσετε τα container images σας από το μηδέν (SCRATCH), δηλαδή από ένα άδειο σύστημα αρχείων, ή να τα βασίσετε σε ένα υπάρχον container image. Επειδή δεν θέλουμε να ανακαλύψουμε ξανά τον τροχό, θα δημιουργήσουμε το είδωλό μας από ένα είδωλο βάσης (base image). Υπάρχουν πολλά container images ανοιχτού κώδικα διαθέσιμα από το επίσημο αποθετήριο container images του Docker. Εκτός εάν δημιουργείτε το είδωλό σας από το μηδέν, συνιστάται ιδιαίτερα να χρησιμοποιήσετε ένα είδωλο από το επίσημο hub του Docker. Αυτό συμβαίνει επειδή το Docker επαληθεύει ότι τα είδωλα ακολουθούν τις βέλτιστες πρακτικές και διασφαλίζει ότι υπάρχουν τακτικές ενημερώσεις και διορθώσεις ασφαλείας.
Καθώς το Django είναι ένα πλαίσιο εργασίας (framework) της Python, θα επωφεληθούμε από ένα είδωλο με ένα τυπικό περιβάλλον Python που έχει ήδη εγκατεστημένα τα εργαλεία και τις βιβλιοθήκες που χρειαζόμαστε. Από την επίσημη σελίδα για είδωλα Python στο Docker hub, μπορείτε να βρείτε ένα είδωλο βασισμένο στην Python για διάφορες εκδόσεις της Python.
Από τους διάφορους οδηγούς μας που βασίζονται στο Docker, θα παρατηρήσετε ότι χρησιμοποιούμε είδωλα που βασίζονται στο Alpine Linux. Το Alpine Linux προσφέρει ένα ισχυρό αλλά ελαφρύ περιβάλλον λειτουργικού συστήματος για την εκτέλεση containerized εφαρμογών. Αν και το σύστημα αρχείων του είναι μικρό, είναι επεκτάσιμο και συνοδεύεται από ένα πλήρες σύστημα διαχείρισης πακέτων με δυνατότητα προσθήκης λειτουργιών.
Όταν επιλέγετε ένα είδωλο βάσης στο Docker hub, μπορεί να παρατηρήσετε πολλαπλές ετικέτες (tags) διαθέσιμες για κάθε είδωλο. Για χάρη της Python, έχουμε το 3-alpine, το οποίο δείχνει στο πιο πρόσφατο είδωλο της έκδοσης Python 3 της τελευταίας έκδοσης Alpine. Αυτό σημαίνει ότι σε περίπτωση που το έργο σας λειτουργεί με μια παλαιότερη έκδοση ειδώλου, ενδέχεται να σταματήσει να λειτουργεί όταν οι συντηρητές του ειδώλου Docker κάνουν μια ενημέρωση. Για να αποφύγετε τέτοια σενάρια στο μέλλον, συνιστάται πάντα να επιλέγετε τις πιο συγκεκριμένες ετικέτες για το είδωλο που θέλετε να χρησιμοποιήσετε.
Σε αυτόν τον οδηγό, θα χρησιμοποιήσουμε το 3.8.12-alpine3.15 εικόνα ως βασική εικόνα για την εφαρμογή Django μας. Αυτή η συγκεκριμένη ετικέτα θα καθοριστεί στο Dockerfile χρησιμοποιώντας την οδηγία FROM . Το Dockerfile θα βρίσκεται στον κύριο κατάλογο του έργου: django_project.
Ξεκινήστε μεταβαίνοντας έξω από τον κατάλογο Django-polls και επιστρέφοντας στον κατάλογο django_project :
|
1 |
cd .. |
Μόλις βρεθείτε στον κατάλογο, χρησιμοποιήστε τον αγαπημένο σας επεξεργαστή κειμένου για να ανοίξετε ένα αρχείο με όνομα Dockerfile :
|
1 |
nano Dockerfile |
Στη συνέχεια, επικολλήστε την ακόλουθη γραμμή για να ορίσετε τη βάση της εικόνας σας:
|
1 |
FROM python:3.8.12-alpine3.15 |
Η FROM ορίζει το σημείο εκκίνησης μιας προσαρμοσμένης εικόνας Docker. Έχοντας ορίσει αυτό, μπορούμε να συνεχίσουμε να προσθέτουμε οδηγίες για τη ρύθμιση των εφαρμογών. Αυτές οι οδηγίες θα εγκαταστήσουν τις απαραίτητες εξαρτήσεις, θα αντιγράψουν τα αρχεία της εφαρμογής και θα ρυθμίσουν το περιβάλλον εκτέλεσης.
Προσθέστε το ακόλουθο απόσπασμα κώδικα μέσα στο Dockerfile:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
ADD django-polls/requirements.txt /app/requirements.txt RUN set -ex \ && apk add --no-cache --virtual .build-deps postgresql-dev build-base \ && python -m venv /env \ && /env/bin/pip install --upgrade pip \ && /env/bin/pip install --no-cache-dir -r /app/requirements.txt \ && runDeps="$(scanelf --needed --nobanner --recursive /env \ | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \ | sort -u \ | xargs -r apk info --installed \ | sort -u)" \ && apk add --virtual rundeps $runDeps \ && apk del .build-deps ADD django-polls /app WORKDIR /app ENV VIRTUAL_ENV /env ENV PATH /env/bin:$PATH EXPOSE 8000 |
Σε αυτό το απόσπασμα κώδικα, λέμε στο Docker να αντιγράψει το αρχείο requirements.txt στο /app/requirements.txt για να διασφαλιστεί ότι οι εξαρτήσεις της εφαρμογής είναι διαθέσιμες στο σύστημα αρχείων της εικόνας. Οι απαιτήσεις περιλαμβάνουν όλα τα πακέτα Python που απαιτούνται για την εκτέλεση της εφαρμογής. Οι εξαρτήσεις αντιγράφονται πρώτες, ώστε το Docker να μπορεί να αποθηκεύσει προσωρινά (cache) το επίπεδο της εικόνας. Αυτό συμβαίνει επειδή το Docker αποθηκεύει προσωρινά κάθε βήμα στο Dockerfile. Η πρώτη δημιουργία της εικόνας είναι συνήθως μεγαλύτερη σε διάρκεια. Το Docker θα κατεβάσει τις εξαρτήσεις και στη συνέχεια θα τις αποθηκεύσει στην προσωρινή μνήμη. Εάν το αρχείο requirements.txt δεν αλλάξει, το Docker θα κάνει τη δημιουργία από την προσωρινή μνήμη, καθιστώντας έτσι τις επόμενες δημιουργίες ταχύτερες.
Το επόμενο βήμα περιλαμβάνει την οδηγία RUN η οποία εκτελεί μια λίστα εντολών Linux, συνδεδεμένων με τον τελεστή Linux && . Οι εντολές κάνουν τα εξής:
-
Χρήση του εργαλείου διαχείρισης πακέτων apk του Alpine για την εγκατάσταση των αρχείων ανάπτυξης PostgreSQL και των βασικών εξαρτήσεων δημιουργίας.
-
Δημιουργία ενός εικονικού περιβάλλοντος Python.
-
Εγκατάσταση των εξαρτήσεων Python όπως ορίζονται στο αρχείο requirements.txt χρησιμοποιώντας το pip.
-
Μεταγλώττιση των απαραίτητων πακέτων χρόνου εκτέλεσης αναλύοντας τις απαιτήσεις των εγκατεστημένων πακέτων Python.
-
Κατάργηση τυχόν εξαρτήσεων δημιουργίας που δεν είναι πλέον απαραίτητες.
Ο λόγος για τη σύνδεση των εντολών στο βήμα RUN είναι η μείωση των επιπέδων της εικόνας. Το Docker δημιουργεί ένα νέο επίπεδο εικόνας πάνω από το υπάρχον σύστημα αρχείων κάθε φορά που συναντά τις οδηγίες ADD, COPY, ή RUN οδηγία στο Dockerfile. Η συμπίεση των εντολών όπου είναι εφικτό θα ελαχιστοποιήσει τον αριθμό των επιπέδων εικόνας (image layers) που δημιουργούνται.
Τα στοιχεία που προστίθενται στα επίπεδα εικόνας δεν μπορούν να αφαιρεθούν σε επόμενο επίπεδο. Πρέπει να δηλώσετε οδηγίες για τη διαγραφή ανεπιθύμητων στοιχείων προτού προχωρήσετε στην επόμενη οδηγία. Αυτό είναι απαραίτητο για τη μείωση του μεγέθους της εικόνας. Θα πρέπει να παρατηρήσετε ότι προσθέσαμε το apk del εντολή στο τέλος της RUN εντολής. Αυτό έγινε για να αφαιρεθούν οι εξαρτήσεις μεταγλώττισης (build dependencies) αφού τις χρησιμοποιήσαμε για να χτίσουμε τα πακέτα της εφαρμογής.
Στη συνέχεια, έχουμε μια άλλη ADD οδηγία την οποία χρησιμοποιούμε για να αντιγράψουμε τον κώδικα της εφαρμογής στον κατάλογο /app . Στη συνέχεια, θα χρησιμοποιήσουμε την WORKDIR οδηγία για να ορίσουμε τον κατάλογο εργασίας της εικόνας στον κατάλογο /app , ο οποίος τώρα περιέχει τον κώδικα της εφαρμογής.
Στη συνέχεια, έχουμε τις ENV οδηγίες τις οποίες χρησιμοποιούμε για να ορίσουμε δύο μεταβλητές περιβάλλοντος που η εικόνα θα καταστήσει διαθέσιμες στα εκτελούμενα containers. Αρχικά, ορίζουμε τη μεταβλητή VIRTUAL_ENV σε /env. Δεύτερον, ορίζουμε τη μεταβλητή PATH ώστε να περιλαμβάνει τον κατάλογο /env/bin . Σε αυτές τις δύο γραμμές, φορτώνουμε το σενάριο (script) /env/bin/activate, με το οποίο ενεργοποιούμε ένα εικονικό περιβάλλον (virtual environment) σε περιβάλλον Linux. Μπορείτε να διαβάσετε περισσότερα για την εργασία με εικονικά περιβάλλοντα στην Python σε άλλα λειτουργικά συστήματα. Η τελευταία οδηγία είναι η εντολή EXPOSE η οποία ορίζει τη θύρα (port) 8000 στην οποία θα ακούει το container κατά την εκτέλεση.
Μέχρι τώρα, το Dockerfile σας είναι σχεδόν έτοιμο, εκτός από την προεπιλεγμένη εντολή που θα εκτελείται όταν ξεκινάτε τα containers. Ας την ορίσουμε στην επόμενη ενότητα.
-
Κατανόηση της Προεπιλεγμένης Εντολής της Εικόνας Docker
Κατά την εκκίνηση ενός Docker container, μπορείτε να παρέχετε μια εντολή προς εκτέλεση. Ωστόσο, εάν δεν παρέχετε κάποια εντολή, η προεπιλεγμένη εντολή της εικόνας Docker θα καθορίσει τι θα συμβεί όταν ξεκινήσει το container. Χρησιμοποιούμε τις οδηγίες ENTRYPOINT ή CMD μεμονωμένα ή μαζί για να ορίσουμε μια προεπιλεγμένη εντολή μέσα στο Dockerfile.
Εάν επιλέξετε να ορίσετε και το ENTRYPOINT και το CMD, στην οδηγία ENTRYPOINT ορίζετε το εκτελέσιμο που θα τρέξει το container. Στην οδηγία CMD ορίζετε την προεπιλεγμένη λίστα ορισμάτων για την εκτελέσιμη εντολή. Μπορείτε να παρακάμψετε την προεπιλεγμένη λίστα ορισμάτων προσθέτοντας εναλλακτικά ορίσματα στη γραμμή εντολών κατά την εκκίνηση του container με τη μορφή:
|
1 |
docker run <image> <arguments> |
Αυτή η μορφή εμποδίζει τους προγραμματιστές από το να παρακάμψουν εύκολα την εντολή ENTRYPOINT. Η εντολή ENTRYPOINT ορίζεται για να καλέσει ένα σενάριο (script) που θα ρυθμίσει το περιβάλλον και θα εκτελέσει διάφορες ενέργειες με βάση τη λίστα ορισμάτων που παρέχεται.
Μπορείτε να χρησιμοποιήσετε την οδηγία ENTRYPOINT μόνη της για να ρυθμίσετε το εκτελέσιμο του container. Ωστόσο, αυτή η μορφή δεν επιτρέπει τον ορισμό μιας προεπιλεγμένης λίστας ορισμάτων. Μπορείτε να παρέχετε ορίσματα όταν εκτελείτε το container με την εντολή docker run .
Εάν επιλέξετε να χρησιμοποιήσετε μόνο το CMD , το Docker το ερμηνεύει ως την προεπιλεγμένη εντολή και λίστα ορισμάτων, την οποία μπορείτε να παρακάμψετε κατά την εκτέλεση. Μπορείτε να βρείτε περισσότερες πληροφορίες στα επίσημα έγγραφα αναφοράς του Dockerfile.
Ας δούμε πώς μπορούμε να εφαρμόσουμε τις πληροφορίες που μάθατε σχετικά με τις προεπιλεγμένες εντολές στο παράδειγμα του container μας. Θέλουμε να εξυπηρετούμε την εφαρμογή από προεπιλογή χρησιμοποιώντας τον διακομιστή gunicorn. Αν και η λίστα ορισμάτων που μεταβιβάζεται στον διακομιστή gunicorn δεν χρειάζεται να είναι παραμετροποιήσιμη κατά την εκτέλεση, θέλουμε την ευελιξία να εκτελούμε άλλες εντολές για σκοπούς όπως ο εντοπισμός σφαλμάτων (debugging) ή η διαχείριση ρυθμίσεων (αρχικοποίηση της βάσης δεδομένων, συλλογή στατικών αρχείων κ.λπ.). Όπως μπορείτε να δείτε, είναι προς το συμφέρον μας να χρησιμοποιήσουμε το CMD για να ορίσουμε μια προεπιλεγμένη εντολή, η οποία θα μας επιτρέπει να την παρακάμπτουμε όποτε είναι απαραίτητο.
Ακολουθούν ορισμένες συντάξεις που μπορείτε να χρησιμοποιήσετε για να ορίσετε την εντολή CMD :
- CMD ["command", "argument 1", "argument 2", . . . ,"argument n"]: Η μορφή exec (συνιστώμενη μορφή), δέχεται μια εντολή και μια λίστα ορισμάτων. Εκτελεί την εντολή απευθείας χωρίς επεξεργασία από το κέλυφος (shell).
- CMD command "argument 1" "argument 2" . . . "όρισμα n": Η μορφή κελύφους (shell) ορίζει μια εντολή και μια λίστα ορισμάτων. Μεταβιβάζει τη λίστα εντολών στο κέλυφος για επεξεργασία. Αυτό μπορεί να σας φανεί χρήσιμο εάν θέλετε να αντικαταστήσετε μεταβλητές περιβάλλοντος σε μια εντολή, ωστόσο, δεν είναι απολύτως προβλέψιμο.
- CMD ["όρισμα 1", "όρισμα 2", . . . ,"όρισμα n"]: Η μορφή λίστας ορισμάτων, ορίζει μόνο την προεπιλεγμένη λίστα ορισμάτων και χρησιμοποιείται μαζί με μια ENTRYPOINT οδηγία.
Θα χρησιμοποιήσουμε τη μορφή exec για να ορίσουμε την τελική μας οδηγία στο Dockerfile. Προσθέστε την ακόλουθη γραμμή στο τέλος του Dockerfile:
|
1 |
CMD ["gunicorn", "--bind", ":8000", "--workers", "3", "mysite.wsgi:application"] |
Μπορείτε τώρα να αποθηκεύσετε και να κλείσετε το Dockerfile.
Όταν εκκινείτε κοντέινερ χρησιμοποιώντας αυτήν την εικόνα, θα εκτελούν το gunicorn συνδεδεμένο στη θύρα localhost 8000 με 3 workers, και θα καλούν τη συνάρτηση application στο αρχείο wsgi.py που βρίσκεται στον κατάλογο mysite . Μπορείτε να επιλέξετε να παρέχετε μια διαφορετική εντολή για να παρακάμψετε την προεπιλεγμένη εντολή κατά το χρόνο εκτέλεσης και να εκτελέσετε μια διαφορετική διεργασία αντί για το gunicorn. Ίσως θέλετε να μάθετε περισσότερα για τους Gunicorn workers.
Το Dockerfile σας είναι τώρα έτοιμο και μπορείτε να χρησιμοποιήσετε το docker build για να δημιουργήσετε την εικόνα της εφαρμογής. Μπορείτε να χρησιμοποιήσετε το docker run για να εκκινήσετε το κοντέινερ στο τοπικό σας μηχάνημα ανάπτυξης.
-
Δημιουργία της εικόνας Docker
Η εντολή docker build θα αναζητήσει ένα Dockerfile στον τρέχοντα κατάλογο από προεπιλογή για να βρει τις οδηγίες δημιουργίας του. Στέλνει επίσης το "context" (πλαίσιο) δημιουργίας στον δαίμονα Docker. Ένα build context είναι ένα σύνολο αρχείων που θα πρέπει να είναι διαθέσιμα κατά τη διαδικασία δημιουργίας. Από προεπιλογή, ο τρέχων κατάλογος στον οποίο εκτελείτε την εντολή docker build ορίζεται ως το πλαίσιο δημιουργίας.
Ενώ βρίσκεστε στον ίδιο κατάλογο που περιέχει το Dockerfile σας, εκτελέστε την εντολή docker build. Παρέχετε μια εικόνα και μια ετικέτα με τη σημαία -t, και ορίστε τον τρέχοντα κατάλογο ως πλαίσιο δημιουργίας χρησιμοποιώντας την τελεία ( .) στο τέλος της εντολής:
|
1 |
docker build -t django-polls:v1 . |
Σε αυτήν την εντολή, ονομάσαμε την εικόνα django-polls και την ετικέτα v1. Προσέξτε την τελεία στο τέλος της εντολής, τη χρησιμοποιούμε για να δηλώσουμε τον τρέχοντα κατάλογο ως το πλαίσιο δημιουργίας.
Όταν ολοκληρωθεί το docker build , θα πρέπει να δείτε ένα αποτέλεσμα παρόμοιο με το ακόλουθο:

Η εικόνα Docker σας είναι τώρα έτοιμη. Εάν δεν είχαμε μεταφέρει κάποιες από τις ρυθμίσεις σε εξωτερικές μεταβλητές περιβάλλοντος, θα μπορούσατε εύκολα να εκτελέσετε το κοντέινερ σας με την εντολή docker run. Ωστόσο, εφόσον δεν έχουμε ρυθμίσει τις εξωτερικές μεταβλητές περιβάλλοντος που ορίσαμε στο αρχείο settings.py, η εκτέλεση θα αποτύχει. Ας το ολοκληρώσουμε αυτό στο επόμενο βήμα.
Βήμα 8: Ρύθμιση του περιβάλλοντος εκτέλεσης και δοκιμή της εφαρμογής
Πλησιάζουμε στο τέλος αυτού του οδηγού. Σε αυτό το βήμα, θα ρυθμίσουμε τις μεταβλητές περιβάλλοντος στο αρχείο env . Με τις μεταβλητές του αρχείου env στη θέση τους, μπορούμε να δημιουργήσουμε το σχήμα της βάσης δεδομένων, να δημιουργήσουμε και να ανεβάσουμε τα στατικά αρχεία στην εξωτερική υπηρεσία αποθήκευσης αντικειμένων και, τέλος, να δοκιμάσουμε την εφαρμογή.
Το Docker διαθέτει διάφορες μεθόδους που μπορείτε να χρησιμοποιήσετε για να παρέχετε μεταβλητές περιβάλλοντος στο κοντέινερ. Στη δική μας περίπτωση, θέλουμε να παρέχουμε μια λίστα μεταβλητών περιβάλλοντος μέσω ενός αρχείου. Επομένως, θα χρησιμοποιήσουμε τη μέθοδο --env-file .
Χρησιμοποιώντας τον επεξεργαστή της προτίμησής σας, δημιουργήστε ένα αρχείο με το όνομα env in the django_project directory:
|
1 |
nano env |
Επικολλήστε την ακόλουθη λίστα μεταβλητών:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DJANGO_SECRET_KEY=your_secret_key DEBUG= DJANGO_LOGLEVEL=info DJANGO_ALLOWED_HOSTS=διεύθυνση_IP_του_διακομιστή_σας DB_ENGINE=postgresql_psycopg2 DB_DATABASE=polls_db DB_USERNAME=hackins DB_PASSWORD=κωδικός_πρόσβασης_της_βάσης_δεδομένων_σας DB_HOST=κεντρικός_υπολογιστής_της_βάσης_δεδομένων_σας DB_PORT=θύρα_της_βάσης_δεδομένων_σας STATIC_DEFAULT_FILE_STORAGE=storages.backends.s3boto3.S3Boto3Storage STATIC_MINIO_BUCKET_NAME=test-bucket MINIO_ACCESS_KEY=κλειδί_πρόσβασης_minio_σας MINIO_SECRET_KEY=μυστικό_κλειδί_minio_σας MINIO_URL=url_minio_σας:θύρα_minio_σας |
Οι μεταβλητές στη λίστα είναι αυτές που ορίσατε στα προηγούμενα βήματα:
-
DJANGO_SECRET_KEY: Δημιουργήστε μια μοναδική, απρόβλεπτη τιμή όπως εξηγείται στα έγγραφα του Django. Μπορείτε να χρησιμοποιήσετε αυτήν την εντολή για να δημιουργήσετε μια τυχαία συμβολοσειρά και να την ορίσετε στη μεταβλητή:
|
1 |
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())' |
-
DEBUG: Έχουμε ορίσει αυτήν την τιμή σε True, αλλά για μια παραγωγική ανάπτυξη, θυμηθείτε να την ορίσετε σε False αφήνοντάς την κενή.
-
DJANGO_LOGLEVEL: το έχουμε ορίσει σε info, μη διστάσετε να το προσαρμόσετε στο επιθυμητό επίπεδο.
-
DJANGO_ALLOWED_HOSTS: ορίστε αυτήν την τιμή στη διεύθυνση IP του διακομιστή Ubuntu που εκτελεί τα κοντέινερ Docker σας. Προαιρετικά, ορίστε την σε *, χαρακτήρα μπαλαντέρ που ταιριάζει με όλους τους κεντρικούς υπολογιστές εάν βρίσκεστε σε λειτουργία ανάπτυξης.
-
DB_DATABASE: εάν χρησιμοποιήσατε διαφορετικό όνομα βάσης δεδομένων, ορίστε το εδώ κατάλληλα.
-
DB_USERNAME: ορίστε το στο όνομα χρήστη που επιλέξατε για τη βάση δεδομένων σας.
-
DB_PASSWORD: ορίστε το στον κωδικό πρόσβασης που επιλέξατε για τη βάση δεδομένων σας.
-
DB_HOST: ορίστε το στον κεντρικό υπολογιστή που εκτελεί το στιγμιότυπο της βάσης δεδομένων σας, όπως είχατε ρυθμίσει στο Βήμα Ένα.
-
DB_PORT: ορίστε το στη θύρα της βάσης δεδομένων σας.
-
STATIC_MINIO_BUCKET_NAME: ορίστε το στο όνομα του bucket που δημιουργήσατε στον λογαριασμό σας MinIO Cloud Storage.
Αποθηκεύστε και κλείστε το αρχείο όταν ολοκληρώσετε την επεξεργασία.
Οι ρυθμίσεις περιβάλλοντος είναι τώρα έτοιμες. Πρέπει να εκτελέσουμε το κοντέινερ περνώντας ορίσματα για να παρακάμψουμε την προεπιλεγμένη εντολή CMD και να δημιουργήσουμε το σχήμα της βάσης δεδομένων χρησιμοποιώντας τις εντολές manage.py makemigrations και manage.py migrate.
Εδώ είναι η εντολή:
|
1 |
docker run --env-file env django-polls:v1 sh -c "python manage.py makemigrations && python manage.py migrate" |
Σε αυτήν την εντολή, εκτελούμε την django-polls:v1 εικόνα κοντέινερ, χρησιμοποιώντας τη –env-file σημαία για να περάσουμε το αρχείο μεταβλητών περιβάλλοντος. Παρακάμπτουμε επίσης την προεπιλεγμένη εντολή CMD με sh -c "python manage.py makemigrations && python manage.py migrate" Όταν εκτελεστεί αυτή η εντολή για την εκκίνηση του κοντέινερ, θα δημιουργήσει το σχήμα της βάσης δεδομένων όπως ορίζεται στον κώδικα της εφαρμογής.
Εάν πετύχει, θα πρέπει να δείτε ένα αποτέλεσμα παρόμοιο με το παρακάτω:

Το αποτέλεσμα υποδεικνύει ότι το σχήμα της βάσης δεδομένων δημιουργήθηκε με επιτυχία.
Το επόμενο βήμα είναι να δημιουργήσετε έναν διαχειριστή χρήστη για την εφαρμογή Django. Θα ξεκινήσουμε το κοντέινερ και θα ανοίξουμε ένα διαδραστικό κέλυφος στο εσωτερικό του με την ακόλουθη εντολή:
|
1 |
docker run -i -t --env-file env django-polls:v1 sh |
Η εντολή εκκινεί το κοντέινερ με μια προτροπή κελύφους που μπορείτε να χρησιμοποιήσετε για να αλληλεπιδράσετε με το κέλυφος της Python. Ας δημιουργήσουμε έναν χρήστη:
|
1 |
python manage.py createsuperuser |
Ακολουθήστε τις προτροπές για να εισαγάγετε όνομα χρήστη, διεύθυνση email, κωδικό πρόσβασης, να πληκτρολογήσετε ξανά τον κωδικό πρόσβασης και να πατήσετε enter για να δημιουργήσετε τον χρήστη. Βγείτε από το κέλυφος και τερματίστε το κοντέινερ πατώντας CTRL+D.
Στη συνέχεια, πρέπει να εκτελέσουμε ξανά το κοντέινερ, παρακάμπτοντας την προεπιλεγμένη εντολή με την collectstatic εντολή Django για να δημιουργήσουμε τα στατικά αρχεία για την εφαρμογή και να τα ανεβάσουμε στην υπηρεσία MinIO Cloud Storage:
|
1 |
docker run --env-file env django-polls:v1 sh -c "python manage.py collectstatic --noinput" |
Όταν ολοκληρωθεί, θα πρέπει να δείτε ένα παρόμοιο αποτέλεσμα με το παρακάτω, που υποδεικνύει ότι το κοντέινερ σας συνδέθηκε με επιτυχία στην υπηρεσία αποθήκευσης MinIO και ανέβασε τα στατικά αρχεία:
![]()
Ο κάδος αποθήκευσής μας (storage bucket) μοιάζει τώρα κάπως έτσι, με τους καταλόγους που δημιούργησε το Django:

Τέλος, μπορούμε τώρα να εκτελέσουμε την εφαρμογή με την εντολή:
|
1 |
docker run --env-file env -p 80:8000 django-polls:v1 |
Εδώ είναι το αποτέλεσμα:

Όταν εκτελείτε την παραπάνω εντολή, εκτελείται η προεπιλεγμένη εντολή CMD στο είδωλό σας και εκτίθεται η θύρα 8000 όπως έχει οριστεί. Τώρα, το Ubuntu στη θύρα 80 αντιστοιχίζεται στη 8000 θύρα του django-polls:v1 container.
Μπορούμε τώρα να δοκιμάσουμε την εφαρμογή στο πρόγραμμα περιήγησης. Μεταβείτε στη δημόσια διεύθυνση IP του διακομιστή σας στο πρόγραμμα περιήγησης: http://your_server_public_ip.
Αναμένετε να βρείτε ένα σφάλμα 404 Page Not Found, καθώς σύμφωνα με τον Οδηγό του Django, δεν ορίσαμε μια διαδρομή για τη / διαδρομή:

Έχουμε τη μεταβλητή DEBUG ορισμένη σε True, γι' αυτό βλέπουμε αυτή τη σελίδα σφάλματος με πολλές κρίσιμες πληροφορίες. Ας καταργήσουμε τη μεταβλητή DEBUG. Αρχικά, θα πρέπει να σταματήσετε το εκτελούμενο container με CTRL+C. Στη συνέχεια, ανοίξτε το env αρχείο:
|
1 |
nano env |
Στη συνέχεια, βρείτε τη μεταβλητή DEBUG και καταργήστε την ή αφήστε την κενή. Την αφήνουμε κενή επειδή η συνάρτηση getenv ερμηνεύει το False ως συμβολοσειρά, επιστρέφοντας έτσι true:
|
1 |
DEBUG= |
Αποθηκεύστε το αρχείο και εκτελέστε ξανά το container με την εντολή:
|
1 |
docker run --env-file env -p 80:8000 django-polls:v1 |
Αν επισκεφθείτε αυτό το http://your_server_public_ip στο πρόγραμμα περιήγησής σας, θα πρέπει να δείτε την προεπιλεγμένη σελίδα 404:

Είδατε πώς μπορείτε να χειριστείτε τη συμπεριφορά χρόνου εκτέλεσης της εφαρμογής σας Django χρησιμοποιώντας μεταβλητές περιβάλλοντος, χωρίς να τροποποιήσετε τον πηγαίο κώδικα.
Μεταβείτε στο http://your_server_public_ip/polls για να δείτε την αρχική σελίδα των Δημοσκοπήσεων (Polls):

Δεν έχουμε δημοσκοπήσεις καθώς μόλις αναπτύξαμε την εφαρμογή.
Μεταβείτε στη διεπαφή διαχειριστή: http://your_server_public_ip/admin για να δείτε το παράθυρο ελέγχου ταυτότητας διαχειριστή:

Δώστε τα διαπιστευτήρια που είχατε ορίσει με την εντολή createsuperuser για να συνδεθείτε. Θα πρέπει τώρα να βρίσκεστε στη διεπαφή της σελίδας Διαχείρισης:

Σημειώστε ότι όλα τα στατικά αρχεία εξυπηρετούνται από την εξωτερική υπηρεσία αποθήκευσης που είχαμε ρυθμίσει. Μπορείτε να κάνετε Δεξί Κλικ στο παράθυρο του προγράμματος περιήγησής σας και να επιλέξετε Προβολή πηγαίου κώδικα σελίδας:

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

Επιστρέψτε στο ευρετήριο των Δημοσκοπήσεων http://your_server_public_ip/polls και προσπαθήστε να ψηφίσετε στην ερώτηση:

Αφού δοκιμάσετε και επιβεβαιώσετε ότι όλα λειτουργούν όπως αναμένεται, μπορείτε να τερματίσετε το container.
Συμπέρασμα
Ρυθμίσατε με επιτυχία μια διαδικτυακή εφαρμογή Django ώστε να λειτουργεί σωστά σε ένα περιβάλλον βασισμένο σε containers. Αυτό περιλάμβανε την προσαρμογή της εφαρμογής ώστε να λειτουργεί με εξωτερικές μεταβλητές περιβάλλοντος, τη ρύθμιση της εφαρμογής ώστε να χρησιμοποιεί μια υπηρεσία αποθήκευσης cloud για τα στατικά αρχεία και τη δημιουργία ενός Dockerfile για το είδωλο του container. Μπορείτε να δείτε τις αλλαγές που κάναμε για να μετατρέψουμε την εφαρμογή σε Docker στον κλάδο django-polls-docker του αποθετηρίου GitHub django-polls.
Από εδώ και πέρα, οι δυνατότητες περιορίζονται μόνο από τη φαντασία σας. Μπορείτε να ρυθμίσετε έναν αντίστροφο διαμεσολαβητή Nginx ανάμεσα στους πελάτες και τον διακομιστή Gunicorn. Μπορείτε επίσης να προσθέσετε το Certbot για να αποκτήσετε πιστοποιητικά TLS για την ασφάλεια του διακομιστή Nginx. Συνιστούμε την προσθήκη ενός HTTP proxy για την προσωρινή αποθήκευση αργών πελατών και την προστασία του διακομιστή Gunicorn από επιθέσεις άρνησης υπηρεσίας.
Αν και ορίσαμε 3 workers στην εντολή εκκίνησης του Dockerfile, μπορείτε να ορίσετε τον αριθμό που προτιμάτε ανάλογα με τους διαθέσιμους πόρους στον διακομιστή σας. Μπορείτε να βρείτε περισσότερες πληροφορίες στα επίσημα έγγραφα σχεδιασμού του Gunicorn. Εάν το επιθυμείτε, μπορείτε να προωθήσετε το είδωλο Docker που δημιουργήσατε στο Dockerhub και να προσπαθήσετε να το αναπτύξετε σε διάφορα περιβάλλοντα που έχουν εγκατεστημένο το Docker. Αν θέλετε να μάθετε περισσότερα, συνεχίστε να παρακολουθείτε το ιστολόγιο οδηγών μας καθώς θα κάνουμε έναν επόμενο οδηγό για να κάνουμε την εφαρμογή Django ασφαλή με το Nginx και το Let’s Encrypt.
Τέλος, ακολουθούν περισσότεροι πόροι που θα σας βοηθήσουν να χρησιμοποιήσετε το Docker:
- How to Host a Docker Image Repository and Build Docker Images with GitLab Self-Managed Instance on Ubuntu 20.04
- Working with Docker Data Volumes on Ubuntu 20.04
- Build and Deploy a Flask Application with Docker on Ubuntu 20.04
- How to Deploy WordPress with Docker Containers on Ubuntu 20.04
Καλή υπολογιστική συνέχεια!
Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.