Konfiguriranje našega delovnega okolja
Konfiguriranje vsebnika PHP
Konfiguriranje vsebnika Nginx
Konfiguriranje vsebnika MySQL
Izdelava naše aplikacije
Zaključek
PHP aplikacije običajno sestavljajo spletni strežnik, sistem relacijske baze podatkov in sam tolmač jezika. V tej vadnici bomo uporabili celoten sklad aplikacij PHP z uporabo dockerja. To je poglobljena vadnica, v kateri bomo zgradili in organizirali vsebnike za Nginx (spletni strežnik), MySQL (sistem baze podatkov) in PHP.
Zaradi te vadnice bomo napisali preprosto aplikacijo, ki bere seznam mest iz baze podatkov in ga prikaže na spletni strani, na ta način bomo prikazali osnovno, a delujočo PHP aplikacijo.
Ta priročnik predvideva, da imate Docker-CE že nameščen in vsaj minimalno delovno znanje o dockerju. V zvezi s tem si lahko ogledate naslednje vadnice:
Konfiguriranje našega delovnega okolja
Realna aplikacija, ki temelji na dockerju, je običajno sestavljena iz več vsebnikov. Ročno upravljanje z njimi zlahka postane precej neurejeno in okorno. Tu pride v poštev docker-compose. Pomaga vam upravljati številne vsebnike prek preproste yaml
konfiguracijske datoteke.
Namestite 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
Ustvarite mapo za shranjevanje vseh potrebnih datotek tega primera in nato cd
vanjo. Od zdaj naprej je to naš delovni imenik in vsak ukaz se bo izvajal znotraj te mape in vsaka pot se bo nanašala nanjo. Ta mapa se lahko kasneje omenja kot WORKING_DIR
.
mkdir ~/docker
cd ~/docker
Zdaj ustvarite še tri mape.
mkdir php nginx app
V php
mapi bomo zgradili našo sliko PHP po meri, nginx
mapa bo vsebovala potrebne datoteke za našo sliko nginx po meri, app
mapa pa je, kamor bomo postavili izvorno kodo in konfiguracijo naše vzorčne aplikacije.
Konfiguriranje vsebnika PHP
V tem primeru bomo uporabili php-fpm
za povezavo s spletnim strežnikom Nginx. Uporabili bomo uradno osnovno sliko PHP. Vendar pa moramo tudi namestiti in omogočiti nekatere razširitve, da bomo lahko dostopali do baze podatkov. V php
mapi ustvarite datoteko z imenom Dockerfile
in vanjo vstavite naslednjo vsebino.
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
Upoštevajte, da uporabljamo alpsko različico uradne slike PHP. Alpine je zelo majhna distribucija, ki je namenjena zabojnikom, saj zagotavlja veliko manjše površine. Upoštevajte tudi uporabo ukaza docker-php-ext-install
, uradna slika PHP zagotavlja ta ukaz za olajšanje postopka namestitve in konfiguriranja razširitev PHP.
Zdaj pa zgradimo to sliko Dockerja tako, da izdamo naslednje (znotraj našega WORKING_DIR
):
docker build -t vultr-php php/
docker-compose.yml
datoteka
Kot smo že omenili, docker-compose
vam omogoča upravljanje številnih vsebnikov prek preproste konfiguracijske datoteke. Ta konfiguracijska datoteka se običajno imenuje docker-compose.yml
. Ustvarite to datoteko v app
mapi.
touch app/docker-compose.yml
Zdaj v to datoteko vstavite naslednjo vsebino.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
To sintakso bomo razložili. Najprej bodite pozorni na prvo vrstico.
version: '2'
To določa različico uporabljene docker-compose.yml
konfiguracijske datoteke. Naslednja vrstica določa storitve ali z drugimi besedami vsebnike, ki jih je treba zagotoviti.
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
Upoštevajte, da ima vsaka storitev poseben ključ znotraj services
bloka. Tukaj navedeno ime bo pozneje uporabljeno za sklicevanje na ta posebni vsebnik. Upoštevajte tudi, da znotraj php
konfiguracije definiramo sliko, ki se uporablja za zagon vsebnika (to je slika, ki smo jo zgradili prej). Definiramo tudi preslikavo prostornine.
volumes:
- ./:/app
To pove, docker-compose
da preslikate trenutni imenik ( ./
) v /app
imenik znotraj vsebnika. Zadnja vrstica nastavi /app
mapo znotraj vsebnika kot delovni imenik, kar pomeni, da je to mapa, iz katere se privzeto izvajajo vsi prihodnji ukazi znotraj vsebnika.
Zdaj lahko organiziramo naše zabojnike.
cd ~/docker/app
docker-compose up -d
Lahko zaženete naslednji ukaz, da se prepričate, ali je bil vsebnik PHP izveden:
docker ps
Kako izvajati ukaze znotraj vsebnikov
Še vedno znotraj app
mape lahko s pomočjo docker-compose
ukaza zaženemo kateri koli ukaz znotraj definiranega servisnega vsebnika .
docker-compose exec [service] [command]
Oznaka [service]
mesta se nanaša na servisni ključ. V našem primeru je bilo to php
. Zaženimo ukaz znotraj vsebnika, da preverimo našo različico PHP.
docker-compose exec php php -v
Videli boste naslednji izhod.
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
Konfiguriranje vsebnika Nginx
Tako kot vsebnik PHP, moramo ustvariti sliko po meri za spletni strežnik. Toda v tem primeru moramo le zagotoviti konfiguracijo za naš virtual host
. Prepričajte se, da ste znotraj naše WORKING_DIR
in ustvarite Dockerfile
znotraj nginx
mape:
cd ~/docker
touch nginx/Dockerfile
Zdaj v to vstavite naslednjo vsebino Dockerfile
:
FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf
Uporabljamo privzeto sliko Nginx, ki temelji na Alpine. V tej datoteki Docker preprosto kopiramo konfiguracijsko datoteko v nastavitev naše aplikacije. Preden zgradite to sliko, ustvarite konfiguracijsko datoteko.
touch nginx/default.conf
Zdaj ga napolnite s to vsebino.
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;
}
}
Upoštevajte, da se v fastcgi_pass php:9000
vrstici sklicujemo na vsebnik PHP po njegovem imenu znotraj service
bloka docker-compose.yml
konfiguracijske datoteke. Interno docker-compose
ustvari omrežje in vsaki od definiranih storitev dodeli ime storitve kot ime gostitelja. Zdaj lahko zgradimo sliko Nginx.
docker build -t vultr-nginx nginx/
Posodabljanje docker-compose.yml
Zdaj posodobite app/docker-compose.yml
datoteko.
version: '2'
services:
php:
image: vultr-php
volumes:
- ./:/app
working_dir: /app
web:
image: vultr-nginx
volumes:
- ./:/app
depends_on:
- php
ports:
- 80:80
Dodali smo samo novo storitev. Konfiguracija je skoraj enaka, razen naslednjega.
depends_on:
- php
ports:
- 80:80
Ko vsebnik Nginx potrebuje, da se storitev PHP v celoti inicializira, to zahtevo vsilimo v depends_on
opciji. ports
Ključ konfiguracija preslika vrata gostitelja na vrata posode, tu zemljevid pristanišče 80
v gostitelju do pristanišča 80
v posodi.
Zdaj ustvarite datoteko, imenovano index.php
znotraj app
mape, in vanjo vstavite naslednje.
<?php phpinfo();
Prepričajte se, da so vrata 80
dostopna prek vašega požarnega zidu in izvedite naslednje.
cd ~/docker/app
docker-compose up -d
Še enkrat preverite, ali je storitev vzpostavljena.
docker ps
Odprite brskalnik in dostopajte do [vultr-instance-ip]
. IP naslov svojega primerka Vultr lahko ugotovite tako, da zaženete naslednje.
hostname -I
Videli boste stran z informacijami o PHP.
Konfiguriranje vsebnika MySQL
Uradna slika MySQL vam omogoča, da konfigurirate vsebnik s preprostimi spremenljivkami okolja. To je mogoče storiti z environment
možnostjo znotraj definicije servisnega bloka. Posodobite ~/docker/app/docker-compose.yml
datoteko na naslednje.
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:
Zdaj smo definirali novo storitev za bazo podatkov. Bodite pozorni na črto dbdata:/var/lib/mysql
. S tem se pot na vsebniku /var/lib/mysql
priklopi na trajni nosilec, ki ga upravlja Docker, na ta način se podatki baze podatkov ohranijo tudi po odstranitvi vsebnika. Ta nosilec je treba definirati v bloku najvišje ravni, kot lahko vidite na koncu datoteke.
Preden organiziramo našo novo konfiguracijo, prenesite vzorčno bazo podatkov MySQL. Uradni MySQL dokumentacija
vsebuje nekaj vzorčnih baz podatkov. Uporabljali bomo svetovno znano bazo podatkov. Ta zbirka podatkov ponuja seznam držav in mest. Če želite prenesti ta vzorec, v naši mapi aplikacije izvedite naslednje.
curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz
Zdaj pa organiziramo naše zabojnike.
docker-compose up -d
Kot ste morda že opazili, docker-compose up
ukaz zažene samo vsebnike, ki še niso zagnani. Preverja razlike med vašo docker-compose.yml
datoteko in trenutno konfiguracijo zagnanih vsebnikov.
Še enkrat preverite, ali je bil vsebnik MySQL zagnan.
docker ps
Zdaj napolnite svetovno bazo podatkov.
docker-compose exec -T mysql mysql -uroot -proot world < world.sql
Lahko preverite, ali je bila zbirka podatkov napolnjena, tako da izberete podatke neposredno iz baze podatkov. Najprej odprite poziv MySQL znotraj vsebnika.
docker-compose exec mysql mysql -uroot -proot world
V pozivu MySQL zaženite naslednje.
select * from city limit 10;
Videli boste seznam mest. Zdaj zaprite poziv MySQL.
mysql> exit
Izdelava naše aplikacije
Zdaj, ko so vsi potrebni vsebniki pripravljeni in delujejo, se lahko osredotočimo na našo vzorčno aplikacijo. Posodobite
app/index.php
datoteko na naslednje.
<?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>
Če dostopate [vultr-instance-ip]
v spletnem brskalniku, boste videli seznam najbolj naseljenih mest na svetu. Čestitamo, namestili ste popolnoma delujočo aplikacijo PHP z uporabo dockerja.
Zaključek
V tej vadnici sem korak za korakom pokazal, kako konfigurirati popolnoma delujočo aplikacijo PHP. Zgradili smo slike po meri za PHP in Nginx ter konfigurirali docker-compose za orkestriranje naših vsebnikov. Kljub temu, da je zelo osnovna in preprosta, ta nastavitev odraža resnični življenjski scenarij.
V tem priročniku smo sestavili in označili naše slike lokalno. Za bolj prilagodljivo nastavitev lahko te slike potisnete v register Docker . Lahko pritisnete na uradni register dockerjev ali celo nastavite svoj lastni register dockerjev. V vsakem primeru vam bo to omogočilo, da svoje slike zgradite na enem gostitelju in jih uporabite na drugem.
Za podrobnejšo uporabo docker-compose
, si oglejte uradno dokumentacijo .
Glede na zahteve vaše aplikacije in okvir PHP, ki ga uporabljate, boste morda želeli dodati več razširitev. To lahko enostavno storite tako, da spremenite Dockerfile
uporabljeno za izdelavo naše slike PHP po meri. Vendar pa nekatere razširitve potrebujejo dodatne odvisnosti za namestitev v vsebnik. Za pregled osnovnih zahtev vsake razširitve si oglejte seznam razširitev v
uradni dokumentaciji PHP .