Konfigurimi i mjedisit tonë të punës
Konfigurimi i kontejnerit PHP
Konfigurimi i kontejnerit Nginx
Konfigurimi i kontejnerit MySQL
Ndërtimi i aplikacionit tonë
konkluzioni
Aplikacionet PHP zakonisht përbëhen nga një server në internet, një sistem bazë të dhënash relacionale dhe vetë përkthyesi i gjuhës. Në këtë tutorial ne do të shfrytëzojmë një grumbull të plotë aplikacionesh PHP duke përdorur docker. Ky është një tutorial i thelluar në të cilin do të ndërtojmë dhe orkestrojmë kontejnerë për Nginx (webserver), MySQL (sistemi i bazës së të dhënave) dhe PHP.
Për hir të këtij tutoriali, ne do të shkruajmë një aplikacion të thjeshtë që lexon një listë qytetesh nga një bazë të dhënash dhe e shfaq atë në një faqe interneti, në këtë mënyrë do të demonstrojmë një aplikacion bazë, por funksional, PHP.
Ky udhëzues supozon që ju keni Docker-CE të instaluar tashmë dhe të paktën një njohuri minimale të punës për docker. Për këtë çështje, ju mund të rishikoni mësimet e mëposhtme:
Konfigurimi i mjedisit tonë të punës
Një aplikacion i vërtetë i bazuar në doker zakonisht përbëhet nga disa kontejnerë. Menaxhimi i tyre me dorë mund të bëhet lehtësisht mjaft i çrregullt dhe i rëndë. Këtu hyn në lojë docker-compose. Ju ndihmon të menaxhoni një numër kontejnerësh përmes një yaml
skedari të thjeshtë konfigurimi.
Instaloni 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
Krijo një dosje për të mbajtur të gjithë skedarët e nevojshëm të këtij shembulli dhe më pas cd
në të. Tani e tutje, kjo është drejtoria jonë e punës dhe çdo komandë do të ekzekutohet brenda kësaj dosje dhe çdo shteg do të referohet në lidhje me të. Kjo dosje mund të referohet më vonë si WORKING_DIR
.
mkdir ~/docker
cd ~/docker
Tani krijoni edhe tre dosje të tjera.
mkdir php nginx app
php
Dosje është ajo ku ne do të ndërtojmë tonë imazh porosi PHP, The nginx
dosje do të mbajë dosjet e nevojshme për tonë imazhin porosi nginx dhe app
dosje është ajo ku ne do të vënë kodin burimor dhe konfigurimin e aplikimit tonë mostrës.
Konfigurimi i kontejnerit PHP
Në këtë shembull, ne do të përdorim php-fpm
për t'u lidhur me uebserverin Nginx. Ne do të përdorim imazhin zyrtar të bazës PHP. Megjithatë, ne gjithashtu duhet të instalojmë dhe aktivizojmë disa shtesa në mënyrë që të mund të hyjmë në bazën e të dhënave. Brenda php
dosjes krijoni një skedar me emrin Dockerfile
dhe vendosni përmbajtjen e mëposhtme në të.
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
Vini re se ne po përdorim versionin Alpin të imazhit zyrtar PHP. Alpine është një shpërndarje shumë e vogël e synuar drejt kontejnerëve duke ofruar gjurmë shumë më të vogla. Gjithashtu, vini re përdorimin e komandës docker-php-ext-install
, imazhi zyrtar PHP ofron këtë komandë për të lehtësuar procesin e instalimit dhe konfigurimit të shtesave PHP.
Tani, le të ndërtojmë këtë imazh Docker duke lëshuar sa vijon (brenda tonë WORKING_DIR
):
docker build -t vultr-php php/
docker-compose.yml
fotografi
Siç u përmend tashmë, docker-compose
ju lejon të menaxhoni një numër kontejnerësh përmes një skedari të thjeshtë konfigurimi. Ky skedar konfigurimi zakonisht quhet docker-compose.yml
. Krijo këtë skedar brenda app
dosjes.
touch app/docker-compose.yml
Tani vendosni përmbajtjen e mëposhtme në këtë skedar.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Ne do ta shpjegojmë këtë sintaksë. Së pari, vini re rreshtin e parë.
version: '2'
Kjo specifikon versionin e docker-compose.yml
skedarit të konfigurimit të përdorur. Rreshti tjetër specifikon shërbimet, ose me fjalë të tjera, kontejnerët që do të ofrohen.
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Vini re se çdo shërbim ka një çelës specifik brenda services
bllokut. Emri i specifikuar këtu do të përdoret për t'iu referuar këtij kontejneri specifik më vonë. Vini re gjithashtu se brenda php
konfigurimit, ne përcaktojmë imazhin e përdorur për të drejtuar kontejnerin (ky është imazhi që kemi ndërtuar më parë). Ne gjithashtu përcaktojmë një hartë vëllimi.
volumes:
- ./:/app
Kjo tregon docker-compose
për të hartuar direktoriumin aktual ( ./
) në /app
drejtorinë brenda kontejnerit. Rreshti i fundit e vendos /app
dosjen brenda kontejnerit si direktorium pune, që do të thotë se ky është dosja nga e cila ekzekutohen si parazgjedhje të gjitha komandat e ardhshme brenda një kontejneri.
Tani mund të orkestrojmë kontejnerët tanë.
cd ~/docker/app
docker-compose up -d
Ju mund të ekzekutoni komandën e mëposhtme për t'u siguruar që kontejneri PHP është ekzekutuar:
docker ps
Si të ekzekutoni komandat brenda kontejnerëve
Ende brenda app
dosjes, ne mund të ekzekutojmë çdo komandë brenda një kontejneri të caktuar shërbimi me ndihmën e docker-compose
komandës.
docker-compose exec [service] [command]
[service]
Placeholder referohet kyç shërbimit. Në rastin tonë, kjo ishte php
. Le të ekzekutojmë një komandë brenda kontejnerit për të kontrolluar versionin tonë PHP.
docker-compose exec php php -v
Do të shihni daljen e mëposhtme.
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
Konfigurimi i kontejnerit Nginx
Ashtu si kontejneri PHP, ne duhet të krijojmë një imazh të personalizuar për serverin në internet. Por në këtë rast, ne vetëm duhet të ofrojmë një konfigurim për tonën virtual host
. Sigurohuni që jeni brenda WORKING_DIR
dhe krijoni një dosje Dockerfile
brenda nginx
dosjes:
cd ~/docker
touch nginx/Dockerfile
Tani vendosni përmbajtjen e mëposhtme në këtë Dockerfile
:
FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf
Ne po përdorim imazhin e paracaktuar Nginx bazuar në Alpine. Në këtë skedar Docker ne thjesht kopjojmë një skedar konfigurimi në konfigurimin e aplikacionit tonë. Para se të ndërtoni këtë imazh, krijoni një skedar konfigurimi.
touch nginx/default.conf
Tani mbusheni me këtë përmbajtje.
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;
}
}
Vini re se në fastcgi_pass php:9000
rresht ne po i referohemi kontejnerit PHP me emrin e tij brenda service
bllokut të docker-compose.yml
skedarit të konfigurimit. Brenda docker-compose
krijon një rrjet dhe cakton emrin e shërbimit si emër pritës për secilin prej shërbimeve të përcaktuara. Tani mund të ndërtojmë imazhin Nginx.
docker build -t vultr-nginx nginx/
Po përditësohet docker-compose.yml
Tani përditësoni app/docker-compose.yml
skedarin.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
web:
image: vultr-nginx
volumes:
- ./:/app
depends_on:
- php
ports:
- 80:80
Ne kemi shtuar vetëm një shërbim të ri. Konfigurimi është pothuajse i njëjtë, me përjashtim të sa vijon.
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
The official MySQL image allows you to configure the container through simple environment variables. This can be done
with an environment
option inside the service block definition. Update the ~/docker/app/docker-compose.yml
file
to the following.
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:
Now we've defined a new service for the database. Notice the line dbdata:/var/lib/mysql
. This
mounts the path on the container /var/lib/mysql
to a persistent volume
managed by Docker, this way the database data persists after the container is removed. This
volume needs to be defined in a top-level block as you can see in the end of the file.
Përpara se të orkestrojmë konfigurimin tonë të ri, le të shkarkojmë një mostër bazë të dhënash MySQL. Dokumentacioni zyrtar MySQL
ofron disa mostra të bazave të të dhënave. Ne do të përdorim bazën e të dhënave të njohur botërore. Kjo bazë të dhënash ofron një listë të vendeve dhe qyteteve. Për të shkarkuar këtë mostër, ekzekutoni sa më poshtë brenda dosjes së aplikacionit tonë.
curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz
Tani le të orkestrojmë kontejnerët tanë.
docker-compose up -d
Siç mund ta keni vënë re tashmë, docker-compose up
komanda fillon vetëm kontejnerët që nuk janë nisur tashmë. Ai kontrollon për dallimet midis docker-compose.yml
skedarit tuaj dhe konfigurimit aktual të kontejnerëve që funksionojnë.
Një herë tjetër, kontrolloni që kontejneri MySQL të jetë nisur.
docker ps
Tani plotësoni bazën e të dhënave botërore.
docker-compose exec -T mysql mysql -uroot -proot world < world.sql
Ju mund të verifikoni që baza e të dhënave është e mbushur duke zgjedhur të dhënat direkt nga baza e të dhënave. Fillimisht hyni në kërkesën MySQL brenda kontejnerit.
docker-compose exec mysql mysql -uroot -proot world
Në prompt MySQL, ekzekutoni sa më poshtë.
select * from city limit 10;
Do të shihni një listë të qyteteve. Tani dilni nga prompti MySQL.
mysql> exit
Ndërtimi i aplikacionit tonë
Tani që të gjithë kontejnerët e nevojshëm janë gati dhe funksionojnë, ne mund të përqendrohemi në aplikimin tonë të mostrës. Përditësoni
app/index.php
skedarin në vijim.
<?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>
Nëse hyni [vultr-instance-ip]
në një shfletues uebi, do të shihni një listë të qyteteve më të populluara në botë. Urime, ju keni vendosur një aplikacion PHP që funksionon plotësisht duke përdorur docker.
konkluzioni
Në këtë tutorial, unë kam demonstruar hap pas hapi se si të konfiguroni një aplikacion PHP që funksionon plotësisht. Ne ndërtuam imazhe të personalizuara për PHP dhe Nginx dhe konfiguruam docker-compose për të orkestruar kontejnerët tanë. Pavarësisht se është shumë bazë dhe i thjeshtë, ky konfigurim pasqyron një skenar të jetës reale.
Në këtë udhëzues, ne kemi ndërtuar dhe etiketuar imazhet tona në nivel lokal. Për një konfigurim më fleksibël, mund t'i shtyni këto imazhe në një regjistër doker . Ju mund të shtyni në regjistrin zyrtar të dokerit ose madje të konfiguroni regjistrin tuaj të dokerit. Në çdo rast, kjo do t'ju lejojë të ndërtoni imazhet tuaja në një host dhe t'i përdorni ato në një tjetër.
Për një përdorim më të detajuar të docker-compose
, duhet t'i referoheni dokumentacionit zyrtar .
Në varësi të kërkesave të aplikacionit tuaj dhe kornizës PHP që përdorni, mund të dëshironi të shtoni më shumë shtesa. Kjo mund të bëhet lehtësisht duke modifikuar atë që Dockerfile
përdoret për të ndërtuar imazhin tonë të personalizuar PHP. Megjithatë, disa shtesa kanë nevojë për varësi shtesë për t'u instaluar në kontejner. Ju duhet t'i referoheni listës së shtesave në
dokumentacionin zyrtar të PHP-së për të shqyrtuar kërkesat bazë të secilës shtesë.