Εισαγωγή
WordPress είναι ένα από τα πιο δημοφιλή Συστήματα Διαχείρισης Περιεχομένου (CMS) εκεί έξω. Στατιστικά, τροφοδοτεί πάνω από 39% όλων των ιστότοπων που βλέπετε στον παγκόσμιο ιστό. Είναι μια δημοφιλής επιλογή λόγω της επεκτασιμότητάς του μέσω πρόσθετων (plugins) και του ευέλικτου συστήματος προτύπων του. Σας επιτρέπει να αλλάξετε την εμφάνισή του σε δευτερόλεπτα. Επιπλέον, η διαχείρισή του μπορεί να γίνει μέσω της διεπαφής ιστού χωρίς να απαιτούνται πολλές τεχνικές γνώσεις.
Επιπλέον, το WordPress είναι δωρεάν και ανοιχτού κώδικα και είναι βασισμένο σε μια MySQL βάση δεδομένων με επεξεργασία PHP. Μπορείτε να αναπτύξετε το WordPress σε μια στοίβα LAMP (Linux, Apache, MySQL και PHP) ή σε μια στοίβα LEMP (Linux, Nginx, MySQL και PHP). Ωστόσο, αποδεικνύεται χρονοβόρο να στήνετε τη στοίβα κάθε φορά που θέλετε να κάνετε ανάπτυξη.
Ευτυχώς, οι σύγχρονες μέθοδοι παράδοσης λογισμικού όπως το cloud computing, το Docker, και το Docker Compose έχουν εξομαλύνει τη συνολική εμπειρία των προγραμματιστών. Αυτά τα εργαλεία απλοποιούν τη διαδικασία ρύθμισης οποιασδήποτε στοίβας, αποφεύγοντας την επιβάρυνση της εγκατάστασης και της παραμετροποίησης μεμονωμένων στοιχείων κάθε φορά που θέλετε να αναπτύξετε μια εφαρμογή. Αντ' αυτού, γράφετε αρχεία ρυθμίσεων που θα χρησιμοποιηθούν για τη λήψη και τη δημιουργία εικόνων (images) και την εκτέλεσή τους σε κοντέινερ Docker, επιτρέποντάς σας να αναπτύξετε την εφαρμογή σας με μία μόνο εντολή.
Τα κοντέινερ (containers) είναι ελαφριά, εικονικοποιημένα, φορητά, καθορισμένα από λογισμικό τυποποιημένα περιβάλλοντα που επιτρέπουν στο λογισμικό να εκτελείται σε απομόνωση από άλλο λογισμικό που εκτελείται στο φυσικό μηχάνημα υποδοχής. Το Docker Compose σάς επιτρέπει να διαχειρίζεστε πολλαπλά κοντέινερ και να διασφαλίζετε ότι επικοινωνούν μεταξύ τους. Για παράδειγμα, ο πηγαίος κώδικας μιας εφαρμογής και μια βάση δεδομένων πρέπει να επικοινωνούν.
Σε αυτόν τον οδηγό, θα δημιουργήσουμε μια εφαρμογή WordPress με πολλαπλά κοντέινερ. Μια πλήρης εφαρμογή WordPress απαιτεί τρία κοντέινερ: βάση δεδομένων MySQL, διακομιστή Nginx και τον πηγαίο κώδικα του WordPress. Καθώς η ασφάλεια αποτελεί προτεραιότητα στους σύγχρονους ιστότοπους, θα λάβουμε ένα πιστοποιητικό SSL από το Let’s Encrypt για να ασφαλίσουμε την εγκατάστασή σας. Στη συνέχεια, θα ρυθμίσουμε μια εργασία cron για να ελέγχει και να ανανεώνει περιοδικά τα πιστοποιητικά, έτσι ώστε η ασφάλεια του ιστότοπού σας να διατηρείται συνεχώς.
Προαπαιτούμενα
- Καθώς πρόκειται για έναν πρακτικό οδηγό, θα πρέπει να έχετε μια εγκατάσταση του Ubuntu 20.04 ως αρχικό περιβάλλον λειτουργίας σας. Θα πρέπει επίσης να έχετε έναν μη-root χρήστη με δικαιώματα sudo. Εδώ είναι ένας οδηγός βήμα προς βήμα για να σας βοηθήσει να ρυθμίσετε τον διακομιστή Ubuntu σας.
- Πρέπει επίσης να εγκαταστήσετε το Docker. Μπορείτε να ανατρέξετε σε αυτόν τον οδηγό σχετικά με το πώς να εγκαταστήσετε και να λειτουργήσετε το Docker στο Ubuntu 18.04.
- Μια εγκατάσταση του Docker Compose. Μπορείτε να ακολουθήσετε το Βήμα 1 του οδηγού Πώς να εγκαταστήσετε και να ρυθμίσετε το Docker Compose στο Ubuntu 20.04.
- Απαιτείται ένα καταχωρημένο όνομα τομέα (domain name) για τη λήψη ενός πιστοποιητικού TLS/SSL από το Let’s Encrypt. Για τους σκοπούς αυτού του οδηγού, θα χρησιμοποιήσουμε το
example.com. - Ρυθμίστε τις εγγραφές DNS για να κατευθύνετε την κίνηση στο VPS σας. Χρειάζεστε δύο εγγραφές DNS:
- Μια εγγραφή A με το
example.comνα δείχνει στη δημόσια διεύθυνση IP του διακομιστή σας. - Μια εγγραφή A με το
www.example.comνα δείχνει στη δημόσια διεύθυνση IP του διακομιστή σας.
- Μια εγγραφή A με το
Βήμα 1: Ορισμός των ρυθμίσεων για τον διακομιστή ιστού
Ο διακομιστής ιστού (web server) φιλοξενεί τα αρχεία του ιστότοπού σας και επιτρέπει στους χρήστες να έχουν πρόσβαση στην εφαρμογή ιστού σας. Επομένως, είναι κατάλληλο στο πρώτο βήμα να ορίσουμε τις ρυθμίσεις για τον διακομιστή ιστού. Θα ορίσουμε ένα αρχείο ρυθμίσεων διακομιστή Nginx το οποίο θα περιλαμβάνει συγκεκριμένα μπλοκ τοποθεσίας (location blocks) για το WordPress. Θα συμπεριλάβουμε επίσης μπλοκ τοποθεσίας για την κατεύθυνση των αιτημάτων επαλήθευσης του Let’s Encrypt στον πελάτη Certbot για αυτοματοποιημένες ανανεώσεις του πιστοποιητικού.
Ας ξεκινήσουμε δημιουργώντας έναν κατάλογο για το έργο. Μπορείτε να επιλέξετε ένα όνομα καταλόγου που προτιμάτε. Θα χρησιμοποιήσουμε το wordpress_docker για αυτόν τον οδηγό. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε τον κατάλογο και να μεταβείτε σε αυτόν:
|
1 |
mkdir wordpress_docker && cd wordpress_docker |
Στη συνέχεια, δημιουργήστε έναν κατάλογο για να κρατήσετε τα αρχεία ρυθμίσεων του Nginx με την εντολή:
|
1 |
mkdir nginx-conf |
Χρησιμοποιήστε το nano για να ανοίξετε το αρχείο με την ακόλουθη εντολή:
|
1 |
nano nginx-conf/nginx.conf |
Σε αυτό το αρχείο, θα ορίσουμε βασικές οδηγίες για τη διαμόρφωση ενός server block του Nginx. Αυτές περιλαμβάνουν οδηγίες για το server name, τον ριζικό κατάλογο εγγράφων (document root) και τα location blocks για την κατεύθυνση των αιτημάτων του πρόσθετου Certbot για πιστοποιητικά, στατικά αρχεία και επεξεργασία PHP. Μπορείτε να διαβάσετε τον οδηγό μας σχετικά με το Πώς να ασφαλίσετε το Nginx με το Let’s Encrypt για να μάθετε περισσότερα. Προσθέστε τον ακόλουθο κώδικα στο αρχείο, αντικαθιστώντας το example.com με το κατοχυρωμένο όνομα τομέα σας:
|
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
server { listen 80; listen [::]:80; server_name example.com www.example.com; index index.php index.html index.htm; root /var/www/html; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } } |
Ας ορίσουμε τις ενότητες που προσθέσατε:
-
Οδηγίες:
listen: λέει στο Nginx να ακούει στη θύρα80. Αυτό επιτρέπει τη χρήση του webroot του Certbot για την υποβολή αιτημάτων πιστοποιητικών. Μόλις λάβουμε ένα πιστοποιητικό SSL, θα ενημερώσουμε αυτήν τη διαμόρφωση ώστε να χρησιμοποιεί τη θύρα443.server_name: αυτό ορίζει το όνομα domain για το οποίο θα γίνεται ο χειρισμός από αυτήν τη διαμόρφωση. Η κίνηση προς το όνομα domain που ορίζεται εδώ θα κατευθύνεται σε αυτό το συγκεκριμένο server block, και συνεπώς στο έγγραφοroot.root: ορίζει τον ριζικό κατάλογο για αιτήματα προς το παραπάνω όνομα domain. Συνήθως είναι ο κατάλογος που περιέχει τα πραγματικά αρχεία του ιστότοπού μας. Έχουμε ορίσει τον κατάλογο σε αυτόν/var/www/html. Θα δημιουργηθεί ως σημείο προσάρτησης Docker κατά τη διάρκεια του χρόνου δημιουργίας του container. Θα ορίσουμε τις οδηγίες για αυτή τη διαδικασία μέσα στο WordPress Dockerfile.index: αυτό ορίζει αρχεία που θα χρησιμοποιηθούν ως ευρετήρια ή ως το σημείο εισόδου στον διακομιστή ιστού σας κατά την επεξεργασία αιτημάτων. Έχουμε μετακινήσει το index.php πριν από το index.html, έτσι ώστε το Nginx να δίνει προτεραιότητα στοindex.php.
-
Location Blocks:
location ~ /.well-known/acme-challenge: χειρίζεται αιτήματα προς τον γνωστό κατάλογο (well-known directory) όπου το Certbot προσθέτει ένα προσωρινό αρχείο για να επαληθεύσει ότι το DNS για το καθορισμένο domain κατευθύνει στον συγκεκριμένο διακομιστή από τον οποίο ζητάμε πιστοποιητικά SSL. Αυτός είναι ο λόγος για τον οποίο θα πρέπει να προσθέσετε ένα έγκυρο domain για να λειτουργήσει αυτό το βήμα, αντί για τοexample.comπου χρησιμοποιούμε σε αυτόν τον οδηγό.location /: λαμβάνει αιτήματα URI και δίνει τον έλεγχο στο WordPressindex.phpγια να ζητήσει ορίσματα για επεξεργασία.location ~ \.php$: χειρίζεται την επεξεργασία PHP και μεταβιβάζει το αίτημα στο WordPress container (θα ορίσουμε ένα αρχείο ρυθμίσεων για αυτό σε επόμενο βήμα). Έχουμε ορίσει ρυθμίσεις ειδικά για το πρωτόκολλο FastCGI εδώ, επειδή η εικόνα Docker του WordPress θα βασίζεται στην εικόνα php:fpm. Το Nginx χρησιμοποιεί έναν ανεξάρτητο επεξεργαστή PHP για αιτήματα ειδικά για PHP. Θα χρησιμοποιήσουμε τον επεξεργαστήphp-fpmπου συνοδεύει την εικόνα Dockerphp:fpm.location ~ /\.ht: χειρίζεται αρχεία.htaccessτα οποία δεν χρησιμοποιεί το Nginx. Η οδηγίαdeny allδιασφαλίζει ότι αυτά τα αρχεία δεν θα σερβιριστούν ποτέ στους επισκέπτες του ιστότοπου.location = /favicon.ico, location = /robots.txt: όπως φαίνεται στον ορισμό, αυτό αποτρέπει την καταγραφή αιτημάτων για τα αρχεία/favicon.icoκαι/robots.txt.location ~* \.(css|gif|ico|jpeg|jpg|js|png)$: απενεργοποιεί την καταγραφή αιτημάτων για στατικά αρχεία και διασφαλίζει ότι αποθηκεύονται στην προσωρινή μνήμη (cache) για να μειωθεί ο φόρτος στον διακομιστή.
Μπορείτε τώρα να αποθηκεύσετε και να κλείσετε το αρχείο πατώντας CTRL+X, Y, μετά ENTER. Αυτό ολοκληρώνει το πρώτο βήμα.
Step 2: Define Environment Variables
Οι μεταβλητές περιβάλλοντος είναι απαραίτητες για τη διευκόλυνση της επικοινωνίας μεταξύ της εφαρμογής WordPress και της βάσης δεδομένων. Διασφαλίζουν επίσης τη διατήρηση των δεδομένων της εφαρμογής. Οι μεταβλητές περιβάλλοντος περιλαμβάνουν ευαίσθητες πληροφορίες, όπως διαπιστευτήρια βάσης δεδομένων, και μη ευαίσθητες πληροφορίες, όπως το όνομα της βάσης δεδομένων και ο κεντρικός υπολογιστής (host).
Για λόγους ασφαλείας, είναι πάντα καλή ιδέα να μην προσθέτετε ευαίσθητες πληροφορίες στα αποθετήρια (repositories) του έργου. Επομένως, αντί να ορίσουμε τις ευαίσθητες τιμές στο αρχείο Docker Compose, θα ορίσουμε τα διαπιστευτήρια MySQL μέσα στα αρχεία .env τα οποία δεν θα υποβληθούν (commit) στο αποθετήριο του έργου, αποφεύγοντας τον κίνδυνο δημόσιας έκθεσης. Μέσα στον ριζικό κατάλογο του έργου root ~/wordpress_docker ανοίξτε το αρχείο .env :
|
1 |
nano .env |
|
1 2 3 |
MYSQL_ROOT_PASSWORD=your_strong_root_password MYSQL_USER=your_wordpress_database_user MYSQL_PASSWORD=strong_wordpress_database_password |
Το επόμενο πράγμα που πρέπει να κάνετε είναι να προσθέσετε το αρχείο .env στα αρχεία .gitignore και .dockerignore για να διασφαλίσετε ότι δεν θα προστεθεί στα αποθετήρια ή στις εικόνες Docker σας αντίστοιχα.
Αυτό δεν είναι απαραίτητο για αυτόν τον οδηγό, αλλά αν θέλετε να εργαστείτε με το Git για έλεγχο εκδόσεων, εισαγάγετε την ακόλουθη εντολή για να αρχικοποιήσετε τον τρέχοντα κατάλογο ως αποθετήριο git:
|
1 |
git init |
Ανοίξτε το .gitignore με το nano:
|
1 |
nano .gitignore |
Προσθέστε την ακόλουθη γραμμή:
|
1 |
.env |
Αποθηκεύστε και κλείστε το αρχείο. Στη συνέχεια, ανοίξτε το .dockerignore με το nano:
|
1 |
nano .dockerignore |
Προσθέστε την ακόλουθη γραμμή:
|
1 |
.env |
Παράλληλα, μπορείτε προαιρετικά να προσθέσετε άλλα αρχεία και καταλόγους που σχετίζονται με την ανάπτυξη της εφαρμογής σας:
|
1 2 3 |
.env .git docker-compose.yml |
Αποθηκεύστε και κλείστε το αρχείο όταν τελειώσετε. Αυτά είναι όλα για αυτό το βήμα. Ας προχωρήσουμε στον ορισμό του Docker Compose.
Step 3: Configure Services with Docker Compose
Το Docker Compose χρησιμοποιεί ένα docker-compose.yml αρχείο για τη δημιουργία εικόνων. Αυτό το αρχείο περιέχει ορισμούς υπηρεσιών για την πλήρη εγκατάσταση μιας εφαρμογής. Οι ορισμοί υπηρεσιών είναι βασικά οδηγίες για τον τρόπο λειτουργίας ενός κοντέινερ. Μια υπηρεσία είναι ένα πραγματικό κοντέινερ που εκτελείται.
Το Docker Compose καθιστά δυνατή την οριοθέτηση διαφορετικών υπηρεσιών για εφαρμογές πολλαπλών κοντέινερ, συνδέοντας τις διάφορες υπηρεσίες μεταξύ τους με κοινόχρηστα δίκτυα και τόμους. Θα το δείτε αυτό στην πράξη καθώς θα ορίσουμε τρία κοντέινερ για την εφαρμογή μας: διακομιστή ιστού, εγκατάσταση WordPress και βάση δεδομένων. Θα προσθέσουμε ένα τέταρτο κοντέινερ για την εκτέλεση του πελάτη Certbot για ανανεώσεις πιστοποιητικών.
Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε το αρχείο docker-compose.yml :
|
1 |
nano docker-compose.yml |
Η πρώτη γραμμή σε ένα αρχείο docker-compose.yml είναι η γραμμή ορισμού έκδοσης (version definition). Έχουμε ορίσει την τιμή 3 για τη δική μας. Στη συνέχεια, μπορείτε να ξεκινήσετε να ορίζετε τις υπηρεσίες σας. Προσθέστε το ακόλουθο απόσπασμα κώδικα στο αρχείο για να ορίσετε την υπηρεσία db :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: '3' services: #Υπηρεσία MySQL db: image: mysql:8.0 container_name: db restart: unless-stopped env_file: .env environment: - MYSQL_DATABASE=wordpress volumes: - dbdata:/var/lib/mysql command: '--default-authentication-plugin=mysql_native_password' networks: - app-network |
Ας συζητήσουμε τι έχουμε στους ορισμούς της υπηρεσίας db παρακάτω:
image: καθορίζει την εικόνα στην οποία θα βασίζεται το κοντέινερ. Είναι πάντα προτιμότερο να καθορίζετε μια συγκεκριμένη έκδοση (mysql:8.0) παρά να χρησιμοποιείτε την ετικέτα latest (mysql:latest) καθώς οι μελλοντικές εκδόσεις των εικόνων MySQL ενδέχεται να έρθουν σε σύγκρουση με την εφαρμογή μας εάν χρειαστεί να αναδημιουργήσουμε αυτήν την εικόνα. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με τις Βέλτιστες πρακτικές για Dockerfiles στα επίσημα έγγραφα Dockerfile Docs.container_name: καθορίζουμε το όνομα του κοντέινερ εδώ.restart: αυτή η οδηγία καθορίζει τη συμπεριφορά επανεκκίνησης του κοντέινερ. Η προεπιλογή είναιnoαλλά εμείς την έχουμε ορίσει να κάνει πάνταεπανεκκίνηση (restart)εκτός εάν διακοπεί χειροκίνητα.env_file: αυτή η οδηγία χρησιμοποιείται για τον καθορισμό της τοποθεσίας του αρχείου με τις μεταβλητές περιβάλλοντος (.env) που χρησιμοποιούνται από την εφαρμογή μας.environment: χρησιμοποιείται για τον καθορισμό πρόσθετων μεταβλητών περιβάλλοντος. Σε αυτόν τον οδηγό, έχουμε καθορίσει τη μεταβλητήMYSQL_DATABASEγια να περιέχει το όνομα της βάσης δεδομένων για την εφαρμογή μας. Το όνομα της βάσης δεδομένων μπορεί να συμπεριληφθεί στοdocker-compose.yml.volumes: χρησιμοποιείται για τον καθορισμό των τοποθεσιών προσάρτησης. Στο παράδειγμά μας, έχουμε προσαρτήσει έναν επώνυμο τόμο (volume) με το όνομα dbdata στον κατάλογο/var/lib/mysqlτου κοντέινερ, ο οποίος είναι συνήθως ο τυπικός κατάλογος δεδομένων για τη MySQL.command: αυτή η οδηγία καθορίζει μια εντολή που θα παρακάμψει την προεπιλεγμένη οδηγία CMD (CMD instruction) για την εικόνα. Έχουμε προσθέσει μια επιλογή στην τυπική εντολήmysqldτης εικόνας Docker που εκκινεί τον διακομιστή MySQL μέσα στο κοντέινερ. Η επιλογή που προσθέσαμε είναι η--default-authentication-plugin=mysql_native_password, η οποία ενημερώνει το προεπιλεγμένο πρόσθετο ελέγχου ταυτότητας για τη MySQL ώστε να χρησιμοποιεί έλεγχο ταυτότητας με κωδικό πρόσβασης (mysql_native_password). Αυτό είναι απαραίτητο για να λειτουργήσει η PHP (η εφαρμογή WordPress), επειδή χρησιμοποιεί όνομα χρήστη και κωδικό πρόσβασης για πρόσβαση στη βάση δεδομένων. Στις νεότερες εκδόσεις της MySQL, το προεπιλεγμένο πρόσθετο ελέγχου ταυτότητας έχει αλλάξει. Ωστόσο, οι περισσότερες εφαρμογές χρησιμοποιούν έλεγχο ταυτότητας με κωδικό πρόσβασης. Επομένως, πρέπει να αλλάξετε αυτήν τη ρύθμιση για να λειτουργήσει η εφαρμογή.networks: αυτή η οδηγία χρησιμοποιείται για να καθορίσει ότι η υπηρεσίαdbθα πρέπει να συνδεθεί στοapp-network, το οποίο θα ορίσουμε στη συνέχεια του οδηγού.
Στη συνέχεια, ας ορίσουμε τη διαμόρφωση της υπηρεσίας για την εφαρμογή WordPress μας. Θα ονομάσουμε την υπηρεσία και το container_name app. Προσθέστε το ακόλουθο απόσπασμα κώδικα κάτω από τον ορισμό της υπηρεσίας db, έχοντας κατά νου τη σωστή εσοχή:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#Υπηρεσία κώδικα εφαρμογής WordPress app: depends_on: - db image: wordpress:5.1.1-fpm-alpine container_name: app restart: unless-stopped env_file: .env environment: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=$MYSQL_USER - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD - WORDPRESS_DB_NAME=wordpress volumes: - app:/var/www/html networks: - app-network |
Όπως ακριβώς κάναμε και με την υπηρεσία db, έχουμε ονομάσει το container μας και έχουμε ορίσει την πολιτική επανεκκίνησης. Μερικές ακόμη επιλογές που προσθέσαμε ορίζονται παρακάτω:
depends_on: αυτή η οδηγία διασφαλίζει ότι τα containers ξεκινούν με σειρά εξάρτησης. Στη δική μας περίπτωση, το containerappεξαρτάται από το containerdb. Επομένως, θα ξεκινήσει αφού ξεκινήσει το containerdb. Αυτό πρέπει να γίνει με αυτή τη σειρά επειδή η εφαρμογή WordPress εξαρτάται από τη διαθεσιμότητα μιας βάσης δεδομένων MySQL για να λειτουργήσει.image: όπως φαίνεται στο απόσπασμα κώδικα, θα χρησιμοποιήσουμε την εικόνα WordPress έκδοση 5.1.1 fpm alpine εικόνα. Είχαμε εξηγήσει σχετικά με τον επεξεργαστήphp-fpmπου απαιτεί ο Nginx για την επεξεργασία PHP. Αυτή η εικόνα φροντίζει για αυτό. Η εικόνα alpine που βασίζεται στο έργο Alpine Linux βοηθά στη διατήρηση του μεγέθους της εικόνας μικρότερου. Εάν χρειάζεστε περισσότερες πληροφορίες σχετικά με τις παραλλαγές εικόνων, μπορείτε να ακολουθήσετε αυτόν τον σύνδεσμο για τις εικόνες WordPress στο Docker Hub.env_file: καθορίζει τη θέση του αρχείου.envπου περιέχει τα διαπιστευτήρια της βάσης δεδομένων.environment: αυτή η οδηγία ορίζει πρόσθετες μεταβλητές περιβάλλοντος. Για τη δική μας περίπτωση, ορίζουμε τις μεταβλητές που αναμένει το WordPress και τους εκχωρούμε τις τιμές των μεταβλητών από το αρχείο μας.env. Αυτές είναι οιWORDPRESS_DB_USER,WORDPRESS_DB_PASSWORD, καιWORDPRESS_DB_HOSTη οποία αναφέρεται στον διακομιστή MySQL που εκτελείται στο containerdb, προσβάσιμο από την προεπιλεγμένη θύρα της MySQL3306. Τέλος, βλέπετε τη μεταβλητήWORDPRESS_DB_NAMEτην οποία έχουμε ορίσει σε wordpress. Η ίδια τιμή καθορίζεται στον ορισμό της υπηρεσίας MySQL στο container db:MYSQL_DATABASE=wordpress.volumes: αυτή η οδηγία προσαρτά έναν τόμο που ονομάζεται app στο σημείο προσάρτησης/var/www/html, το οποίο δημιουργήθηκε από την εικόνα WordPress. Η ονομασία των τόμων επιτρέπει την κοινή χρήση του κώδικα της εφαρμογής με άλλα containers.networks: τέλος, προσθέτουμε το container app στοapp-networkγια να διασφαλίσουμε ότι επικοινωνεί με άλλα containers στο δίκτυο.
Αυτά είναι όλα για το container της υπηρεσίας app για την εικόνα WordPress. Ας ορίσουμε τώρα την υπηρεσία webserver για την εικόνα Nginx. Αρχικά, προσθέστε το ακόλουθο απόσπασμα κώδικα κάτω από τον ορισμό της υπηρεσίας app στο αρχείο σας docker-compose.yml :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#Υπηρεσία Webserver Nginx webserver: depends_on: - app image: nginx:1.15.12-alpine container_name: webserver restart: unless-stopped ports: - "80:80" volumes: - app:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt networks: - app-network |
Έχουμε ήδη εξηγήσει την επιλογή depends_on. Στην περίπτωση αυτής της υπηρεσίας webserver, το container θα ξεκινήσει αφού ξεκινήσει το container app. Το container του web server βασίζεται στην εικόνα alpine Nginx. Έχει παρόμοια πολιτική επανεκκίνησης με τους προηγούμενους ορισμούς υπηρεσιών. Οι άλλες επιλογές στον ορισμό της υπηρεσίας webserver περιλαμβάνουν:
ports: συνδέει τις θύρες μεταξύ του κεντρικού υπολογιστή και του κοντέινερ. Στο Βήμα 1, είχαμε ορίσει τη θύρα80στο αρχείοnginx.conf. Αυτή η θύρα αντιστοιχίζεται στη θύρα80στο κοντέινερ.volumes: έχουμε έναν συνδυασμό από bind mounts και επώνυμους τόμους κάτω από αυτήν την επιλογή:app:/var/www/html: αυτός ο ορισμός τόμου προσαρτά την εφαρμογή WordPress στον κατάλογο/var/www/htmlτον οποίο νωρίτερα είχαμε ορίσει ως root στο server block του Nginx../nginx-conf:/etc/nginx/conf.d: αυτός ο ορισμός προσαρτά (bind mount) τον κατάλογο ρυθμίσεων του Nginx στον κεντρικό υπολογιστή στον κατάλογο ρυθμίσεων του Nginx που ορίσαμε για το κοντέινερ. Επομένως, οποιεσδήποτε αλλαγές στον κεντρικό υπολογιστή αντικατοπτρίζονται αυτόματα στο κοντέινερ.certbot-etc:/etc/letsencrypt: αυτός ο ορισμός προσαρτά τα πιστοποιητικά και τα κλειδιά του Let’s Encrypt για το domain στον κατάλληλο κατάλογο στο κοντέινερ.
networks: όπως και στους προηγούμενους ορισμούς υπηρεσιών, η οδηγίαnetworksπροσθέτει την υπηρεσία webserver στοapp-networks.
Αφού τελειώσαμε με τον ορισμό του webserver, ας προσθέσουμε οδηγίες για την υπηρεσία Certbot. Αυτή θα αναλάβει τη λήψη των πιστοποιητικών TLS/SSL από το Let’s Encrypt. Αν θέλετε να μάθετε περισσότερα σχετικά με την ασφάλεια ενός διακομιστή Nginx, αυτός ο οδηγός για το πώς να ασφαλίσετε το Nginx με το Let’s Encrypt είναι μια καλή πηγή.
Στη συνέχεια, προσθέστε το ακόλουθο απόσπασμα κώδικα κάτω από την υπηρεσία webserver. Θυμηθείτε να ορίσετε το σωστό όνομα domain και τη διεύθυνση email σας:
|
1 2 3 4 5 6 7 8 9 10 |
#certbot service certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - app:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email hackins@cloudsigma.com --agree-tos --no-eff-email --staging -d example.com -d www.example.com |
Η εικόνα certbot θα ξεκινήσει μόνο αφού ξεκινήσει ο webserver, λόγω της οδηγίας depends_on. Το Docker Compose θα λάβει την εικόνα Certbot από το Docker Hub όπως έχει οριστεί.
Κάτω από τον ορισμό των τόμων (volumes), το κοντέινερ Certbot θα μοιράζεται τα πιστοποιητικά και το κλειδί του domain στο certbot-etc με το κοντέινερ του Nginx webserver και τον κώδικα της εφαρμογής με το κοντέινερ app.
Κάτω από τον ορισμό command, έχουμε καθορίσει μια υποεντολή για την εκτέλεση της προεπιλεγμένης εντολής Certbot του κοντέινερ certonly με πρόσθετες επιλογές όπως αναφέρονται παρακάτω:
-
--webroot: καθορίζει τη χρήση του πρόσθετου webroot, το οποίο τοποθετεί αρχεία στον φάκελο webroot για πιστοποίηση.--webroot-path: καθορίζει τη διαδρομή του καταλόγου webroot.--agree-tos: καθορίζει ότι συμφωνείτε με τους Όρους Χρήσης του ACME.--no-eff-email: καθορίζει ότι δεν θέλετε να κοινοποιήσετε το email σας στο EFF. Μπορείτε να το παραλείψετε αν θέλετε να το κοινοποιήσετε.--staging: λέει στο Certbot ότι θέλετε πρώτα να λάβετε δοκιμαστικά πιστοποιητικά από το περιβάλλον staging του Let’s Encrypt για να δοκιμάσετε τις ρυθμίσεις σας πριν αποκτήσετε το πραγματικό πιστοποιητικό. Το Let’s Encrypt έχει όρια ρυθμού αιτημάτων για domain (rate limiting). Επομένως, η δοκιμή των ρυθμίσεών σας πρώτα θα σας βοηθήσει να αποφύγετε την επιβολή ορίων στο domain σας.-d: αυτή η επιλογή δέχεται τα ονόματα domain για το αίτημα πιστοποιητικού. Σε αυτόν τον οδηγό, έχουμε συμπεριλάβει ταexample.comκαιwww.example.com. Παρακαλούμε καθορίστε το δικό σας πραγματικό καταχωρημένο domain.
Το αρχείο μας docker-compose.yml είναι σχεδόν έτοιμο. Ωστόσο, πρέπει επίσης να προσθέσετε τους ορισμούς δικτύου και τόμων κάτω από την υπηρεσία Certbot:
|
1 2 3 4 5 6 7 8 9 10 |
#Volumes volumes: certbot-etc: app: dbdata: #Networks networks: app-network: driver: bridge |
Το κλειδί volumes ορίζει τους τόμους που θα μοιράζονται όλες οι υπηρεσίες (κοντέινερ) που ορίζονται σε αυτό το αρχείο compose: certbot-etc, app, και dbdata. Τα περιεχόμενα των τόμων που δημιουργεί το Docker αποθηκεύονται σε έναν κατάλογο που διαχειρίζεται το Docker στο σύστημα αρχείων του κεντρικού υπολογιστή: /var/lib/docker/volumes/. Τα περιεχόμενα κάθε volume προσαρτώνται στη συνέχεια σε οποιοδήποτε container χρησιμοποιεί το volume. Αυτό καθιστά δυνατή την κοινή χρήση δεδομένων και κώδικα μεταξύ των containers.
Το networks κλειδί ορίζει το δίκτυο γέφυρας (bridge network) που επιτρέπει την επικοινωνία μεταξύ των containers. Containers στο ίδιο δίκτυο γέφυρας, όπως το webserver και db μπορούν να επικοινωνούν με ασφάλεια μέσω θυρών χωρίς να εκθέτουν την κίνηση στο εξωτερικό δίκτυο. Εκθέτουμε μόνο τη θύρα 80 για να επιτρέψουμε την πρόσβαση στις σελίδες του front-end ιστότοπου.
Το πλήρες docker-compose.yml αρχείο θα μοιάζει με αυτό:
|
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
version: '3' services: #Υπηρεσία MySQL db: image: mysql:8.0 container_name: db restart: unless-stopped env_file: .env environment: - MYSQL_DATABASE=wordpress volumes: - dbdata:/var/lib/mysql command: '--default-authentication-plugin=mysql_native_password' networks: - app-network #Υπηρεσία κώδικα εφαρμογής WordPress app: depends_on: - db image: wordpress:5.1.1-fpm-alpine container_name: app restart: unless-stopped env_file: .env environment: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=$MYSQL_USER - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD - WORDPRESS_DB_NAME=wordpress volumes: - app:/var/www/html networks: - app-network #Υπηρεσία Webserver Nginx webserver: depends_on: - app image: nginx:1.15.12-alpine container_name: webserver restart: unless-stopped ports: - "80:80" volumes: - app:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt networks: - app-network #Υπηρεσία certbot certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - app:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email hackins@cloudsigma.com --agree-tos --no-eff-email --staging -d example.com -d www.example.com #Volumes volumes: certbot-etc: app: dbdata: #Networks networks: app-network: driver: bridge |
Μπορείτε να αποθηκεύσετε και να κλείσετε το αρχείο. Στο επόμενο βήμα, θα ξεκινήσουμε και θα δοκιμάσουμε το container και τα αιτήματα πιστοποιητικών.
Βήμα 4: Εκτέλεση των Containers και Απόκτηση Πιστοποιητικών SSL
Το μεγαλύτερο πλεονέκτημα του Docker Compose είναι ότι, μόλις ορίσετε όλες τις υπηρεσίες σας στο docker-compose.yml αρχείο, μπορείτε να εκκινήσετε όλα τα κοντέινερ με μία μόνο εντολή: docker-compose up. Η εντολή εκτελεί κάθε οδηγία που καθορίζεται. Εάν τα αιτήματα τομέα είναι επιτυχή, θα πρέπει να μπορείτε να δείτε τη σωστή κατάσταση εξόδου στο τερματικό σας. Εισαγάγετε την ακόλουθη εντολή για να δημιουργήσετε τα κοντέινερ. Η -d σημαία χρησιμεύει για την εκτέλεση των κοντέινερ στο παρασκήνιο:
|
1 |
docker-compose up -d |
Εάν δείτε την έξοδο όπως στο παρακάτω στιγμιότυπο οθόνης, τότε οι υπηρεσίες δημιουργήθηκαν με επιτυχία:
Για να επιβεβαιώσετε την κατάσταση των υπηρεσιών, εκτελέστε την εντολή docker-compose ps :
|
1 |
docker-compose ps |
Η έξοδος της εντολής είναι όπως φαίνεται παρακάτω εάν όλα ήταν επιτυχή. Η κατάσταση των κοντέινερ app, db, και webserver θα πρέπει να είναι up, και το κοντέινερ certbot θα πρέπει να έχει κατάσταση Exit0:
Εάν δείτε οτιδήποτε άλλο εκτός από Up στη στήλη κατάστασης για τα app, db ή webserver, ή μια κατάσταση Exit που δεν είναι 0 για το κοντέινερ certbot, τότε κάτι πήγε στραβά. Μπορείτε να ελέγξετε τα αρχεία καταγραφής κάθε κοντέινερ χρησιμοποιώντας την εντολή docker-compose logs, και να καθορίσετε το service_name:
|
1 |
docker-compose logs service_name |
Για παράδειγμα, μπορείτε να ελέγξετε τα αρχεία καταγραφής του κοντέινερ certbot εισάγοντας την ακόλουθη εντολή:
|
1 |
docker-compose logs certbot |
Για να ελέγξετε αν τα πιστοποιητικά έχουν προσαρτηθεί στο κοντέινερ webserver, χρησιμοποιήστε την εντολή docker-compose exec:
|
1 |
docker-compose exec webserver ls -la /etc/letsencrypt/live |
Εάν χρησιμοποιήσατε ένα πραγματικό καταχωρημένο όνομα τομέα διαφορετικό από το example.com και τα αιτήματα πιστοποιητικών ήταν επιτυχή, θα πρέπει να δείτε μια έξοδο παρόμοια με αυτή:
Μόλις επιβεβαιώσετε ότι το αίτημα πιστοποιητικού ήταν επιτυχές, μπορείτε να επεξεργαστείτε το αρχείο docker-compose.yml και να αφαιρέσετε τη σημαία --staging. Ανοίξτε το αρχείο με nano:
|
1 |
nano docker-compose.yml |
Κυλήστε προς τα κάτω στην ενότητα ορισμού της υπηρεσίας Certbot, στην επιλογή command και αντικαταστήστε τη σημαία --staging με τη σημαία --force-renewal. Αυτό ενημερώνει το Certbot ότι ζητάτε ανανέωση πιστοποιητικού για ένα πιστοποιητικό του ίδιου τομέα. Ο ορισμός της υπηρεσίας Certbot θα πρέπει τώρα να μοιάζει κάπως έτσι:
|
1 2 3 4 5 6 7 8 9 10 |
#certbot service certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - app:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email hackins@cloudsigma.com --agree-tos --no-eff-email --force-renewal -d example.com -d www.example.com |
Αποθηκεύστε το αρχείο όταν ολοκληρώσετε την επεξεργασία.
Εισαγάγετε την ακόλουθη εντολή για να αναδημιουργήσετε το κοντέινερ certbot. Η συμπεριλαμβανόμενη σημαία --no-deps λέει στο Compose να παραλείψει την επανεκκίνηση της υπηρεσίας του διακομιστή ιστού, καθώς εκτελείται ήδη:
|
1 |
docker-compose up --force-recreate --no-deps Certbot |
Η εντολή παράγει το ακόλουθο στιγμιότυπο οθόνης, που δείχνει ότι το αίτημα πιστοποιητικού ήταν επιτυχές:
Αυτό είναι όλο για αυτό το βήμα. Στο επόμενο βήμα, θα τροποποιήσετε το αρχείο ρυθμίσεων του Nginx για να συμπεριλάβετε το πιστοποιητικό SSL.
Βήμα 5: Ενεργοποίηση SSL στις Ρυθμίσεις Nginx και στον Ορισμό Υπηρεσίας
Για να κάνετε το Nginx να εξυπηρετεί την κίνηση μέσω ασφαλούς SSL, θα τροποποιήσετε πρώτα το αρχείο ρυθμίσεων του Nginx για να προσθέσετε μια ανακατεύθυνση HTTP σε HTTPS. Στη συνέχεια, πρέπει να καθορίσετε τις τοποθεσίες του πιστοποιητικού και του κλειδιού, και τέλος να προσθέσετε παραμέτρους ασφαλείας και κεφαλίδες.
Πριν τροποποιήσετε το αρχείο ρυθμίσεων, θα πρέπει να λάβετε τις προτεινόμενες παραμέτρους ασφαλείας Nginx από το αποθετήριο GitHub του Certbot χρησιμοποιώντας το curl με την ακόλουθη εντολή:
|
1 |
curl -sSLo nginx-conf/options-ssl-nginx.conf |
Η εντολή εκτελείται και αποθηκεύει τις παραμέτρους που αντλεί σε ένα αρχείο που ονομάζεται options-ssl-nginx.conf, μέσα στον nginx-conf κατάλογο. Καταργήστε το αρχείο ρυθμίσεων του Nginx, ώστε να μπορέσουμε να δημιουργήσουμε ένα νέο με τις ακόλουθες εντολές:
|
1 2 |
rm nginx-conf/nginx.conf nano nginx-conf/nginx.conf |
Στο κενό πλέον nginx.conf αρχείο, προσθέστε τον ακόλουθο κώδικα που περιλαμβάνει μια ανακατεύθυνση από HTTP προς HTTPS, SSL πρωτόκολλα διαπιστευτηρίων και κεφαλίδες ασφαλείας. Όπως κάνατε και νωρίτερα, αντικαταστήστε το example.com domain με το δικό σας κατοχυρωμένο domain:
|
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
server { listen 80; listen [::]:80; server_name example.com www.example.com; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { rewrite ^ https://$host$request_uri? permanent; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com www.example.com; index index.php index.html index.htm; root /var/www/html; server_tokens off; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include /etc/nginx/conf.d/options-ssl-nginx.conf; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Ασφάλεια-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always; # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # ενεργοποιήστε το strict transport security μόνο εάν κατανοείτε τις επιπτώσεις location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } } |
Στο πρώτο server block που διαχειρίζεται μη ασφαλή αιτήματα χρησιμοποιώντας τη θύρα 80, καθορίζουμε το webroot για αιτήματα ανανέωσης του Certbot. Περιλαμβάνουμε επίσης μια οδηγία ανακατεύθυνσης που ανακατευθύνει τα αιτήματα HTTP σε HTTPS.
Το δεύτερο server block διαχειρίζεται την ασφαλή κίνηση HTTPS που έρχεται στη θύρα 443. Όπως μπορείτε να δείτε, ενεργοποιούμε επίσης το SSL και το HTTP2. Το HTTP/2 βελτιώνει την απόδοση του διακομιστή σας. Μπορείτε να διαβάσετε περισσότερα γι' αυτό από τα επίσημα έγγραφα του Nginx για το HTTP/2.
Σε αυτό το block, έχουμε επίσης καθορίσει ότι το Nginx περιλαμβάνει τις τοποθεσίες του πιστοποιητικού SSL και του κλειδιού, καθώς και τις προτεινόμενες παραμέτρους ασφαλείας του Certbot που curl αποθήκευσε στο nginx-conf/options-ssl-nginx.conf κατάλογο.
Οι πρόσθετες κεφαλίδες ασφαλείας χρησιμεύουν στη βελτίωση της βαθμολογίας του ιστότοπού σας σε ιστότοπους δοκιμών ασφαλείας όπως το Security Headers και το SSL Labs. Μπορείτε να ακολουθήσετε τους συνδέσμους σε αυτές τις κεφαλίδες για να μάθετε περισσότερα: X-Frame-Options, Referrer Policy, X-Content-Type-Options, X-XSS-Protection, Content-Security-Policy. Έχουμε θέσει σε σχόλιο την κεφαλίδα HTTP Strict Transport Security (HSTS). Είστε ελεύθεροι να διαβάσετε σχετικά με τη λειτουργία preload και να αποφασίσετε αν θέλετε να την ενεργοποιήσετε.
Οι υπόλοιπες οδηγίες όπως οι root, index, και τα ειδικά για το WordPress location blocks παραμένουν όπως συζητήθηκαν στο Βήμα 1. Μπορείτε τώρα να αποθηκεύσετε και να κλείσετε το αρχείο όταν ολοκληρώσετε την επεξεργασία.
Τώρα που έχουμε ενεργοποιήσει την κίνηση HTTPS που χρησιμοποιεί τη θύρα 443, πρέπει επίσης να ενεργοποιήσουμε τη θύρα στον ορισμό υπηρεσίας του web server. Εισαγάγετε την ακόλουθη εντολή για να ανοίξετε το αρχείο docker-compose.yml με το nano:
|
1 |
nano docker-compose.yml |
Στην ενότητα web server κάτω από την επιλογή ports, προσθέστε μια αντιστοίχιση για τη θύρα 443 όπως επισημαίνεται παρακάτω:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
webserver: depends_on: - app image: nginx:1.15.12-alpine container_name: webserver restart: unless-stopped ports: - "80:80" - "443:443" volumes: - app:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt networks: - app-network |
Το πλήρες αρχείο docker-compose.yml θα πρέπει τώρα να μοιάζει με αυτό:
|
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
έκδοση: '3' υπηρεσίες: #Υπηρεσία MySQL db: εικόνα: mysql:8.0 container_name: db επανεκκίνηση: εκτός αν-σταματήσει env_file: .env περιβάλλον: - MYSQL_DATABASE=wordpress τόμοι: - dbdata:/var/lib/mysql εντολή: '--default-authentication-plugin=mysql_native_password' δίκτυα: - app-δικτύου #Υπηρεσία κώδικα εφαρμογής WordPress app: depends_on: - db εικόνα: wordpress:5.1.1-fpm-alpine container_name: app επανεκκίνηση: εκτός αν-σταματήσει env_file: .env περιβάλλον: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=$MYSQL_USER - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD - WORDPRESS_DB_NAME=wordpress τόμοι: - app:/var/www/html δίκτυα: - app-δικτύου #Υπηρεσία Webserver Nginx webserver: depends_on: - app εικόνα: nginx:1.15.12-alpine container_name: webserver επανεκκίνηση: εκτός αν-σταματήσει θύρες: - "80:80" - "443:443" τόμοι: - app:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt δίκτυα: - app-δικτύου #Υπηρεσία certbot certbot: depends_on: - webserver εικόνα: certbot/certbot container_name: certbot τόμοι: - certbot-etc:/etc/letsencrypt - app:/var/www/html εντολή: certonly --webroot --webroot-διαδρομή=/var/www/html --email hackins@cloudsigma.com --συμφωνώ-tos --όχι-eff-email --εξαναγκασμός-ανανέωση -d example.com -d www.example.com #Τόμοι τόμοι: certbot-etc: app: dbdata: #Δίκτυα δίκτυα: app-δικτύου: πρόγραμμα οδήγησης: γέφυρα |
Μόλις επιβεβαιώσετε ότι όλα φαίνονται σωστά, αποθηκεύστε και κλείστε το αρχείο. Μετά από αυτό, εκτελέστε την ακόλουθη εντολή για να αναδημιουργήσετε την webserver υπηρεσία:
|
1 |
docker-compose up -d --force-recreate --no-deps webserver |
|
1 |
docker-compose ps |
Τώρα που όλα τα container σας εκτελούνται, είναι δυνατό να προχωρήσετε στη ρύθμιση του WordPress από τη διεπαφή ιστού.
Βήμα 6: Ολοκληρώστε τη Ρύθμιση του WordPress από τη Διεπαφή Ιστού
Μεταβείτε στο όνομα τομέα του διακομιστή σας για να συνεχίσετε την εγκατάσταση. Θα πρέπει να δείτε την αρχική σελίδα εγκατάστασης του WordPress. Σας καλωσορίζει να επιλέξετε τη γλώσσα σας πριν συνεχίσετε:
Επιλέξτε τη γλώσσα σας και κάντε κλικ στο Συνέχεια για να μεταβείτε στην επόμενη σελίδα:
Σε αυτήν τη σελίδα, συμπληρώστε τον τίτλο του ιστότοπού σας, επιλέξτε ένα εύκολο στη μνήμη όνομα χρήστη και έναν ισχυρό κωδικό πρόσβασης. Συνιστάται να μην χρησιμοποιήσετε το Admin ως όνομα χρήστη για λόγους ασφαλείας. Εισαγάγετε το email σας και κάντε κλικ στο κουμπί Εγκατάσταση WordPress για να ξεκινήσει η εγκατάσταση του WordPress.
Μόλις ολοκληρωθεί η εγκατάσταση, θα μεταφερθείτε στην οθόνη σύνδεσης όπου θα εισαγάγετε το όνομα χρήστη και τον κωδικό πρόσβασης που είχατε ορίσει. Όταν εισαγάγετε τα έγκυρα διαπιστευτήρια, θα πρέπει να μπορείτε να δείτε τον πίνακα ελέγχου του WordPress:
Έχετε πλέον εγκαταστήσει με επιτυχία το WordPress! Στη συνέχεια, πρέπει να ακολουθήσετε τα βήματα για να διασφαλίσετε ότι τα πιστοποιητικά SSL θα ανανεώνονται αυτόματα.
Βήμα 7: Ρύθμιση αυτόματης ανανέωσης πιστοποιητικού SSL
Τα πιστοποιητικά TLS/SSL της Let’s Encrypt ισχύουν μόνο για 90 ημέρες. Εναπόκειται σε εσάς να δημιουργήσετε μια ρύθμιση αυτόματης ανανέωσης για να διασφαλίσετε ότι δεν θα λήξουν. Μπορείτε να το επιτύχετε αυτό δημιουργώντας ένα σενάριο και προγραμματίζοντάς το με το εργαλείο cron job. Σε αυτό το βήμα, θα σας δείξουμε πώς να δημιουργήσετε ένα σενάριο που θα ανανεώνει τα πιστοποιητικά. Στη συνέχεια, θα το προγραμματίσουμε με το εργαλείο cron job ώστε να εκτελείται περιοδικά και να ανανεώνει τα πιστοποιητικά εάν πλησιάζει η ημερομηνία λήξης τους.
Μέσα στον κατάλογο έργου wordpress_docker, ανοίξτε ένα σενάριο με όνομα ssl_renewer.sh με το nano:
|
1 |
nano ssl_renewer.sh |
Προσθέστε τον ακόλουθο κώδικα στο σενάριο για να χειριστείτε την αυτόματη ανανέωση και την επαναφόρτωση των ρυθμίσεων του Nginx. Θυμηθείτε να αντικαταστήσετε το επισημασμένο όνομα χρήστη με το δικό σας όνομα χρήστη που δεν είναι root:
|
1 2 3 4 5 6 7 8 |
#!/bin/bash COMPOSE="/usr/local/bin/docker-compose –ansi never" DOCKER="/usr/bin/docker" cd /home/hackins/wordpress_docker/ $COMPOSE run certbot renew --dry-run && $COMPOSE kill -s SIGHUP webserver $DOCKER system prune -af |
Σε αυτό το σενάριο, αντιστοιχίζουμε το εκτελέσιμο docker-compose σε μια μεταβλητή με όνομα COMPOSE. Περιλαμβάνουμε επίσης την επιλογή –ansi never η οποία λέει στο σενάριο να εκτελεί τις εντολές docker-compose χωρίς χαρακτήρες ANSI control. Επιπλέον, αντιστοιχίζουμε το εκτελέσιμο του Docker σε μια μεταβλητή με όνομα DOCKER.
Στη συνέχεια, το σενάριο μεταβαίνει στον κατάλογο του έργου μας wordpress_docker και εκτελεί τις ακόλουθες εντολές:
docker-compose run: εκκινεί το container του certbot και παρακάμπτει την εντολή που είχαμε ορίσει στον ορισμό της υπηρεσίας certbot. Αντί να εκτελέσει την υποεντολή certonly, εκτελεί την υποεντολή renew η οποία θα ανανεώσει τα πιστοποιητικά SSL/TLS από τη Let’s Encrypt εάν πρόκειται να λήξουν.docker-compose kill: στέλνει ένα σήμα SIGHUP στο containerwebserverγια να επαναφορτώσει τις ρυθμίσεις του Nginx. Ίσως θέλετε να δείτε αυτόν τον οδηγό από το Docker σχετικά με το πώς να χρησιμοποιήσετε την επίσημη εικόνα Docker του Nginx.docker system prune: αυτή η εντολή αφαιρεί όλα τα μη χρησιμοποιούμενα containers και εικόνες.
Αποθηκεύστε και κλείστε το αρχείο όταν τελειώσετε την επεξεργασία. Στη συνέχεια, εκτελέστε την ακόλουθη εντολή για να το κάνετε εκτελέσιμο:
|
1 |
chmod +x ssl_renewer.sh |
Αφού το κάνετε εκτελέσιμο, ανοίξτε το αρχείο crontab του root για να εκτελείτε το σενάριο περιοδικά στα διαστήματα που θα καθορίσουμε:
|
1 |
sudo crontab -e |
Το crontab σας ζητά να επιλέξετε τον προτιμώμενο επεξεργαστή κειμένου εάν είναι η πρώτη φορά που το χρησιμοποιείτε:
Επιλέξτε τον προτιμώμενο επεξεργαστή κειμένου και πατήστε Enter για να ανοίξετε το αρχείο. Στο κάτω μέρος του αρχείου, προσθέστε την ακόλουθη γραμμή:
|
1 |
*/5 * * * * /home/hackins/wordpress_docker/ssl_renewer.sh >> /var/log/cron_docker.log 2>&1 |
Αυτό ορίζει το διάστημα στα πέντε λεπτά για να μπορέσουμε να ελέγξουμε αν το σενάριο ανανέωσης θα λειτουργήσει ή όχι. Έχουμε επίσης καθορίσει ένα αρχείο καταγραφής (log file) που θα περιέχει τα αποτελέσματα από την εργασία: cron_docker.log.
Περιμένετε πέντε λεπτά και ελέγξτε το cron.log για να δείτε αν το script ήταν επιτυχές με το αίτημα ανανέωσης:
|
1 |
tail -f /var/log/cron_docker.log |
Θα πρέπει να δείτε κάτι παρόμοιο με το παρακάτω στιγμιότυπο οθόνης εάν τα αιτήματα ήταν επιτυχή:
Τώρα που το δοκιμάσαμε και επιβεβαιώσαμε ότι λειτουργεί, μπορείτε να τροποποιήσετε το crontab αρχείο για να ορίσετε μια καθημερινή ανανέωση. Για παράδειγμα, μπορεί να θέλετε να ορίσετε ότι το script εκτελείται κάθε μέρα στις 6 μ.μ. Για να το κάνετε αυτό, τροποποιήστε την τελευταία γραμμή του crontab ώστε να μοιάζει με αυτό:
|
1 |
0 18 * * * /home/hackins/wordpress_docker/ssl_renewer.sh >> /var/log/cron_docker.log 2>&1 |
Επιπλέον, πρέπει να αφαιρέσετε τη σημαία –dry-run από το ssl_renewer.sh script για να διασφαλίσετε ότι η πραγματική ανανέωση πραγματοποιείται όταν εκτελείται. Θα πρέπει να μοιάζει κάπως έτσι:
|
1 2 3 4 5 6 7 8 |
#!/bin/bash COMPOSE="/usr/local/bin/docker-compose --ansi never" DOCKER="/usr/bin/docker" cd /home/hackins/wordpress_docker/ $COMPOSE run certbot renew && $COMPOSE kill -s SIGHUP webserver $DOCKER system prune -af |
Στη συνέχεια, αποθηκεύστε και κλείστε το αρχείο. Έχοντας κάνει αυτό, η εργασία cron θα διατηρήσει τα scripts σας έγκυρα, ανανεώνοντάς τα πριν από το τέλος των 90 ημερών.
Συμπέρασμα
Αν έχετε φτάσει ως εδώ στο σεμινάριο, μπορείτε να θεωρήσετε τον εαυτό σας ένα βήμα πιο κοντά στο να γίνετε Μηχανικός DevOps. Μπορέσατε να δημιουργήσετε ένα σενάριο ρυθμίσεων Nginx, δημιουργήσατε ένα docker-compose.yml αρχείο και ορίσατε αρκετές υπηρεσίες απαραίτητες για την εκτέλεση μιας εφαρμογής WordPress με το Docker και το Docker Compose. Λάβατε πιστοποιητικά SSL/TLS από το Let’s Encrypt για να διασφαλίσετε ότι ο διακομιστής ιστού σας είναι ασφαλής. Τέλος, δημιουργήσατε μια εργασία cron για να διασφαλίσετε ότι τα πιστοποιητικά δεν λήγουν. Καλή δουλειά!
Αν προσπαθείτε να εμβαθύνετε στο DevOps, ρίξτε μια ματιά σε περισσότερους πόρους για containers από το blog μας:
- Γνωρίζοντας το Kubernetes
- Πώς να αναπτύξετε μια εφαρμογή Node.js (Express.js) με το Docker στο Ubuntu 20.04
- Ανάπτυξη μιας εφαρμογής PHP σε ένα Kubernetes Cluster με Ubuntu 18.04.
- Ανάπτυξη Laravel, Nginx και MySQL με το Docker Compose
Καλή συνέχεια!










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