Mūsu darba vides konfigurēšana
PHP konteinera konfigurēšana
Nginx konteinera konfigurēšana
MySQL konteinera konfigurēšana
Mūsu lietojumprogrammas izveide
Secinājums
PHP lietojumprogrammas parasti veido tīmekļa serveris, relāciju datu bāzes sistēma un pats valodas tulks. Šajā apmācībā mēs izmantosim pilnu PHP lietojumprogrammu kopu, izmantojot docker. Šī ir padziļināta apmācība, kurā mēs gatavojamies izveidot un koordinēt konteinerus Nginx (tīmekļa serverim), MySQL (datu bāzes sistēmai) un PHP.
Šīs apmācības nolūkos mēs uzrakstīsim vienkāršu aplikāciju, kas nolasa pilsētu sarakstu no datu bāzes un parāda to tīmekļa lapā, tādā veidā mēs demonstrēsim pamata, bet strādājošu PHP aplikāciju.
Šajā rokasgrāmatā tiek pieņemts, ka jums jau ir instalēts Docker-CE un jums ir vismaz minimālas darba zināšanas par doku. Šim nolūkam varat pārskatīt šādas apmācības:
Mūsu darba vides konfigurēšana
Reālās dzīves docker lietojumprogramma parasti sastāv no vairākiem konteineriem. To manuāla pārvaldīšana var viegli kļūt diezgan netīra un apgrūtinoša. Šeit tiek izmantota dokera komponēšana. Tas palīdz pārvaldīt vairākus konteinerus, izmantojot vienkāršu yaml
konfigurācijas failu.
Instalējiet 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
Izveidojiet mapi, kurā glabājiet visus nepieciešamos šī piemēra failus un pēc tam cd
tajā. No šī brīža šis ir mūsu darba direktorijs, un katra komanda tiks izpildīta šajā mapē, un katrs ceļš tiks attiecināts uz to. Šo mapi vēlāk var saukt par WORKING_DIR
.
mkdir ~/docker
cd ~/docker
Tagad izveidojiet vēl trīs mapes.
mkdir php nginx app
php
Mape ir vieta, kur mēs veidot mūsu pasūtījuma PHP tēlu, tad nginx
mape rīkos nepieciešamos failus mūsu pasūtījuma Nginx tēla un app
mape, kurā mēs liekot pirmkodu un konfigurāciju mūsu parauga pieteikumu.
PHP konteinera konfigurēšana
Šajā piemērā mēs izmantosim, php-fpm
lai izveidotu savienojumu ar Nginx tīmekļa serveri. Mēs izmantosim oficiālo PHP bāzes attēlu. Tomēr mums ir arī jāinstalē un jāiespējo daži paplašinājumi, lai mēs varētu piekļūt datu bāzei. Inside php
mapē izveidotu failu ar nosaukumu Dockerfile
un nodot šādus saturu tajā.
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
Ņemiet vērā, ka mēs izmantojam oficiālā PHP attēla Alpine versiju. Alpine ir ļoti mazs izplatījums, kas paredzēts konteineriem, nodrošinot daudz mazākus nospiedumus. Ņemiet vērā arī komandas izmantošanu docker-php-ext-install
, oficiālais PHP attēls nodrošina šo komandu, lai atvieglotu PHP paplašinājumu instalēšanas un konfigurēšanas procesu.
Tagad izveidosim šo Docker attēlu, izdodot šo (mūsu iekšienē WORKING_DIR
):
docker build -t vultr-php php/
docker-compose.yml
fails
Kā jau minēts, tas docker-compose
ļauj pārvaldīt vairākus konteinerus, izmantojot vienkāršu konfigurācijas failu. Šim konfigurācijas failam parasti ir nosaukums docker-compose.yml
. Izveidojiet šo failu app
mapē.
touch app/docker-compose.yml
Tagad ievietojiet šajā failā šādu saturu.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Mēs izskaidrosim šo sintaksi. Pirmkārt, atzīmējiet pirmo rindiņu.
version: '2'
Tas norāda izmantotā docker-compose.yml
konfigurācijas faila versiju . Nākamajā rindā ir norādīti pakalpojumi vai, citiem vārdiem sakot, nodrošināmie konteineri.
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Ņemiet vērā, ka katram pakalpojumam services
blokā ir noteikta atslēga . Šeit norādītais nosaukums vēlāk tiks izmantots, lai atsauktos uz šo konkrēto konteineru. Ņemiet vērā arī to, ka php
konfigurācijā mēs definējam attēlu, kas tiek izmantots konteinera palaišanai (šis ir attēls, ko mēs izveidojām iepriekš). Mēs arī definējam apjoma kartēšanu.
volumes:
- ./:/app
Tas liek docker-compose
kartēt pašreizējo direktoriju ( ./
) ar /app
direktoriju konteinera iekšpusē. Pēdējā rindiņā /app
kā darba direktoriju tiek iestatīta mape konteinerā, kas nozīmē, ka šī ir mape, kurā pēc noklusējuma tiek izpildītas visas konteinerā esošās nākamās komandas.
Tagad mēs varam sakārtot savus konteinerus.
cd ~/docker/app
docker-compose up -d
Varat palaist šādu komandu, lai pārliecinātos, ka PHP konteiners ir izpildīts:
docker ps
Kā izpildīt komandas konteineros
Joprojām app
mapē mēs varam palaist jebkuru komandu noteiktā pakalpojuma konteinerā ar docker-compose
komandas palīdzību.
docker-compose exec [service] [command]
[service]
Vietturis norāda uz servisa atslēgu. Mūsu gadījumā tas bija php
. Palaidīsim komandu konteinerā, lai pārbaudītu mūsu PHP versiju.
docker-compose exec php php -v
Jūs redzēsit šādu izvadi.
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 konteinera konfigurēšana
Tāpat kā PHP konteineram, mums ir jāizveido pielāgots attēls tīmekļa serverim. Bet šajā gadījumā mums vienkārši ir jānodrošina mūsu konfigurācija virtual host
. Pārliecinieties, ka jums ir iekšā mūsu WORKING_DIR
un radīt Dockerfile
iekšpusē nginx
mapi:
cd ~/docker
touch nginx/Dockerfile
Tagad ievietojiet tajā šādu saturu Dockerfile
:
FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf
Mēs izmantojam noklusējuma Nginx attēlu, kura pamatā ir Alpine. Šajā Docker failā mēs vienkārši kopējam konfigurācijas failu mūsu lietojumprogrammas iestatījumos. Pirms šī attēla izveides izveidojiet konfigurācijas failu.
touch nginx/default.conf
Tagad aizpildiet to ar šo saturu.
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;
}
}
Ņemiet vērā, ka fastcgi_pass php:9000
rindā mēs atsaucamies uz PHP konteineru pēc tā nosaukuma konfigurācijas faila service
blokā docker-compose.yml
. Iekšēji docker-compose
izveido tīklu un piešķir pakalpojuma nosaukumu kā resursdatora nosaukumu katram definētajam pakalpojumam. Tagad mēs varam izveidot Nginx attēlu.
docker build -t vultr-nginx nginx/
Atjaunināšana docker-compose.yml
Tagad atjauniniet app/docker-compose.yml
failu.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
web:
image: vultr-nginx
volumes:
- ./:/app
depends_on:
- php
ports:
- 80:80
Esam tikai pievienojuši jaunu pakalpojumu. Konfigurācija ir gandrīz tāda pati, izņemot tālāk norādīto.
depends_on:
- php
ports:
- 80:80
Kad Nginx konteineram ir nepieciešams pilnībā inicializēt PHP pakalpojumu, mēs piespiežam šo depends_on
opciju. ports
Konfigurācijas atslēga kartes resursdatora ostas uz konteineru ostas, šeit mēs kartētu ostas 80
uzņēmējā uz ostu 80
konteinerā.
Tagad izveidot failu sauc index.php
iekšpusē app
mapi un nodot šādus tajā.
<?php phpinfo();
Pārliecinieties, vai portam 80
var piekļūt, izmantojot ugunsmūri, un izpildiet tālāk norādītās darbības.
cd ~/docker/app
docker-compose up -d
Vēlreiz vēlreiz pārbaudiet, vai pakalpojums ir pieejams.
docker ps
Atveriet pārlūkprogrammu un piekļūstiet [vultr-instance-ip]
. Varat uzzināt savu Vultr instances IP adresi, izpildot tālāk norādīto.
hostname -I
Jūs redzēsit PHP informācijas lapu.
MySQL konteinera konfigurēšana
Oficiālais MySQL attēls ļauj konfigurēt konteineru, izmantojot vienkāršus vides mainīgos. To var izdarīt, izmantojot environment
opciju pakalpojumu bloka definīcijā. Atjauniniet ~/docker/app/docker-compose.yml
failu uz tālāk norādīto.
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:
Tagad datubāzei esam definējuši jaunu pakalpojumu. Ievērojiet līniju dbdata:/var/lib/mysql
. Tādējādi konteinera ceļš tiek /var/lib/mysql
pievienots pastāvīgam sējumam, ko pārvalda Docker, tādējādi datu bāzes dati saglabājas arī pēc konteinera noņemšanas. Šis apjoms ir jādefinē augstākā līmeņa blokā, kā redzat faila beigās.
Pirms jaunās konfigurācijas organizēšanas lejupielādēsim MySQL datu bāzes paraugu. Oficiālais MySQL dokumentācijā
sniedz dažus paraugu datu bāzes. Mēs izmantosim labi zināmo pasaules datu bāzi. Šī datu bāze nodrošina valstu un pilsētu sarakstu. Lai lejupielādētu šo paraugu, mūsu lietotņu mapē izpildiet tālāk norādītās darbības.
curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz
Tagad organizēsim mūsu konteinerus.
docker-compose up -d
Kā jūs, iespējams, jau pamanījāt, docker-compose up
komanda palaiž tikai tos konteinerus, kas vēl nav startēti. Tas pārbauda atšķirības starp jūsu docker-compose.yml
failu un pašreizējo darbojošos konteineru konfigurāciju.
Vēlreiz pārbaudiet, vai MySQL konteiners ir palaists.
docker ps
Tagad aizpildiet pasaules datu bāzi.
docker-compose exec -T mysql mysql -uroot -proot world < world.sql
Varat pārbaudīt, vai datu bāze ir aizpildīta, atlasot datus tieši no datu bāzes. Vispirms piekļūstiet MySQL uzvednei konteinerā.
docker-compose exec mysql mysql -uroot -proot world
MySQL uzvednē izpildiet tālāk norādīto.
select * from city limit 10;
Jūs redzēsit pilsētu sarakstu. Tagad aizveriet MySQL uzvedni.
mysql> exit
Mūsu lietojumprogrammas izveide
Tagad, kad visi nepieciešamie konteineri ir izveidoti un darbojas, mēs varam koncentrēties uz mūsu lietojumprogrammas paraugu. Atjauniniet
app/index.php
failu uz tālāk norādīto.
<?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>
Ja piekļūstat [vultr-instance-ip]
tīmekļa pārlūkprogrammā, jūs redzēsit pasaules visvairāk apdzīvoto pilsētu sarakstu. Apsveicam, jūs esat izvietojis pilnībā strādājošu PHP lietojumprogrammu, izmantojot docker.
Secinājums
Šajā apmācībā es soli pa solim parādīju, kā konfigurēt pilnībā strādājošu PHP lietojumprogrammu. Mēs izveidojām pielāgotus attēlus PHP un Nginx un konfigurējām docker-compose, lai sakārtotu mūsu konteinerus. Neskatoties uz to, ka šis iestatījums ir ļoti vienkāršs un vienkāršs, tas atspoguļo reālu dzīves scenāriju.
Šajā rokasgrāmatā mēs esam izveidojuši un atzīmējuši savus attēlus lokāli. Lai iestatīšana būtu elastīgāka, varat nosūtīt šos attēlus uz doka reģistru . Varat pārsūtīt uz oficiālo doku reģistru vai pat iestatīt savu doku reģistru. Jebkurā gadījumā tas ļaus jums izveidot attēlus vienā resursdatorā un izmantot tos citā.
Lai iegūtu sīkāku informāciju par lietošanu docker-compose
, skatiet oficiālo dokumentāciju .
Atkarībā no lietojumprogrammas prasībām un izmantotā PHP ietvara, iespējams, vēlēsities pievienot citus paplašinājumus. To var viegli izdarīt, mainot Dockerfile
izmantoto, lai izveidotu mūsu pielāgoto PHP attēlu. Tomēr dažiem paplašinājumiem ir nepieciešamas papildu atkarības, lai tos instalētu konteinerā. Lai pārskatītu katra paplašinājuma pamatprasības, skatiet
PHP oficiālajā dokumentācijā esošo paplašinājumu sarakstu.