Конфигурисање нашег радног окружења
Конфигурисање ПХП контејнера
Конфигурисање Нгинк контејнера
Конфигурисање МиСКЛ контејнера
Изградња наше апликације
Закључак
ПХП апликације се обично састоје од веб сервера, система релационих база података и самог тумача језика. У овом туторијалу користићемо комплетан стек ПХП апликација користећи Доцкер. Ово је детаљан водич у коме ћемо да направимо и оркестрирамо контејнере за Нгинк (веб сервер), МиСКЛ (систем базе података) и ПХП.
Зарад овог туторијала, написаћемо једноставну апликацију која чита листу градова из базе података и приказује је на веб страници, на овај начин ћемо демонстрирати основну, али функционалну ПХП апликацију.
Овај водич претпоставља да имате већ инсталиран Доцкер-ЦЕ и да имате барем минимално радно знање о Доцкер-у. У том случају можете прегледати следеће туторијале:
Конфигурисање нашег радног окружења
Апликација заснована на доцкер-у у стварном животу обично се састоји од неколико контејнера. Ручно управљање њима лако може постати прилично неуредно и гломазно. Ту долази доцкер-цомпосе. Помаже вам да управљате великим бројем контејнера кроз једноставну yaml
конфигурациону датотеку.
Инсталирајте доцкер-цомпосе.
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
Директоријум где ћемо градити нашу обичај ПХП слику, nginx
фасцикла ће одржати неопходне фајлове за наш обичај нгинк слике и app
директоријум где ћемо бити стављање изворни код и конфигурацију нашем узорку апликације.
Конфигурисање ПХП контејнера
У овом примеру ћемо се користити php-fpm
за повезивање са Нгинк веб сервером. Користићемо званичну ПХП основну слику. Међутим, такође морамо да инсталирамо и омогућимо нека проширења како бисмо могли да приступимо бази података. Унутар 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
Имајте на уму да користимо Алпине верзију званичне ПХП слике. Алпине је веома мала дистрибуција усмерена на контејнере пружајући много мање површине. Такође, обратите пажњу на употребу команде docker-php-ext-install
, званична ПХП слика обезбеђује ову команду да олакша процес инсталирања и конфигурисања ПХП екстензија.
Сада, хајде да направимо ову Доцкер слику издавањем следећег (унутар нашег 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
Можете да покренете следећу команду да бисте били сигурни да је ПХП контејнер извршен:
docker ps
Како извршити команде унутар контејнера
И даље унутар app
фасцикле, уз помоћ docker-compose
команде можемо покренути било коју команду унутар дефинисаног сервисног контејнера .
docker-compose exec [service] [command]
[service]
Чувар места се односи на кључ услуга. У нашем случају, ово је било 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
Конфигурисање Нгинк контејнера
Баш као и ПХП контејнер, потребно је да креирамо прилагођену слику за веб сервер. Али у овом случају, само треба да обезбедимо конфигурацију за наш 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
Користимо подразумевану Нгинк слику засновану на Алпине-у. На овој Доцкер датотеци једноставно копирамо конфигурациону датотеку у подешавање наше апликације. Пре него што направите ову слику, направите конфигурациону датотеку.
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
реду позивамо ПХП контејнер по његовом имену унутар service
блока docker-compose.yml
конфигурационе датотеке. Интерно docker-compose
креира мрежу и додељује име услуге као име хоста свакој од дефинисаних услуга. Сада можемо да направимо Нгинк слику.
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
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.
Пре него што организујемо нашу нову конфигурацију, хајде да преузмемо пример МиСКЛ базе података. Званична МиСКЛ документација
даје неке примере базе података. Користићемо познату светску базу података. Ова база података пружа списак земаља и градова. Да бисте преузели овај пример, извршите следеће у фасцикли наше апликације.
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
датотеке и тренутне конфигурације покренутих контејнера.
Још једном проверите да ли је МиСКЛ контејнер покренут.
docker ps
Сада попуните светску базу података.
docker-compose exec -T mysql mysql -uroot -proot world < world.sql
Можете да проверите да ли је база података попуњена бирањем података директно из базе података. Прво приступите МиСКЛ промпту унутар контејнера.
docker-compose exec mysql mysql -uroot -proot world
У МиСКЛ одзивнику покрените следеће.
select * from city limit 10;
Видећете листу градова. Сада затворите МиСКЛ промпт.
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]
у веб претраживачу, видећете листу најнасељенијих градова на свету. Честитамо, поставили сте потпуно функционалну ПХП апликацију користећи Доцкер.
Закључак
У овом туторијалу, демонстрирао сам корак по корак како да конфигуришете потпуно функционалну ПХП апликацију. Направили смо прилагођене слике за ПХП и Нгинк и конфигурисали доцкер-цомпосе да оркестрирамо наше контејнере. Упркос томе што је веома основна и једноставна, ово подешавање одражава сценарио из стварног живота.
У овом водичу смо направили и означили наше слике локално. За флексибилније подешавање, можете да гурнете ове слике у доцкер регистар . Можете притиснути званични доцкер регистар или чак подесити сопствени доцкер регистар. У сваком случају, ово ће вам омогућити да направите своје слике на једном хосту и користите их на другом.
За детаљнију употребу docker-compose
, требало би да погледате званичну документацију .
У зависности од захтева ваше апликације и ПХП оквира који користите, можда ћете желети да додате још екстензија. Ово се лако може урадити модификовањем Dockerfile
коришћеног за прављење наше прилагођене ПХП слике. Међутим, неким екстензијама су потребне додатне зависности да би се инсталирале у контејнер. Требало би да погледате листу екстензија у
званичној документацији ПХП-а да бисте прегледали основне захтеве за свако проширење.