Διαμόρφωση του εργασιακού μας περιβάλλοντος
Διαμόρφωση του κοντέινερ PHP
Διαμόρφωση του κοντέινερ Nginx
Διαμόρφωση του κοντέινερ MySQL
Δημιουργία της εφαρμογής μας
συμπέρασμα
Οι εφαρμογές PHP συνήθως αποτελούνται από έναν διακομιστή ιστού, ένα σύστημα σχεσιακής βάσης δεδομένων και τον ίδιο τον διερμηνέα γλώσσας. Σε αυτό το σεμινάριο θα αξιοποιήσουμε μια πλήρη στοίβα εφαρμογών PHP χρησιμοποιώντας docker. Αυτό είναι ένα σε βάθος σεμινάριο στο οποίο πρόκειται να δημιουργήσουμε και να ενορχηστρώσουμε κοντέινερ για τον Nginx (τον διακομιστή ιστού), τη MySQL (το σύστημα βάσης δεδομένων) και την PHP.
Για χάρη αυτού του σεμιναρίου, θα γράψουμε μια απλή εφαρμογή που διαβάζει μια λίστα πόλεων από μια βάση δεδομένων και την εμφανίζει σε μια ιστοσελίδα, με αυτόν τον τρόπο θα παρουσιάσουμε μια βασική, αλλά λειτουργική, εφαρμογή PHP.
Αυτός ο οδηγός προϋποθέτει ότι έχετε ήδη εγκαταστήσει το Docker-CE και τουλάχιστον μια ελάχιστη γνώση εργασίας του docker. Για αυτό το θέμα, μπορείτε να διαβάσετε τα ακόλουθα σεμινάρια:
Διαμόρφωση του εργασιακού μας περιβάλλοντος
Μια πραγματική εφαρμογή που βασίζεται σε docker θα αποτελείται συνήθως από πολλά κοντέινερ. Η χειροκίνητη διαχείριση τους μπορεί εύκολα να γίνει αρκετά ακατάστατη και δυσκίνητη. Εκεί παίζει ρόλο το docker-compose. Σας βοηθά να διαχειριστείτε έναν αριθμό κοντέινερ μέσω ενός απλού yaml
αρχείου διαμόρφωσης.
Εγκαταστήστε το docker-compose.
curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Δημιουργήστε έναν φάκελο για να κρατήσετε όλα τα απαραίτητα αρχεία αυτού του παραδείγματος και μετά cd
σε αυτόν. Από εδώ και στο εξής, αυτός είναι ο κατάλογος εργασίας μας και κάθε εντολή θα εκτελείται μέσα σε αυτόν τον φάκελο και κάθε διαδρομή θα αναφέρεται σε αυτόν. Αυτός ο φάκελος μπορεί να αναφέρεται αργότερα ως WORKING_DIR
.
mkdir ~/docker
cd ~/docker
Τώρα δημιουργήστε άλλους τρεις φακέλους.
mkdir php nginx app
Ο php
φάκελος είναι όπου θα δημιουργήσουμε την προσαρμοσμένη εικόνα PHP, ο nginx
φάκελος θα περιέχει τα απαραίτητα αρχεία για την προσαρμοσμένη εικόνα nginx και ο app
φάκελος είναι όπου θα τοποθετήσουμε τον πηγαίο κώδικα και τη διαμόρφωση του δείγματος της εφαρμογής μας.
Διαμόρφωση του κοντέινερ PHP
Σε αυτό το παράδειγμα, θα χρησιμοποιήσουμε php-fpm
για να συνδεθούμε στον διακομιστή ιστού Nginx. Θα χρησιμοποιήσουμε την επίσημη εικόνα βάσης PHP. Ωστόσο, πρέπει επίσης να εγκαταστήσουμε και να ενεργοποιήσουμε ορισμένες επεκτάσεις ώστε να έχουμε πρόσβαση στη βάση δεδομένων. Μέσα στο php
φάκελο δημιουργήστε ένα αρχείο με το όνομα Dockerfile
και τοποθετήστε τα ακόλουθα περιεχόμενα σε αυτό.
FROM php:7.1-fpm-alpine3.4
RUN apk update --no-cache \
&& apk add --no-cache $PHPIZE_DEPS \
&& apk add --no-cache mysql-dev \
&& docker-php-ext-install pdo pdo_mysql
Σημειώστε ότι χρησιμοποιούμε την Alpine έκδοση της επίσημης εικόνας PHP. Το Alpine είναι μια πολύ μικρή διανομή που στοχεύει σε εμπορευματοκιβώτια παρέχοντας πολύ μικρότερα αποτυπώματα. Επίσης, σημειώστε τη χρήση της εντολής docker-php-ext-install
, η επίσημη εικόνα PHP παρέχει αυτήν την εντολή για να διευκολύνει τη διαδικασία εγκατάστασης και διαμόρφωσης επεκτάσεων PHP.
Τώρα, ας δημιουργήσουμε αυτήν την εικόνα Docker εκδίδοντας τα ακόλουθα (μέσα στο δικό μας WORKING_DIR
):
docker build -t vultr-php php/
Το docker-compose.yml
αρχείο
Όπως ήδη αναφέρθηκε, docker-compose
σας επιτρέπει να διαχειριστείτε έναν αριθμό κοντέινερ μέσω ενός απλού αρχείου διαμόρφωσης. Αυτό το αρχείο ρυθμίσεων συνήθως ονομάζεται docker-compose.yml
. Δημιουργήστε αυτό το αρχείο μέσα στο app
φάκελο.
touch app/docker-compose.yml
Τώρα βάλτε τα ακόλουθα περιεχόμενα σε αυτό το αρχείο.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Θα εξηγήσουμε αυτή τη σύνταξη. Πρώτα, σημειώστε την πρώτη γραμμή.
version: '2'
Αυτό καθορίζει την έκδοση του docker-compose.yml
αρχείου διαμόρφωσης που χρησιμοποιείται. Η επόμενη γραμμή καθορίζει τις υπηρεσίες, ή με άλλα λόγια, τα κοντέινερ που θα παρασχεθούν.
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Σημειώστε ότι κάθε υπηρεσία έχει ένα συγκεκριμένο κλειδί μέσα στο services
μπλοκ. Το όνομα που καθορίζεται εδώ θα χρησιμοποιηθεί για αναφορά σε αυτό το συγκεκριμένο κοντέινερ αργότερα. Σημειώστε επίσης ότι μέσα στη php
διαμόρφωση, ορίζουμε την εικόνα που χρησιμοποιείται για την εκτέλεση του κοντέινερ (αυτή είναι η εικόνα που δημιουργήσαμε προηγουμένως). Ορίζουμε επίσης μια αντιστοίχιση όγκου.
volumes:
- ./:/app
Αυτό λέει docker-compose
να αντιστοιχίσετε τον τρέχοντα κατάλογο ( ./
) στον /app
κατάλογο μέσα στο κοντέινερ. Η τελευταία γραμμή ορίζει τον /app
φάκελο μέσα στο κοντέινερ ως κατάλογο εργασίας, πράγμα που σημαίνει ότι αυτός είναι ο φάκελος από τον οποίο εκτελούνται από προεπιλογή όλες οι μελλοντικές εντολές μέσα σε ένα κοντέινερ.
Μπορούμε τώρα να ενορχηστρώσουμε τα δοχεία μας.
cd ~/docker/app
docker-compose up -d
Μπορείτε να εκτελέσετε την ακόλουθη εντολή για να βεβαιωθείτε ότι το κοντέινερ PHP εκτελέστηκε:
docker ps
Πώς να εκτελέσετε εντολές μέσα στα κοντέινερ
Ακόμα μέσα στο app
φάκελο, μπορούμε να εκτελέσουμε οποιαδήποτε εντολή μέσα σε ένα καθορισμένο κοντέινερ υπηρεσίας με τη βοήθεια της docker-compose
εντολής.
docker-compose exec [service] [command]
Το [service]
σύμβολο κράτησης θέσης αναφέρεται στο κλειδί υπηρεσίας. Στην περίπτωσή μας, αυτό ήταν php
. Ας εκτελέσουμε μια εντολή μέσα στο κοντέινερ για να ελέγξουμε την έκδοση PHP.
docker-compose exec php php -v
Θα δείτε την ακόλουθη έξοδο.
PHP 7.1.14 (cli) (built: Feb 7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
Διαμόρφωση του κοντέινερ Nginx
Ακριβώς όπως το κοντέινερ PHP, πρέπει να δημιουργήσουμε μια προσαρμοσμένη εικόνα για τον διακομιστή ιστού. Αλλά σε αυτήν την περίπτωση, χρειάζεται απλώς να παρέχουμε μια διαμόρφωση για το δικό μας virtual host
. Βεβαιωθείτε ότι είστε μέσα στο WORKING_DIR
δικό μας και δημιουργήστε ένα Dockerfile
μέσα στο nginx
φάκελο:
cd ~/docker
touch nginx/Dockerfile
Τώρα βάλτε το ακόλουθο περιεχόμενο σε αυτό Dockerfile
:
FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf
Χρησιμοποιούμε την προεπιλεγμένη εικόνα Nginx που βασίζεται στο Alpine. Σε αυτό το αρχείο Docker απλώς αντιγράφουμε ένα αρχείο διαμόρφωσης στη ρύθμιση της εφαρμογής μας. Πριν δημιουργήσετε αυτήν την εικόνα, δημιουργήστε ένα αρχείο διαμόρφωσης.
touch nginx/default.conf
Τώρα συμπληρώστε το με αυτό το περιεχόμενο.
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /app;
index index.php;
#server_name server_domain_or_IP;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Σημειώστε ότι στη fastcgi_pass php:9000
γραμμή αναφέρουμε το κοντέινερ PHP με το όνομά του μέσα στο service
μπλοκ του docker-compose.yml
αρχείου διαμόρφωσης. Εσωτερικά docker-compose
δημιουργεί ένα δίκτυο και εκχωρεί το όνομα της υπηρεσίας ως όνομα κεντρικού υπολογιστή σε καθεμία από τις υπηρεσίες που έχουν οριστεί. Μπορούμε τώρα να δημιουργήσουμε την εικόνα Nginx.
docker build -t vultr-nginx nginx/
Ενημέρωση docker-compose.yml
Τώρα ενημερώστε το app/docker-compose.yml
αρχείο.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
web:
image: vultr-nginx
volumes:
- ./:/app
depends_on:
- php
ports:
- 80:80
Έχουμε προσθέσει μόνο μια νέα υπηρεσία. Η διαμόρφωση είναι σχεδόν η ίδια, εκτός από τα ακόλουθα.
depends_on:
- php
ports:
- 80:80
Once the Nginx container needs the PHP service to be fully initialized, we force this requirement in the depends_on
option.
The ports
configuration key maps a host port to a container port, here we map the port 80
in the host to the port 80
in
the container.
Now create a file called index.php
inside the app
folder and put the following in it.
<?php phpinfo();
Make sure the port 80
is accessible through your firewall and execute the following.
cd ~/docker/app
docker-compose up -d
Once again, double check that the service is up.
docker ps
Open a browser and access [vultr-instance-ip]
. You may find out your Vultr instance IP address by running the following.
hostname -I
You will see the PHP info page.
Configuring the MySQL container
Η επίσημη εικόνα της MySQL σάς επιτρέπει να διαμορφώσετε το κοντέινερ μέσω απλών μεταβλητών περιβάλλοντος. Αυτό μπορεί να γίνει με μια environment
επιλογή μέσα στον ορισμό του μπλοκ υπηρεσιών. Ενημερώστε το ~/docker/app/docker-compose.yml
αρχείο ως εξής.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
web:
image: vultr-nginx
volumes:
- ./:/app
depends_on:
- php
ports:
- 80:80
mysql:
image: mysql:5.7.21
volumes:
- ./:/app
- dbdata:/var/lib/mysql
environment:
- MYSQL_DATABASE=world
- MYSQL_ROOT_PASSWORD=root
working_dir: /app
volumes:
dbdata:
Τώρα έχουμε ορίσει μια νέα υπηρεσία για τη βάση δεδομένων. Παρατηρήστε τη γραμμή dbdata:/var/lib/mysql
. Αυτό προσαρτά τη διαδρομή στο κοντέινερ /var/lib/mysql
σε έναν μόνιμο τόμο που διαχειρίζεται το Docker, με αυτόν τον τρόπο τα δεδομένα της βάσης δεδομένων παραμένουν μετά την αφαίρεση του κοντέινερ. Αυτός ο τόμος πρέπει να οριστεί σε ένα μπλοκ ανώτατου επιπέδου όπως μπορείτε να δείτε στο τέλος του αρχείου.
Πριν ενορχηστρώσουμε τη νέα μας διαμόρφωση, ας κατεβάσουμε ένα δείγμα βάσης δεδομένων MySQL. Η επίσημη τεκμηρίωση της MySQL
παρέχει μερικά δείγματα βάσεων δεδομένων. Θα χρησιμοποιήσουμε τη γνωστή παγκόσμια βάση δεδομένων. Αυτή η βάση δεδομένων παρέχει μια λίστα χωρών και πόλεων. Για να κάνετε λήψη αυτού του δείγματος, εκτελέστε τα παρακάτω μέσα στο φάκελο της εφαρμογής μας.
curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz
Τώρα ας ενορχηστρώσουμε τα δοχεία μας.
docker-compose up -d
Όπως ίσως έχετε ήδη παρατηρήσει, η docker-compose up
εντολή ξεκινά μόνο τα κοντέινερ που δεν έχουν ήδη ξεκινήσει. Ελέγχει για τις διαφορές μεταξύ του docker-compose.yml
αρχείου σας και της τρέχουσας διαμόρφωσης των κοντέινερ που τρέχουν.
Για άλλη μια φορά, ελέγξτε ότι το κοντέινερ MySQL ξεκίνησε.
docker ps
Τώρα συμπληρώστε την παγκόσμια βάση δεδομένων.
docker-compose exec -T mysql mysql -uroot -proot world < world.sql
Μπορείτε να επαληθεύσετε ότι η βάση δεδομένων ήταν συμπληρωμένη επιλέγοντας δεδομένα απευθείας από τη βάση δεδομένων. Πρώτα αποκτήστε πρόσβαση στην προτροπή MySQL μέσα στο κοντέινερ.
docker-compose exec mysql mysql -uroot -proot world
Στη γραμμή εντολών MySQL, εκτελέστε τα εξής.
select * from city limit 10;
Θα δείτε μια λίστα με τις πόλεις. Τώρα κλείστε την προτροπή MySQL.
mysql> exit
Δημιουργία της εφαρμογής μας
Τώρα που όλα τα απαραίτητα κοντέινερ είναι σε λειτουργία, μπορούμε να επικεντρωθούμε στο δείγμα της εφαρμογής μας. Ενημερώστε το
app/index.php
αρχείο ως εξής.
<?php
$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');
$stmt = $pdo->prepare("
select city.Name, city.District, country.Name as Country, city.Population
from city
left join country on city.CountryCode = country.Code
order by Population desc
limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Vultr Rocks!</title>
</head>
<body>
<h2>Most Populous Cities In The World</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Country</th>
<th>District</th>
<th>Population</th>
</tr>
</thead>
<tbody>
<?php foreach($cities as $city): ?>
<tr>
<td><?=$city['Name']?></td>
<td><?=$city['Country']?></td>
<td><?=$city['District']?></td>
<td><?=number_format($city['Population'], 0)?></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
</body>
</html>
Εάν έχετε πρόσβαση [vultr-instance-ip]
σε πρόγραμμα περιήγησης ιστού, θα δείτε μια λίστα με τις πολυπληθέστερες πόλεις στον κόσμο. Συγχαρητήρια, έχετε αναπτύξει μια πλήρως λειτουργική εφαρμογή PHP χρησιμοποιώντας docker.
συμπέρασμα
Σε αυτό το σεμινάριο, έχω δείξει βήμα προς βήμα πώς να ρυθμίσετε μια πλήρως λειτουργική εφαρμογή PHP. Δημιουργήσαμε προσαρμοσμένες εικόνες για PHP και Nginx και διαμορφώσαμε το docker-compose για να ενορχηστρώνουμε τα κοντέινερ μας. Παρά το γεγονός ότι είναι πολύ βασική και απλή, αυτή η ρύθμιση αντικατοπτρίζει ένα πραγματικό σενάριο ζωής.
Σε αυτόν τον οδηγό, δημιουργήσαμε και προσθέσαμε ετικέτες στις εικόνες μας τοπικά. Για πιο ευέλικτη ρύθμιση, μπορείτε να προωθήσετε αυτές τις εικόνες σε ένα μητρώο σταθμών . Μπορείτε να μεταβείτε στο επίσημο μητρώο docker ή ακόμα και να ρυθμίσετε το δικό σας μητρώο docker. Σε κάθε περίπτωση, αυτό θα σας επιτρέψει να δημιουργήσετε τις εικόνες σας σε έναν κεντρικό υπολογιστή και να τις χρησιμοποιήσετε σε έναν άλλο.
Για πιο λεπτομερή χρήση του docker-compose
, θα πρέπει να ανατρέξετε στην επίσημη τεκμηρίωση .
Ανάλογα με τις απαιτήσεις της εφαρμογής σας και το πλαίσιο PHP που χρησιμοποιείτε, ίσως θέλετε να προσθέσετε περισσότερες επεκτάσεις. Αυτό μπορεί εύκολα να γίνει τροποποιώντας το Dockerfile
χρησιμοποιούμενο για τη δημιουργία προσαρμοσμένης εικόνας PHP. Ωστόσο, ορισμένες επεκτάσεις χρειάζονται επιπλέον εξαρτήσεις για να εγκατασταθούν στο κοντέινερ. Θα πρέπει να ανατρέξετε στη λίστα των επεκτάσεων στην επίσημη τεκμηρίωση της
PHP για να ελέγξετε τις βασικές απαιτήσεις κάθε επέκτασης.